{"version":3,"sources":["../../node_modules/browser-pack/_prelude.js","../../modules/accordion/accordion.js","../../modules/addtocalendar/addtocalendar.js","../../modules/all-properties-map/all-properties-map.js","../../modules/card-filters/card-filters.js","../../modules/card-tabs/card-tabs.js","../../modules/carousel/carousel.js","../../modules/cart/cart.js","../../modules/concierge/concierge.js","../../modules/contact-info/contact-info.js","../../modules/custom-filters/custom-filters.js","../../modules/date-picker/date-picker.js","../../modules/directory/directory.js","../../modules/event-filter/event-filter.js","../../modules/exp/exp.js","../../modules/favorite-row/favorite-row.js","../../modules/fields/fields.js","../../modules/filters/filters.js","../../modules/form/form.js","../../modules/gravity-form/gravity-form.js","../../modules/header/header.js","../../modules/hero-image/hero-image.js","../../modules/hero-slider/hero-slider.js","../../modules/load-more-posts/load-more-posts.js","../../modules/load-more/load-more.js","../../modules/modal/modal.js","../../modules/movie-list/movie-list.js","../../modules/palisades-anchor/palisades-anchor.js","../../modules/palisades-carousel/palisades-carousel.js","../../modules/palisades-form/palisades-form.js","../../modules/palisades-hero/palisades-hero.js","../../modules/palisades-intro/palisades-intro.js","../../modules/palisades-units/palisades-units.js","../../modules/promo-popup/promo-popup.js","../../modules/queue/queue.js","../../modules/reserve/reserve.js","../../modules/restaurant-card-list/restaurant-card-list.js","../../modules/rewards-form/rewards-form.js","../../modules/rsvp/rsvp.js","../../modules/search-form/search-form.js","../../modules/search-results/search-results.js","../../modules/select-field/select-field.js","../../modules/sidebar/sidebar.js","../../modules/subscribe/subscribe.js","../../modules/timer/timer.js","../../modules/truncate/truncate.js","../../modules/two-up-rows/two-up-rows.js","../../modules/video-background/video-background.js","../../modules/video/video.js","../../modules/visit-carousel/visit-carousel.js","../../node_modules/desandro-matches-selector/matches-selector.js","../../node_modules/ev-emitter/ev-emitter.js","../../node_modules/fizzy-ui-utils/utils.js","../../node_modules/flickity-as-nav-for/as-nav-for.js","../../node_modules/flickity/js/add-remove-cell.js","../../node_modules/flickity/js/animate.js","../../node_modules/flickity/js/cell.js","../../node_modules/flickity/js/drag.js","../../node_modules/flickity/js/flickity.js","../../node_modules/flickity/js/index.js","../../node_modules/flickity/js/lazyload.js","../../node_modules/flickity/js/page-dots.js","../../node_modules/flickity/js/player.js","../../node_modules/flickity/js/prev-next-button.js","../../node_modules/flickity/js/slide.js","../../node_modules/get-size/get-size.js","../../node_modules/lodash.throttle/index.js","../../node_modules/shave/dist/shave.js","../../node_modules/svg-pan-zoom/src/browserify.js","../../node_modules/svg-pan-zoom/src/control-icons.js","../../node_modules/svg-pan-zoom/src/shadow-viewport.js","../../node_modules/svg-pan-zoom/src/svg-pan-zoom.js","../../node_modules/svg-pan-zoom/src/svg-utilities.js","../../node_modules/svg-pan-zoom/src/uniwheel.js","../../node_modules/svg-pan-zoom/src/utilities.js","../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","../../node_modules/unidragger/unidragger.js","../../node_modules/unipointer/unipointer.js","../../src/js/lib/init-modules.js","../../src/js/main.js"],"names":["Accordion","el","$","find","on","$parent","this","parent","$button","slideToggle","toggleClass","hasClass","attr","window","global","module","exports","AddToCalendar","t","activeClass","list","querySelector","toggle","link","querySelectorAll","addEventListener","activeEl","document","activeElement","documentElement","classList","console","log","parentNode","e","target","contains","remove","tabIndex","timeout","openPopup","clearTimeout","add","closePopup","setTimeout","relatedTarget","forEach","Map","$el","$pins","id","filter","type","CardFilters","selectFieldEl","selectFieldElMobile","selectFieldElCurrent","filterEl","selectComponent","SelectField","filtersComponent","Filters","innerHTML","selectedIndex","filterByValue","value","onChange","bind","require","CardTabs","cards","Array","prototype","slice","call","$mobileFilter","$currentFilter","$items","firstItem","val","text","selectedFilter","addClass","removeClass","elem","event","screen","width","preventDefault","Carousel","slider","childElementCount","Flickity","cellAlign","contain","adaptiveHeight","prevNextButtons","pageDots","setGallerySize","autoPlay","form","closest","submit","Concierge","start","getAttribute","end","closeButton","init","closeModal","load","insertAfter","first","throttle","offsetTop","innerHeight","offset","pageYOffset","ContactInfo","mapContainer","mapLat","mapLng","styles","featureType","elementType","stylers","visibility","mapProp","center","google","maps","LatLng","zoom","mapTypeControl","map","setOptions","Marker","position","$posts","children","$maps","$cards","$activeItemsCount","length","$activePost","$activeMap","$activeCard","activeFilter","filterPost","filterMap","filterCard","trigger","count","split","singleValue","$newPosts","$newMap","$newCard","formatDate","date","getMonth","getDate","getFullYear","DatePicker","settings","isOpen","isEventsBound","dayEl","Date","parseInt","TIMESTAMP_DATA","isDayOfWeek","dateObject","arrayOfWeekdays","indexOf","getDay","filterDates","context","dateClose","days","DAY_SELECTOR","DAY_CLASS","TinyDatePicker","NEXT_CLASS","PREV_CLASS","defaultSettings","format","toLocaleDateString","mode","min","lang","today","clear","close","onOpen","onSelectYear","onSelectMonth","disabled","parse","str","replace","isNaN","onOpenCallback","extend","datepicker","focus","key","which","keyCode","stopPropagation","open","current","selected","customPlaceHolder","placeholderEl","next","after","parentElement","removeChild","undefined","onClose","alreadyInit","getSelectedDate","selectedDate","Directory","panzoom","options","zoomEnabled","fit","controlIconsEnabled","minZoom","maxZoom","beforePan","oldPan","newPan","currentZoom","getZoom","x","y","sizes","getSizes","rightLimit","bottomLimit","height","Math","max","getBoundingClientRect","style","svgPanZoom","zoomInButton","zoomOutButton","zoomIn","zoomOut","getPoint","pt","createSVGPoint","matrixTransform","getScreenCTM","inverse","keyboardHandlers","panBy","pz","svgIDs","item","push","svgGroups","group","setAttribute","getMonthName","EventFilter","dateLabel","currentPage","calendarTrigger","calendarToggle","calendar","month","getUTCMonth","day","returnDate","location","href","checkFilterDate","url","clickOutside","Exp","FavoriteRow","wrapAround","arrowShape","x0","x1","y1","x2","y2","x3","Fields","formSelects","formListSelect","markupSelect","formNativeSelect","formOptionsSelect","formPlaceholder","placeholderField","i","outerHTML","mobile","getUrlParameter","name","regex","RegExp","results","exec","decodeURIComponent","category","$filters","$active","itemSelector","data","$subFilters","$category","selectFilter","eq","$target","$newTargets","revertDate","selectAll","selector","disableButton","button","DISABLE_CLASS","enableButton","Form","datePickers","forms","buttons","areFormsEnabled","reserveChangeCheckbox","rewardsFormSubmit","checkbox","checked","args","setSeconds","getSeconds","getTimezoneOffset","unavailable","inRange","dt","GravityForm","$gform_upload_custom","$description_elm","$rules_text_elm","hide","append","Header","headerHeight","$document","$body","$html","$main","$menu","$toggle","$menuItems","$allMenuItems","$activeMenuItems","$searchIcon","$searchCloseIcon","$window","onTop","$link","siblings","$this","hash","substring","openSubmenu","closeSubmenu","each","$index","$item","toggleSubmenu","last","is","has","$page","smoothScroll","element","getElementById","scrollIntoView","top","parseFloat","css","animate","scrollTop","toggleFixedHeader","condition","HeroImage","HeroSlider","slides","videos","flickity","resize","ready","sideLinks","viewport","sideSelectedLink","dots","dot","createElement","buttonText","replaceAll","className","removeAttribute","appendChild","click","change","index","setHeights","playVideo","removeAttr","reset","cell","maxCellHeight","innerWidth","play","video","pause","LoadMorePosts","pageNumber","$loadMoreButton","$excludePost","$list","loadPosts","wp","ajax","dataType","ajaxUrl","excludePost","action","success","html","fadeIn","hasNextPage","error","LoadMore","filterClass","$allItems","update","showItems","PER_PAGE","$nextElement","prevObject","not","fadeOut","Modal","triggerSelector","MovieList","$size","size","$start","$loadMore","currentSlide","ceil","slideBreakpoint","groupCells","prevButton","insertBefore","select","PalisadesAnchor","headerMenuHeight","$anchorItems","Sticky","addEvents","onScroll","aboveScroll","scrollY","setFixed","setStatic","PalisadesCarousel","carouselEl","carouselNavEl","carouselButton","imagesLoaded","asNavFor","draggable","PalisadesForm","PalisadesHero","scrollEl","$nextSection","PalisadesIntro","videoButtons","modals","buttonsClose","overlaysClose","openModal","PalisadesUnits","unitsNavEl","unitItemCarouselEl","unitsButtons","unitsPrevButton","unitsNextButton","unitItemActiveClass","navSlider","currentSelectedCarouselSelector","previous","PromoPopup","SHOW_POPUP","POPUP_OPEN_TIME","checkPopupClosed","localStorage","getItem","closePromoPopup","setItem","now","visibleTime","dataLayer","promo_popup_visible_time","popupOverlayElm","buttonClosePopup","email","res","result","first_name","last_name","wait_time","xhr","JSON","responseText","$queueModal","message","async","Reserve","dateOpen","dataInterval","input","HOUR_IN_MINS","generateTimeList","selectEls","selectEl","timeSelectComponent","updateTimePicker","datePicker","changeTimeRange","time","timeStart","convertTime","timeEnd","intervals","timeRange","getTimeRange","items","string","arr","parseTime","number","hour","floor","minute","interval","range","getMatchingTimeRange","dayIndex","generateSelectFieldDropdown","generateSelectFieldNative","desktopList","mobileList","timeField","selectFirstItem","RestaurantCardList","RewardsRegister","dateField","timeSelect","timeFieldSelect","timeFieldName","populateTimeField","Object","keys","slots","slot","generateFieldData","generateBlankFields","markup","populateMobileFields","populateDesktopFields","destroy","fieldMobile","opt","textContent","required","RSVP","body","content","activeButton","overlay","SearchForm","$closeIcon","$input","SearchResults","resultsEmpty","resultsList","buttonDidYouMean","searchBottom","searchHeader","searchFavoriteGroup","cardSimple","search_message","show","fieldDesktop","fieldCurrent","isRedirect","onClickActive","isActive","activeItem","onSelectDesktop","removeSelectActive","callback","onSelectMobile","currentItem","onClickOutside","hasAttribute","$activeItem","$prevItem","$nextItem","$dropdown","apply","prev","outerHeight","dropdownItems","activeState","selectDesktop","selectMobile","keyboardAccessible","getName","selectedItem","otherItem","removeEventListener","off","Sidebar","URL","searchParams","get","main","Subscribe","formEl","msgEl","inputEmail","inputFirstName","inputLastName","thankYouPage","dataset","validity","typeMismatch","valueMissing","reportValidity","headers","Content-Type","contentType","serialize","code","Timer","$timer","TIMER_SELECTOR","expire","setInterval","remaining","seconds","minutes","clearInterval","Truncate","maxHeight","shave","TwoUpRows","inViewPort","rect","VideoBackground","YoutubeVideo","BREAK_POINT","contentWindow","postMessage","Video","$video","$modal","$iconClose","$overlayClose","$videoInner","VisitCarousel","factory","define","amd","matchesSelector","matchesMethod","ElemProto","Element","matches","prefixes","prefix","method","EvEmitter","proto","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","splice","emitEvent","onceListeners","allOff","fizzyUIUtils","utils","a","b","prop","modulo","num","div","arraySlice","makeArray","obj","isArray","removeFrom","ary","getParent","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","arguments","_this","docReady","readyState","toDashed","match","$1","$2","toLowerCase","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","jQuery","instance","lerp","createMethods","_createAsNavFor","activateAsNavFor","deactivateAsNavFor","destroyAsNavFor","asNavForOption","setNavCompanion","companion","navCompanion","onNavCompanionSelect","navCompanionSelect","onNavStaticClick","isInstant","selectedCell","selectedCells","firstIndex","cells","lastIndex","selectIndex","selectCell","removeNavSelectedElements","navSelectedElements","changeNavSelectedClass","navElem","pointer","cellElement","cellIndex","getCellsFragment","fragment","createDocumentFragment","insert","_makeCells","len","isAppend","insertCellElement","endCells","_sizeCells","cellChange","prepend","getCells","minCellIndex","cellSizeChange","getCell","getSize","changedCellIndex","isPositioningSlider","prevSelectedElem","selectedElement","_positionCells","_getWrapShiftCells","getCellSlideIndex","positionSliderAtSelected","animatePrototype","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","slideableWidth","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","getPositionValue","transform","firstSlide","positionX","progress","slidesWidth","dispatchEvent","selectedSlide","velocity","percentPosition","round","isPointerDown","isFreeScrolling","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","shift","cellShift","wrapShift","outerWidth","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragVelocity","dragX","dragForce","distance","selectedAttraction","Cell","create","unselect","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","Unidragger","getScrollPosition","pageXOffset","defaults","dragThreshold","_touchActionValue","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","handles","bindHandles","unbindHandles","bindDrag","unbindDrag","pointerDown","_pointerDownDefault","okayPointerDown","_pointerDownPreventDefault","pointerDownFocus","pointerDownBlur","pointerDownScroll","pointerDownPointer","pageX","pageY","_bindPostStartEvents","focusNodes","INPUT","TEXTAREA","SELECT","nodeName","isTouchStart","isTouchPointer","pointerType","isFocusNode","hasDragStarted","moveVector","abs","pointerUp","isTouchScrolling","_dragPointerUp","pointerDone","dragStart","dragStartPosition","pointerMove","_dragPointerMove","_dragMove","dragMove","previousDragX","direction","originBound","endBound","getLastSlide","dragMoveTime","dragEnd","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","isDragSelect","getSlideDistance","positiveResting","_getClosestResting","negativeResting","increment","minDistance","Infinity","d","md","isWrapAround","slideIndex","slide","wrap","delta","staticClick","clickedCell","getParentCell","cellElem","onscroll","scroll","scrollMoveX","scrollMoveY","_pointerDone","Slide","_Flickity","moveElements","toElem","queryElement","flickityGUID","instances","option","$element","constructor","_create","getComputedStyle","GUID","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","guid","_createSlider","watchCSS","activate","opts","_filterFindCellElements","reloadCells","selectInitialIndex","isInitActivated","cellSelector","positionCells","getLastCell","cellX","startCell","updateSlides","_containSlides","isOriginLeft","nextMargin","canCellFit","_getCanCellFit","addCell","slideWidth","firstMargin","updateSelectedSlide","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","left","right","shorthand","gapX","_getGapCells","isRightToLeft","beginMargin","endMargin","contentWidth","isContentSmaller","beginBound","emitArgs","$event","jQEvent","Event","isWrap","_wrapSelect","prevIndex","wrapIndex","backWrapDelta","forewardWrapDelta","unselectSelectedSlide","selectedElements","getCellElements","initialIndex","queryCell","getAdjacentCellElements","adjCount","cellElems","uiChange","childUIPointerDown","onresize","deactivate","onkeydown","isNotFocused","handler","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","scrollTo","removeData","bridget","setJQuery","jq","getCellLazyImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","LazyLoader","img","_createLazyload","lazyLoad","lazyImages","lazyCellImages","src","srcset","onload","complete","onerror","Unipointer","PageDots","holder","handleClick","onClick","setDots","bindStartEvent","unbindStartEvent","addDots","removeDots","newDots","updateSelected","selectedDot","onTap","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","hidden","tick","stop","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","PrevNextButton","getArrowMovements","shape","svgURI","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","createElementNS","path","pathMovements","onclick","enable","boundIndex","_createPrevNextButtons","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","lastCell","lastMargin","getStyleSize","noop","getZeroSize","measurementsLength","measurements","getStyle","logError","setup","isSetup","padding","borderStyle","borderWidth","boxSizing","isBoxSizeOuter","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","debounce","func","wait","invokeFunc","lastArgs","thisArg","lastThis","lastInvokeTime","leadingEdge","timerId","timerExpired","leading","remainingWait","timeSinceLastCall","lastCallTime","timeSinceLastInvoke","maxing","nativeMin","maxWait","shouldInvoke","trailingEdge","trailing","cancel","flush","debounced","isInvoking","TypeError","FUNC_ERROR_TEXT","toNumber","isObject","nativeMax","isObjectLike","isSymbol","objectToString","symbolTag","NAN","other","valueOf","reTrim","isBinary","reIsBinary","test","reIsOctal","freeParseInt","reIsBadHex","freeGlobal","freeSelf","self","root","Function","objectProto","toString","Error","els","character","classname","spaces","charHtml","span","textProp","fullText","words","heightStyle","maxHeightStyle","pivot","join","insertAdjacentHTML","diff","shavedText","createTextNode","elWithShavedText","insertAdjacentElement","SvgPanZoom","SvgUtils","defs","svgNS","zoomGroup","_createZoomIn","_createZoomReset","_createZoomOut","controlIcons","getPublicInstance","zoomInBackground","zoomInShape","resetPanZoomControl","resetPanZoomControlBackground","resetPanZoomControlShape1","resetPanZoomControlShape2","zoomOutBackground","zoomOutShape","Utils","ShadowViewport","originalState","updateCTMCached","proxy","updateCTM","createRequestAnimationFrame","refreshRate","viewBox","cacheViewBox","newCTM","processCTM","setCTM","svgViewBox","viewBoxValues","v","updateCTMOnNextFrame","simpleViewBoxCache","bBox","getBBox","getViewBox","getCTM","newScale","f","offsetX","offsetY","getOriginalState","getState","getRelativeZoom","computeRelativeZoom","scale","getPan","safeCTM","createSVGMatrix","c","willZoom","isZoomDifferent","willPan","isPanDifferent","beforeZoom","updateCache","onZoom","preventPan","preventPanX","preventPanY","isNumber","onPan","pendingUpdate","ctm","onUpdatedCTM","Wheel","ControlIcons","optionsDefaults","viewportSelector","panEnabled","dblClickZoomEnabled","mouseWheelZoomEnabled","preventMouseEventsDefault","zoomScaleSensitivity","customEventsHandler","eventsListenerElement","passiveListenerOption","passive","that","setupSvgAttributes","boundingClientRectNormalized","getBoundingClientRectNormalized","getOrCreateViewport","oldScale","oldPoint","newPoint","point","publicInstance","setBeforeZoom","setOnZoom","setBeforePan","setOnPan","setOnUpdatedCTM","lastMouseWheelEventTime","setupHandlers","prevEvt","eventListeners","mousedown","evt","handleMouseDown","touchstart","mouseup","handleMouseUp","touchend","mousemove","handleMouseMove","touchmove","mouseleave","touchleave","touchcancel","svgElement","haltEventListeners","hasOwnProperty","enableMouseWheelZoom","wheelListener","handleMouseWheel","isPassiveListener","disableMouseWheelZoom","returnValue","deltaY","timeDelta","divider","deltaMode","wheelDelta","inversedScreenCTM","relativeMousePoint","getEventPoint","pow","zoomAtPoint","zoomScale","zoomAbsolute","oldCTM","relativePoint","modifier","translate","multiply","absolute","getSvgCenterPoint","publicZoom","computeFromRelativeZoom","publicZoomAtPoint","getType","resetZoom","resetPan","pan","handleDblClick","zoomFactor","shiftKey","mouseAndTouchNormalize","isDblClick","firstEventCTM","stateOrigin","viewportCTM","updateBBox","disableControlIcons","enableControlIcons","instancesStore","pi","enablePan","disablePan","isPanEnabled","fn","enableZoom","disableZoom","isZoomEnabled","isControlIconsEnabled","enableDblClickZoom","disableDblClickZoom","isDblClickZoomEnabled","isMouseWheelZoomEnabled","setZoomScaleSensitivity","setMinZoom","setMaxZoom","zoomBy","zoomAtPointBy","realZoom","elementOrSelector","getSvg","_browser","documentMode","xmlNS","xmlnsNS","xlinkNS","evNS","clientWidth","clientHeight","isElement","childNodes","viewportId","toISOString","svgChildren","classNames","setAttributeNS","internetExplorerRedisplayInterval","refreshDefsGlobal","allDefs","allDefsCount","thisDefs","matrix","s","clientX","clientY","createCallback","originalEvent","srcElement","deltaX","delatZ","support","wheelDeltaX","detail","fns","getCallback","removeCallback","_addWheelListener","cb","_addEventListener","activeListenerOption","_removeWheelListener","_removeEventListener","addWheelListener","removeWheelListener","onmousewheel","requestTimeout","source","o","SVGElement","SVGSVGElement","n","isFinite","String","tagName","contentDocument","getSVGDocument","touches","timeStampDiff","timeStamp","touchesDistance","sqrt","getTime","later","setHours","datesEq","date1","date2","toDateString","shiftDay","setDate","shiftMonth","dayOfMonth","setMonth","shiftYear","setFullYear","setYear","year","dateOrParse","dropTime","constrainDate","bufferFn","ms","cp","o1","o2","DatePickerOptions","english","makeInRangeFn","hilightedDate","dateClass","dp","render","dayNames","dayOffset","hilightedMonth","months","mapDays","isNotInMonth","isDisabled","isToday","keyDown","shiftBy","Key","up","down","esc","setState","selectToday","showMonthPicker","view","showYearPicker","gotoNextMonth","gotoPrevMonth","selectDay","currentDate","iter","onChooseMonth","render$1","currentMonth","keyDown$1","render$2","currentYear","selectedYear","mapYears","onChooseYear","keyDown$2","shiftedYear","BaseMode","emit","detatchInputEvents","closing","shouldFocusOnBlur","shouldFocusOnRender","updateInput","adjustPosition","containerHTML","attachToDom","CustomEvent","bubbles","simulated","computeSelectedDate","currentView","views","createContainerElement","attachContainerEvents","isVisible","hasFocus","focused","shouldHide","becauseOfBlur","focusInput","firstChild","hadFocus","focusCurrent","attachInputEvents","bufferShow","calEl","ontouchstart","enter","onKeyDown","navigator","userAgent","MSStream","blur","ModalMode","readonly","DropdownMode","defineProperty","autoPosition","inputPos","win","adjustCalY","adjustCalX","cal","scrollLeft","inputLeft","maxRight","calRight","shiftedLeft","inputTop","calHeight","belowTop","aboveTop","isAbove","PermanentMode","Mode","Emitter","onOne","handlers","onMany","arg","h","emitter","me","params","cancelable","createEvent","initCustomEvent","dayPicker","dp-day","dp-next","dp-prev","dp-today","dp-clear","dp-close","dp-cal-month","dp-cal-year","monthPicker","dp-month","yearPicker","dp-year","_bindHandles","isAdd","bindMethod","touchAction","handle","_bindStartEvent","PointerEvent","cursorNodes","OPTION","clickTypes","radio","image","file","isCursorNode","isClickType","isOkay","_pointerReset","isDragging","_dragStart","_dragEnd","_staticClick","isPreventingClicks","isIgnoringMouseUp","getPointerPoint","startEvent","getTouch","touch","identifier","pointerIdentifier","onmousedown","_pointerDown","changedTouches","onpointerdown","pointerId","postStartEvents","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","onmouseup","_pointerUp","onpointerup","ontouchend","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","initializeModules","modules","Module","mod"],"mappings":"AAAA;CkDQE,SAAUa,EAAQ8pB,GAElB,YAEsB,mBAAVC,SAAwBA,OAAOC,IAEzCD,OAAQD,GACmB,gBAAV5pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,IAGjB9pB,EAAOiqB,gBAAkBH,KAG1B9pB,OAAQ,WACT,YAEA,IAAIkqB,GAAgB,WAClB,GAAIC,GAAYnqB,OAAOoqB,QAAQzmB,SAE/B,IAAKwmB,EAAUE,QACb,MAAO,SAGT,IAAKF,EAAUF,gBACb,MAAO,iBAKT,KAAM,GAFFK,IAAa,SAAU,MAAO,KAAM,KAE9BrY,EAAE,EAAGA,EAAIqY,EAASpiB,OAAQ+J,IAAM,CACxC,GAAIsY,GAASD,EAASrY,GAClBuY,EAASD,EAAS,iBACtB,IAAKJ,EAAWK,GACd,MAAOA,MAKb,OAAO,UAA0BjmB,EAAMiP,GACrC,MAAOjP,GAAM2lB,GAAiB1W;;CCzChC,SAAUvT,EAAQ6pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,OAAQD,GACmB,gBAAV5pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,IAGjB7pB,EAAOwqB,UAAYX,KAGH,mBAAV9pB,QAAwBA,OAASP,KAAM,WAEjD,YAEA,SAASgrB,MAET,GAAIC,GAAQD,EAAU9mB,SAiFtB,OA/EA+mB,GAAMnrB,GAAK,SAAUorB,EAAWC,GAC9B,GAAMD,GAAcC,EAApB,CAIA,GAAIC,GAASprB,KAAKqrB,QAAUrrB,KAAKqrB,YAE7BC,EAAYF,EAAQF,GAAcE,EAAQF,MAM9C,QAJuC,GAAlCI,EAAU9gB,QAAS2gB,IACtBG,EAAUpb,KAAMib,GAGXnrB,OAGTirB,EAAMM,KAAO,SAAUL,EAAWC,GAChC,GAAMD,GAAcC,EAApB,CAIAnrB,KAAKF,GAAIorB,EAAWC,EAGpB,IAAIK,GAAaxrB,KAAKyrB,YAAczrB,KAAKyrB,eAMzC,QAJoBD,EAAYN,GAAcM,EAAYN,QAE3CC,IAAa,EAErBnrB,OAGTirB,EAAM9D,IAAM,SAAU+D,EAAWC,GAC/B,GAAIG,GAAYtrB,KAAKqrB,SAAWrrB,KAAKqrB,QAASH,EAC9C,IAAMI,GAAcA,EAAU7iB,OAA9B,CAGA,GAAI8Q,GAAQ+R,EAAU9gB,QAAS2gB,EAK/B,QAJe,GAAV5R,GACH+R,EAAUI,OAAQnS,EAAO,GAGpBvZ,OAGTirB,EAAMU,UAAY,SAAUT,EAAWrW,GACrC,GAAIyW,GAAYtrB,KAAKqrB,SAAWrrB,KAAKqrB,QAASH,EAC9C,IAAMI,GAAcA,EAAU7iB,OAA9B,CAIA6iB,EAAYA,EAAUnnB,MAAM,GAC5B0Q,EAAOA,KAIP,KAAM,GAFF+W,GAAgB5rB,KAAKyrB,aAAezrB,KAAKyrB,YAAaP,GAEhD1Y,EAAE,EAAGA,EAAI8Y,EAAU7iB,OAAQ+J,IAAM,CACzC,GAAI2Y,GAAWG,EAAU9Y,EACZoZ,IAAiBA,EAAeT,KAI3CnrB,KAAKmnB,IAAK+D,EAAWC,SAEdS,GAAeT,IAGxBA,EAAS5E,MAAOvmB,KAAM6U,GAGxB,MAAO7U,QAGTirB,EAAMY,OAAS,iBACN7rB,MAAKqrB,cACLrrB,MAAKyrB,aAGPT;;CCtGL,SAAUzqB,EAAQ8pB,GAII,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,8CACC,SAAUE,GACX,MAAOH,GAAS9pB,EAAQiqB,KAEC,gBAAV/pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,8BAIVvD,EAAOurB,aAAezB,EACpB9pB,EACAA,EAAOiqB,kBAIVjqB,OAAQ,SAAkBA,EAAQiqB,GAErC,YAEA,IAAIuB,KAKJA,GAAM1f,OAAS,SAAU2f,EAAGC,GAC1B,IAAM,GAAIC,KAAQD,GAChBD,EAAGE,GAASD,EAAGC,EAEjB,OAAOF,IAKTD,EAAMI,OAAS,SAAUC,EAAKC,GAC5B,OAAWD,EAAMC,EAAQA,GAAQA,EAKnC,IAAIC,GAAaroB,MAAMC,UAAUC,KAGjC4nB,GAAMQ,UAAY,SAAUC,GAC1B,MAAKvoB,OAAMwoB,QAASD,GAEXA,EAGI,OAARA,OAAwBnf,KAARmf,KAIW,gBAAPA,IAAwC,gBAAdA,GAAI/jB,OAG9C6jB,EAAWloB,KAAMooB,IAIjBA,IAKXT,EAAMW,WAAa,SAAUC,EAAKH,GAChC,GAAIjT,GAAQoT,EAAIniB,QAASgiB,IACV,GAAVjT,GACHoT,EAAIjB,OAAQnS,EAAO,IAMvBwS,EAAMa,UAAY,SAAU9nB,EAAMiP,GAChC,KAAQjP,EAAKnD,YAAcmD,GAAQzD,SAASgjB,MAE1C,GADAvf,EAAOA,EAAKnD,WACP6oB,EAAiB1lB,EAAMiP,GAC1B,MAAOjP,IAQbinB,EAAMc,gBAAkB,SAAU/nB,GAChC,MAAoB,gBAARA,GACHzD,SAASN,cAAe+D,GAE1BA,GAMTinB,EAAMe,YAAc,SAAU/nB,GAC5B,GAAIgmB,GAAS,KAAOhmB,EAAMjC,IACrB9C,MAAM+qB,IACT/qB,KAAM+qB,GAAUhmB,IAMpBgnB,EAAMgB,mBAAqB,SAAUC,EAAOjZ,GAE1CiZ,EAAQjB,EAAMQ,UAAWS,EACzB,IAAIC,KAyBJ,OAvBAD,GAAMxqB,QAAS,SAAUsC,GAEvB,GAAQA,YAAgBooB,aAAxB,CAIA,IAAMnZ,EAEJ,WADAkZ,GAAQ/c,KAAMpL,EAKX0lB,GAAiB1lB,EAAMiP,IAC1BkZ,EAAQ/c,KAAMpL,EAKhB,KAAM,GAFFqoB,GAAaroB,EAAK5D,iBAAkB6S,GAE9BvB,EAAE,EAAGA,EAAI2a,EAAW1kB,OAAQ+J,IACpCya,EAAQ/c,KAAMid,EAAW3a,OAItBya,GAKTlB,EAAMqB,eAAiB,SAAUC,EAAQC,EAAYC,GACnDA,EAAYA,GAAa,GAEzB,IAAIxC,GAASsC,EAAOnpB,UAAWopB,GAC3BE,EAAcF,EAAa,SAE/BD,GAAOnpB,UAAWopB,GAAe,WAC/B,GAAIrrB,GAAUjC,KAAMwtB,EACpBrrB,cAAcF,EAEd,IAAI4S,GAAO4Y,UACPC,EAAQ1tB,IACZA,MAAMwtB,GAAgBlrB,WAAY,WAChCyoB,EAAOxE,MAAOmH,EAAO7Y,SACd6Y,GAAOF,IACbD,KAMPxB,EAAM4B,SAAW,SAAU7H,GACzB,GAAI8H,GAAavsB,SAASusB,UACP,aAAdA,GAA0C,eAAdA,EAE/BtrB,WAAYwjB,GAEZzkB,SAASF,iBAAkB,mBAAoB2kB,IAOnDiG,EAAM8B,SAAW,SAAU5hB,GACzB,MAAOA,GAAIC,QAAS,cAAe,SAAU4hB,EAAOC,EAAIC,GACtD,MAAOD,GAAK,IAAMC,IACjBC,cAGL,IAAIxsB,GAAUlB,EAAOkB,OA4CrB,OAtCAsqB,GAAMmC,SAAW,SAAUC,EAAaC,GACtCrC,EAAM4B,SAAU,WACd,GAAIU,GAAkBtC,EAAM8B,SAAUO,GAClCE,EAAW,QAAUD,EACrBE,EAAgBltB,SAASH,iBAAkB,IAAMotB,EAAW,KAC5DE,EAAcntB,SAASH,iBAAkB,OAASmtB,GAClDrB,EAAQjB,EAAMQ,UAAWgC,GAC1BE,OAAQ1C,EAAMQ,UAAWiC,IACxBE,EAAkBJ,EAAW,WAC7BK,EAASpuB,EAAOouB,MAEpB3B,GAAMxqB,QAAS,SAAUsC,GACvB,GAEI8I,GAFAtN,EAAOwE,EAAKqB,aAAcmoB,IAC5BxpB,EAAKqB,aAAcuoB,EAErB,KACE9gB,EAAUtN,GAAQ+f,KAAKrU,MAAO1L,GAC9B,MAAQ4a,GAMR,YAJKzZ,GACHA,EAAQyZ,MAAO,iBAAmBoT,EAAW,OAASxpB,EAAKoU,UAC3D,KAAOgC,IAKX,GAAI0T,GAAW,GAAIT,GAAarpB,EAAM8I,EAEjC+gB,IACHA,EAAOrb,KAAMxO,EAAMspB,EAAWQ,QAS/B7C;;CCvOL,SAAUxrB,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,oBACA,wBACCD,GACwB,gBAAV5pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACfvmB,QAAQ,YACRA,QAAQ,mBAIVvD,EAAO+E,SAAW+kB,EAChB9pB,EAAO+E,SACP/E,EAAOurB,eAIVvrB,OAAQ,SAAkB+E,EAAUymB,GAEvC,YAwEA,SAAS8C,GAAM7C,EAAGC,EAAGrrB,GACnB,OAASqrB,EAAID,GAAMprB,EAAIorB,EAnEzB1mB,EAASwpB,cAAc5e,KAAK,kBAE5B,IAAI+a,GAAQ3lB,EAASpB,SA2GrB,OAzGA+mB,GAAM8D,gBAAkB,WACtB/uB,KAAKF,GAAI,WAAYE,KAAKgvB,kBAC1BhvB,KAAKF,GAAI,aAAcE,KAAKivB,oBAC5BjvB,KAAKF,GAAI,UAAWE,KAAKkvB,gBAEzB,IAAIC,GAAiBnvB,KAAK4N,QAAQ8P,QAClC,IAAMyR,EAAN,CAIA,GAAIzB,GAAQ1tB,IACZsC,YAAY,WACVorB,EAAM0B,gBAAiBD,OAI3BlE,EAAMmE,gBAAkB,SAAUtqB,GAChCA,EAAOinB,EAAMc,gBAAiB/nB,EAC9B,IAAIuqB,GAAY/pB,EAASgO,KAAMxO,EAE/B,IAAMuqB,GAAaA,GAAarvB,KAAhC,CAIAA,KAAKsvB,aAAeD,CAEpB,IAAI3B,GAAQ1tB,IACZA,MAAKuvB,qBAAuB,WAC1B7B,EAAM8B,sBAERH,EAAUvvB,GAAI,SAAUE,KAAKuvB,sBAE7BvvB,KAAKF,GAAI,cAAeE,KAAKyvB,kBAE7BzvB,KAAKwvB,oBAAoB,KAG3BvE,EAAMuE,mBAAqB,SAAUE,GACnC,GAAM1vB,KAAKsvB,aAAX,CAIA,GAAIK,GAAe3vB,KAAKsvB,aAAaM,cAAc,GAC/CC,EAAa7vB,KAAKsvB,aAAaQ,MAAMtlB,QAASmlB,GAC9CI,EAAYF,EAAa7vB,KAAKsvB,aAAaM,cAAcnnB,OAAS,EAClEunB,EAAclhB,KAAKqT,MAAO0M,EAAMgB,EAAYE,EAC9C/vB,KAAKsvB,aAAa/pB,WAKpB,IAJAvF,KAAKiwB,WAAYD,GAAa,EAAON,GAErC1vB,KAAKkwB,8BAEAF,GAAehwB,KAAK8vB,MAAMrnB,QAA/B,CAIA,GAAImnB,GAAgB5vB,KAAK8vB,MAAM3rB,MAAO0rB,EAAYE,EAAY,EAC9D/vB,MAAKmwB,oBAAsBP,EAAc5nB,IAAK,SAAU4R,GACtD,MAAOA,GAAKnC,UAEdzX,KAAKowB,uBAAuB,UAO9BnF,EAAMmF,uBAAyB,SAAUrF,GACvC/qB,KAAKmwB,oBAAoB3tB,QAAS,SAAU6tB,GAC1CA,EAAQ7uB,UAAWupB,GAAS,sBAIhCE,EAAM+D,iBAAmB,WACvBhvB,KAAKwvB,oBAAoB,IAG3BvE,EAAMiF,0BAA4B,WAC1BlwB,KAAKmwB,sBAGXnwB,KAAKowB,uBAAuB,gBACrBpwB,MAAKmwB,sBAGdlF,EAAMwE,iBAAmB,SAAU1qB,EAAOurB,EAASC,EAAaC,GACrC,gBAAbA,IACVxwB,KAAKsvB,aAAaW,WAAYO,IAIlCvF,EAAMgE,mBAAqB,WACzBjvB,KAAKkwB,6BAGPjF,EAAMiE,gBAAkB,WAChBlvB,KAAKsvB,eAGXtvB,KAAKsvB,aAAanI,IAAK,SAAUnnB,KAAKuvB,sBACtCvvB,KAAKmnB,IAAK,cAAennB,KAAKyvB,wBACvBzvB,MAAKsvB,eAKPhqB;;CClJL,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,wBACC,SAAUhlB,EAAUymB,GACrB,MAAO1B,GAAS9pB,EAAQ+E,EAAUymB,KAET,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,mBAIVumB,EACE9pB,EACAA,EAAO+E,SACP/E,EAAOurB,eAIVvrB,OAAQ,SAAkBA,EAAQ+E,EAAUymB,GAE/C,YAGA,SAAS0E,GAAkBX,GACzB,GAAIY,GAAWrvB,SAASsvB,wBAIxB,OAHAb,GAAMttB,QAAS,SAAUoX,GACvB8W,EAAStX,YAAaQ,EAAKnC,WAEtBiZ,EAKT,GAAIzF,GAAQ3lB,EAASpB,SAmHrB,OA5GA+mB,GAAM2F,OAAS,SAAU5D,EAAOzT,GAC9B,GAAIuW,GAAQ9vB,KAAK6wB,WAAY7D,EAC7B,IAAM8C,GAAUA,EAAMrnB,OAAtB,CAGA,GAAIqoB,GAAM9wB,KAAK8vB,MAAMrnB,MAErB8Q,OAAkBlM,KAAVkM,EAAsBuX,EAAMvX,CAEpC,IAAImX,GAAWD,EAAkBX,GAE7BiB,EAAWxX,GAASuX,CACxB,IAAKC,EACH/wB,KAAKoF,OAAOgU,YAAasX,OACpB,CACL,GAAIM,GAAoBhxB,KAAK8vB,MAAOvW,GAAQ9B,OAC5CzX,MAAKoF,OAAOqX,aAAciU,EAAUM,GAGtC,GAAe,IAAVzX,EAEHvZ,KAAK8vB,MAAQA,EAAMrB,OAAQzuB,KAAK8vB,WAC3B,IAAKiB,EAEV/wB,KAAK8vB,MAAQ9vB,KAAK8vB,MAAMrB,OAAQqB,OAC3B,CAEL,GAAImB,GAAWjxB,KAAK8vB,MAAMpE,OAAQnS,EAAOuX,EAAMvX,EAC/CvZ,MAAK8vB,MAAQ9vB,KAAK8vB,MAAMrB,OAAQqB,GAAQrB,OAAQwC,GAGlDjxB,KAAKkxB,WAAYpB,GACjB9vB,KAAKmxB,WAAY5X,GAAO,KAG1B0R,EAAMxV,OAAS,SAAUuX,GACvBhtB,KAAK4wB,OAAQ5D,EAAOhtB,KAAK8vB,MAAMrnB,SAGjCwiB,EAAMmG,QAAU,SAAUpE,GACxBhtB,KAAK4wB,OAAQ5D,EAAO,IAOtB/B,EAAMlpB,OAAS,SAAUirB,GACvB,GAAI8C,GAAQ9vB,KAAKqxB,SAAUrE,EAC3B,IAAM8C,GAAUA,EAAMrnB,OAAtB,CAIA,GAAI6oB,GAAetxB,KAAK8vB,MAAMrnB,OAAS,CAEvCqnB,GAAMttB,QAAS,SAAUoX,GACvBA,EAAK7X,QACL,IAAIwX,GAAQvZ,KAAK8vB,MAAMtlB,QAASoP,EAChC0X,GAAexiB,KAAKvD,IAAKgO,EAAO+X,GAChCvF,EAAMW,WAAY1sB,KAAK8vB,MAAOlW,IAC7B5Z,MAEHA,KAAKmxB,WAAYG,GAAc,KAOjCrG,EAAMsG,eAAiB,SAAUzsB,GAC/B,GAAI8U,GAAO5Z,KAAKwxB,QAAS1sB,EACzB,IAAM8U,EAAN,CAGAA,EAAK6X,SAEL,IAAIlY,GAAQvZ,KAAK8vB,MAAMtlB,QAASoP,EAChC5Z,MAAKmxB,WAAY5X,KAOnB0R,EAAMkG,WAAa,SAAUO,EAAkBC,GAC7C,GAAIC,GAAmB5xB,KAAK6xB,eAC5B7xB,MAAK8xB,eAAgBJ,GACrB1xB,KAAK+xB,qBACL/xB,KAAK4F,gBAGL,IAAIgU,GAAO5Z,KAAKwxB,QAASI,EACpBhY,KACH5Z,KAAKyD,cAAgBzD,KAAKgyB,kBAAmBpY,IAE/C5Z,KAAKyD,cAAgBqL,KAAKvD,IAAKvL,KAAKqY,OAAO5P,OAAS,EAAGzI,KAAKyD,eAE5DzD,KAAK2rB,UAAW,cAAgB+F,IAEhC1xB,KAAK0c,OAAQ1c,KAAKyD,eAEbkuB,GACH3xB,KAAKiyB,4BAMF3sB;;CC7JL,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,wBACC,SAAUyB,GACX,MAAO1B,GAAS9pB,EAAQwrB,KAEC,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,oBAIVvD,EAAO+E,SAAW/E,EAAO+E,aACzB/E,EAAO+E,SAAS4sB,iBAAmB7H,EACjC9pB,EACAA,EAAOurB,gBAIVvrB,OAAQ,SAAkBA,EAAQwrB,GAErC,YAIA,IAAId,KAsKJ,OApKAA,GAAMkH,eAAiB,WAChBnyB,KAAKoyB,cAIVpyB,KAAKoyB,aAAc,EACnBpyB,KAAKqyB,cAAgB,EACrBryB,KAAK+X,YAGPkT,EAAMlT,QAAU,WACd/X,KAAKsyB,iBACLtyB,KAAKuyB,yBAEL,IAAIC,GAAYxyB,KAAKuO,CAMrB,IAJAvO,KAAKyyB,mBACLzyB,KAAK0yB,iBACL1yB,KAAK2yB,OAAQH,GAERxyB,KAAKoyB,YAAc,CACtB,GAAI1E,GAAQ1tB,IACZ4yB,uBAAuB,WACrBlF,EAAM3V,cAKZkT,EAAMyH,eAAiB,WACrB,GAAInkB,GAAIvO,KAAKuO,CAERvO,MAAK4N,QAAQ4D,YAAcxR,KAAK8vB,MAAMrnB,OAAS,IAClD8F,EAAIwd,EAAMI,OAAQ5d,EAAGvO,KAAK6yB,gBAC1BtkB,GAAQvO,KAAK6yB,eACb7yB,KAAK8yB,eAAgBvkB,IAGvBvO,KAAK+yB,cAAexkB,EAAGvO,KAAKoyB,aAC5BpyB,KAAKgzB,uBAGP/H,EAAM8H,cAAgB,SAAUxkB,EAAG0kB,GACjC1kB,GAAKvO,KAAKkzB,eAEV3kB,EAAIvO,KAAK4N,QAAQulB,aAAe5kB,EAAIA,CACpC,IAAI6kB,GAAapzB,KAAKqzB,iBAAkB9kB,EAGxCvO,MAAKoF,OAAO6J,MAAMqkB,UAAYL,EAC5B,eAAiBG,EAAa,QAAU,cAAgBA,EAAa,KAGzEnI,EAAM+H,oBAAsB,WAC1B,GAAIO,GAAavzB,KAAKqY,OAAO,EAC7B,IAAMkb,EAAN,CAGA,GAAIC,IAAaxzB,KAAKuO,EAAIglB,EAAW1xB,OACjC4xB,EAAWD,EAAYxzB,KAAK0zB,WAChC1zB,MAAK2zB,cAAe,SAAU,MAAQF,EAAUD,MAGlDvI,EAAMgH,yBAA2B,WACzBjyB,KAAK8vB,MAAMrnB,SAGjBzI,KAAKuO,GAAKvO,KAAK4zB,cAAc/xB,OAC7B7B,KAAK6zB,SAAW,EAChB7zB,KAAK0yB,mBAGPzH,EAAMoI,iBAAmB,SAAUlrB,GACjC,MAAKnI,MAAK4N,QAAQkmB,gBAEqD,IAA5DhlB,KAAKilB,MAAS5rB,EAAWnI,KAAKic,KAAKnC,WAAe,KAAkB,IAGtEhL,KAAKilB,MAAO5rB,GAAa,MAIpC8iB,EAAM0H,OAAS,SAAUH,GAEjBxyB,KAAKg0B,eAAiBllB,KAAKilB,MAAgB,IAAT/zB,KAAKuO,IAAaO,KAAKilB,MAAmB,IAAZvB,IACpExyB,KAAKqyB,gBAGFryB,KAAKqyB,cAAgB,IACxBryB,KAAKoyB,aAAc,QACZpyB,MAAKi0B,gBAEZj0B,KAAK0yB,iBACL1yB,KAAK2zB,cAAe,SAAU,MAAQ3zB,KAAKyD,kBAI/CwnB,EAAM6H,eAAiB,SAAUvkB,GAE/B,GAAI2lB,GAAYl0B,KAAKkzB,eAAiB3kB,CACtCvO,MAAKm0B,YAAan0B,KAAKo0B,iBAAkBF,GAAY,EAErD,IAAIG,GAAWr0B,KAAKic,KAAKnC,YAAevL,EAAIvO,KAAK6yB,eAAiB7yB,KAAKkzB,eACvElzB,MAAKm0B,YAAan0B,KAAKs0B,gBAAiBD,EAAU,IAGpDpJ,EAAMkJ,YAAc,SAAUrE,EAAOyE,EAAKC,GACxC,IAAM,GAAIhiB,GAAE,EAAGA,EAAIsd,EAAMrnB,OAAQ+J,IAAM,CACrC,GAAIoH,GAAOkW,EAAMtd,GACbiiB,EAAYF,EAAM,EAAIC,EAAQ,CAClC5a,GAAK8a,UAAWD,GAChBF,GAAO3a,EAAKqC,KAAK0Y,aAIrB1J,EAAM2J,cAAgB,SAAU9E,GAC9B,GAAMA,GAAUA,EAAMrnB,OAGtB,IAAM,GAAI+J,GAAE,EAAGA,EAAIsd,EAAMrnB,OAAQ+J,IAC/Bsd,EAAMtd,GAAGkiB,UAAW,IAMxBzJ,EAAMwH,iBAAmB,WACvBzyB,KAAKuO,GAAKvO,KAAK6zB,SACf7zB,KAAK6zB,UAAY7zB,KAAK60B,qBAGxB5J,EAAM6J,WAAa,SAAUC,GAC3B/0B,KAAK6zB,UAAYkB,GAGnB9J,EAAM4J,kBAAoB,WACxB,MAAO,GAAI70B,KAAK4N,QAAS5N,KAAKi0B,gBAAkB,qBAAuB,aAGzEhJ,EAAM+J,mBAAqB,WAEzB,MAAOh1B,MAAKuO,EAAIvO,KAAK6zB,UAAa,EAAI7zB,KAAK60B,sBAG7C5J,EAAMqH,eAAiB,WACrB,GAAMtyB,KAAKi1B,aAAgBj1B,KAAKg0B,cAAhC,CAIA,GAAIkB,GAAel1B,KAAKm1B,MAAQn1B,KAAKuO,EACjC6mB,EAAYF,EAAel1B,KAAK6zB,QACpC7zB,MAAK80B,WAAYM,KAGnBnK,EAAMsH,wBAA0B,WAG9B,KADevyB,KAAKi1B,cAAej1B,KAAKg0B,iBACvBh0B,KAAKi0B,iBAAoBj0B,KAAKqY,OAAO5P,OAAtD,CAGA,GAAI4sB,IAAwC,EAA7Br1B,KAAK4zB,cAAc/xB,OAAc7B,KAAKuO,EACjDwmB,EAAQM,EAAWr1B,KAAK4N,QAAQ0nB,kBACpCt1B,MAAK80B,WAAYC,KAGZ9J;;CCrML,SAAU1qB,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,qBACC,SAAUmH,GACX,MAAOpH,GAAS9pB,EAAQkxB,KAEC,gBAAVhxB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cAIVvD,EAAO+E,SAAW/E,EAAO+E,aACzB/E,EAAO+E,SAASiwB,KAAOlL,EACrB9pB,EACAA,EAAOkxB,WAIVlxB,OAAQ,SAAkBA,EAAQkxB,GAErC,YAEA,SAAS8D,GAAMzwB,EAAM7E,GACnBD,KAAKyX,QAAU3S,EACf9E,KAAKC,OAASA,EAEdD,KAAKw1B,SAGP,GAAIvK,GAAQsK,EAAKrxB,SA8DjB,OA5DA+mB,GAAMuK,OAAS,WACbx1B,KAAKyX,QAAQxI,MAAM9G,SAAW,WAC9BnI,KAAKyX,QAAQpH,aAAc,cAAe,QAC1CrQ,KAAKuO,EAAI,EACTvO,KAAKw0B,MAAQ,GAGfvJ,EAAMlH,QAAU,WAEd/jB,KAAKy1B,WACLz1B,KAAKyX,QAAQxI,MAAM9G,SAAW,EAC9B,IAAIutB,GAAO11B,KAAKC,OAAO01B,UACvB31B,MAAKyX,QAAQxI,MAAOymB,GAAS,IAG/BzK,EAAMwG,QAAU,WACdzxB,KAAKic,KAAOwV,EAASzxB,KAAKyX,UAG5BwT,EAAM2K,YAAc,SAAUrnB,GAC5BvO,KAAKuO,EAAIA,EACTvO,KAAK61B,eACL71B,KAAK81B,eAAgBvnB,IAIvB0c,EAAM4K,aAAe5K,EAAM8K,iBAAmB,WAC5C,GAAIC,GAA2C,QAA1Bh2B,KAAKC,OAAO01B,WAAuB,aAAe,aACvE31B,MAAK6B,OAAS7B,KAAKuO,EAAIvO,KAAKic,KAAM+Z,GAChCh2B,KAAKic,KAAKhX,MAAQjF,KAAKC,OAAOsF,WAGlC0lB,EAAM6K,eAAiB,SAAUvnB,GAE/B,GAAImnB,GAAO11B,KAAKC,OAAO01B,UACvB31B,MAAKyX,QAAQxI,MAAOymB,GAAS11B,KAAKC,OAAOozB,iBAAkB9kB,IAG7D0c,EAAMvO,OAAS,WACb1c,KAAKyX,QAAQjW,UAAUY,IAAI,eAC3BpC,KAAKyX,QAAQ0B,gBAAgB,gBAG/B8R,EAAMwK,SAAW,WACfz1B,KAAKyX,QAAQjW,UAAUO,OAAO,eAC9B/B,KAAKyX,QAAQpH,aAAc,cAAe,SAM5C4a,EAAMyJ,UAAY,SAAUF,GAC1Bx0B,KAAKw0B,MAAQA,EACbx0B,KAAK81B,eAAgB91B,KAAKuO,EAAIvO,KAAKC,OAAO4yB,eAAiB2B,IAG7DvJ,EAAMlpB,OAAS,WACb/B,KAAKyX,QAAQ9V,WAAWyL,YAAapN,KAAKyX,UAGrC8d;;CClGL,SAAUh1B,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,wBACA,wBACC,SAAUhlB,EAAU2wB,EAAYlK,GACjC,MAAO1B,GAAS9pB,EAAQ+E,EAAU2wB,EAAYlK,KAErB,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIVvD,EAAO+E,SAAW+kB,EAChB9pB,EACAA,EAAO+E,SACP/E,EAAO01B,WACP11B,EAAOurB,eAIVvrB,OAAQ,SAAkBA,EAAQ+E,EAAU2wB,EAAYlK,GAE3D,YA4VA,SAASmK,KACP,OACE3nB,EAAGhO,EAAO41B,YACV3nB,EAAGjO,EAAOwG,aA3VdglB,EAAM1f,OAAQ/G,EAAS8wB,UACrBzY,UAAW,KACX0Y,cAAe,IAKjB/wB,EAASwpB,cAAc5e,KAAK,cAI5B,IAAI+a,GAAQ3lB,EAASpB,SACrB6nB,GAAM1f,OAAQ4e,EAAOgL,EAAW/xB,WAChC+mB,EAAMqL,kBAAoB,OAI1B,IAAIC,GAAU,eAAiBl1B,UAC3Bm1B,GAA4B,CAEhCvL,GAAMwL,YAAc,WAClBz2B,KAAKF,GAAI,WAAYE,KAAK02B,gBAC1B12B,KAAKF,GAAI,WAAYE,KAAK22B,eAC1B32B,KAAKF,GAAI,aAAcE,KAAK42B,kBAC5B52B,KAAKF,GAAI,aAAcE,KAAK62B,iBAIvBN,IAAYC,IACfj2B,EAAOY,iBAAkB,YAAa,cACtCq1B,GAA4B,IAIhCvL,EAAMyL,eAAiB,WACrB12B,KAAK82B,SAAY92B,KAAK2Y,UACtB3Y,KAAK+2B,cACL/2B,KAAK62B,mBAGP5L,EAAM2L,iBAAmB,WACvB52B,KAAKg3B,gBACLh3B,KAAKyX,QAAQjW,UAAUO,OAAO,iBAGhCkpB,EAAM4L,gBAAkB,WAES,MAA1B72B,KAAK4N,QAAQ+P,UAChB3d,KAAKi1B,YAAcj1B,KAAKqY,OAAO5P,OAAS,EAExCzI,KAAKi1B,YAAcj1B,KAAK4N,QAAQ+P,UAE7B3d,KAAKi1B,YACRj1B,KAAKyX,QAAQjW,UAAUY,IAAI,gBAE3BpC,KAAKyX,QAAQjW,UAAUO,OAAO,iBAKlCkpB,EAAMgM,SAAW,WACfj3B,KAAK4N,QAAQ+P,WAAY,EACzB3d,KAAK62B,mBAGP5L,EAAMiM,WAAa,WACjBl3B,KAAK4N,QAAQ+P,WAAY,EACzB3d,KAAK62B,mBAGP5L,EAAM0L,cAAgB,iBACb32B,MAAKi0B,iBAKdhJ,EAAMkM,YAAc,SAAUpyB,EAAOurB,GACnC,IAAMtwB,KAAKi1B,YAET,WADAj1B,MAAKo3B,oBAAqBryB,EAAOurB,EAGtBtwB,MAAKq3B,gBAAiBtyB,KAKnC/E,KAAKs3B,2BAA4BvyB,GACjC/E,KAAKu3B,iBAAkBxyB,GAElB1D,SAASC,eAAiBtB,KAAKyX,SAElCzX,KAAKw3B,kBAIPx3B,KAAKm1B,MAAQn1B,KAAKuO,EAClBvO,KAAK2Y,SAASnX,UAAUY,IAAI,mBAE5BpC,KAAKy3B,kBAAoBvB,IACzB31B,EAAOY,iBAAkB,SAAUnB,MAEnCA,KAAKo3B,oBAAqBryB,EAAOurB,KAInCrF,EAAMmM,oBAAsB,SAAUryB,EAAOurB,GAG3CtwB,KAAK03B,oBACHC,MAAOrH,EAAQqH,MACfC,MAAOtH,EAAQsH,OAGjB53B,KAAK63B,qBAAsB9yB,GAC3B/E,KAAK2zB,cAAe,cAAe5uB,GAASurB,IAG9C,IAAIwH,IACFC,OAAO,EACPC,UAAU,EACVC,QAAQ,EAyOV,OAtOAhN,GAAMsM,iBAAmB,SAAUxyB,GACf+yB,EAAY/yB,EAAMlD,OAAOq2B,WAEzCl4B,KAAKuM,SAIT0e,EAAMqM,2BAA6B,SAAUvyB,GAC3C,GAAIozB,GAA6B,cAAdpzB,EAAMjC,KACrBs1B,EAAsC,SAArBrzB,EAAMszB,YACvBC,EAAcR,EAAY/yB,EAAMlD,OAAOq2B,SACrCC,IAAiBC,GAAmBE,GACxCvzB,EAAMG,kBAMV+lB,EAAMsN,eAAiB,SAAUC,GAC/B,MAAO1pB,MAAK2pB,IAAKD,EAAWjqB,GAAMvO,KAAK4N,QAAQyoB,eAKjDpL,EAAMyN,UAAY,SAAU3zB,EAAOurB,SAC1BtwB,MAAK24B,iBACZ34B,KAAK2Y,SAASnX,UAAUO,OAAO,mBAC/B/B,KAAK2zB,cAAe,YAAa5uB,GAASurB,IAC1CtwB,KAAK44B,eAAgB7zB,EAAOurB,IAG9BrF,EAAM4N,YAAc,WAClBt4B,EAAO2mB,oBAAqB,SAAUlnB,YAC/BA,MAAKy3B,mBAKdxM,EAAM6N,UAAY,SAAU/zB,EAAOurB,GAC3BtwB,KAAKi1B,cAGXj1B,KAAK+4B,kBAAoB/4B,KAAKuO,EAC9BvO,KAAKmyB,iBACL5xB,EAAO2mB,oBAAqB,SAAUlnB,MACtCA,KAAK2zB,cAAe,YAAa5uB,GAASurB,MAG5CrF,EAAM+N,YAAc,SAAUj0B,EAAOurB,GACnC,GAAIkI,GAAax4B,KAAKi5B,iBAAkBl0B,EAAOurB,EAC/CtwB,MAAK2zB,cAAe,cAAe5uB,GAASurB,EAASkI,IACrDx4B,KAAKk5B,UAAWn0B,EAAOurB,EAASkI,IAGlCvN,EAAMkO,SAAW,SAAUp0B,EAAOurB,EAASkI,GACzC,GAAMx4B,KAAKi1B,YAAX,CAGAlwB,EAAMG,iBAENlF,KAAKo5B,cAAgBp5B,KAAKm1B,KAE1B,IAAIkE,GAAYr5B,KAAK4N,QAAQulB,aAAe,EAAI,CAC3CnzB,MAAK4N,QAAQ4D,aAEhBgnB,EAAWjqB,EAAIiqB,EAAWjqB,EAAIvO,KAAK6yB,eAErC,IAAIsC,GAAQn1B,KAAK+4B,kBAAoBP,EAAWjqB,EAAI8qB,CAEpD,KAAMr5B,KAAK4N,QAAQ4D,YAAcxR,KAAKqY,OAAO5P,OAAS,CAEpD,GAAI6wB,GAAcxqB,KAAKC,KAAM/O,KAAKqY,OAAO,GAAGxW,OAAQ7B,KAAK+4B,kBACzD5D,GAAQA,EAAQmE,EAAwC,IAAxBnE,EAAQmE,GAAsBnE,CAC9D,IAAIoE,GAAWzqB,KAAKvD,KAAMvL,KAAKw5B,eAAe33B,OAAQ7B,KAAK+4B,kBAC3D5D,GAAQA,EAAQoE,EAAkC,IAArBpE,EAAQoE,GAAmBpE,EAG1Dn1B,KAAKm1B,MAAQA,EAEbn1B,KAAKy5B,aAAe,GAAIvvB,MACxBlK,KAAK2zB,cAAe,WAAY5uB,GAASurB,EAASkI,MAGpDvN,EAAMyO,QAAU,SAAU30B,EAAOurB,GAC/B,GAAMtwB,KAAKi1B,YAAX,CAGKj1B,KAAK4N,QAAQ+rB,aAChB35B,KAAKi0B,iBAAkB,EAGzB,IAAI1a,GAAQvZ,KAAK45B,sBAEjB,IAAK55B,KAAK4N,QAAQ+rB,aAAe35B,KAAK4N,QAAQ4D,WAAa,CAIzD,GAAIqoB,GAAW75B,KAAKg1B,oBACpBh1B,MAAKi0B,iBAAmB4F,EAAW75B,KAAKqY,OAAO,GAAGxW,SAC/Cg4B,EAAW75B,KAAKw5B,eAAe33B,WACvB7B,MAAK4N,QAAQ+rB,YAAcpgB,GAASvZ,KAAKyD,gBAEpD8V,GAASvZ,KAAK85B,4BAET95B,MAAKo5B,cAIZp5B,KAAK+5B,aAAe/5B,KAAK4N,QAAQ4D,WACjCxR,KAAK0c,OAAQnD,SACNvZ,MAAK+5B,aACZ/5B,KAAK2zB,cAAe,UAAW5uB,GAASurB,MAG1CrF,EAAM2O,qBAAuB,WAC3B,GAAIC,GAAW75B,KAAKg1B,qBAEhBK,EAAWvmB,KAAK2pB,IAAKz4B,KAAKg6B,kBAAmBH,EAAU75B,KAAKyD,gBAE5Dw2B,EAAkBj6B,KAAKk6B,mBAAoBL,EAAUxE,EAAU,GAC/D8E,EAAkBn6B,KAAKk6B,mBAAoBL,EAAUxE,GAAW,EAIpE,OAFY4E,GAAgB5E,SAAW8E,EAAgB9E,SACrD4E,EAAgB1gB,MAAQ4gB,EAAgB5gB,OAY5C0R,EAAMiP,mBAAqB,SAAUL,EAAUxE,EAAU+E,GAMvD,IALA,GAAI7gB,GAAQvZ,KAAKyD,cACb42B,EAAcC,EAAAA,EACdpiB,EAAYlY,KAAK4N,QAAQpI,UAAYxF,KAAK4N,QAAQ4D,WAEpD,SAAU+oB,EAAGC,GAAO,MAAOD,IAAKC,GAAQ,SAAUD,EAAGC,GAAO,MAAOD,GAAIC,GACjEtiB,EAAWmd,EAAUgF,KAE3B9gB,GAAS6gB,EACTC,EAAchF,EAEI,QADlBA,EAAWr1B,KAAKg6B,kBAAmBH,EAAUtgB,MAI7C8b,EAAWvmB,KAAK2pB,IAAKpD,EAEvB,QACEA,SAAUgF,EAEV9gB,MAAOA,EAAQ6gB,IASnBnP,EAAM+O,iBAAmB,SAAUzrB,EAAGgL,GACpC,GAAIuX,GAAM9wB,KAAKqY,OAAO5P,OAElBgyB,EAAez6B,KAAK4N,QAAQ4D,YAAcsf,EAAM,EAChD4J,EAAaD,EAAe1O,EAAMI,OAAQ5S,EAAOuX,GAAQvX,EACzDohB,EAAQ36B,KAAKqY,OAAQqiB,EACzB,KAAMC,EACJ,MAAO,KAGT,IAAIC,GAAOH,EAAez6B,KAAK6yB,eAAiB/jB,KAAKqT,MAAO5I,EAAQuX,GAAQ,CAC5E,OAAOviB,IAAMosB,EAAM94B,OAAS+4B,IAG9B3P,EAAM6O,mBAAqB,WAEzB,OAA4BzsB,KAAvBrN,KAAKo5B,gBAAgCp5B,KAAKy5B,cAE7C,GAAIvvB,MAASlK,KAAKy5B,aAAe,IACjC,MAAO,EAGT,IAAIpE,GAAWr1B,KAAKg6B,kBAAmBh6B,KAAKm1B,MAAOn1B,KAAKyD,eACpDo3B,EAAQ76B,KAAKo5B,cAAgBp5B,KAAKm1B,KACtC,OAAKE,GAAW,GAAKwF,EAAQ,EAEpB,EACGxF,EAAW,GAAKwF,EAAQ,GAE1B,EAEH,GAKT5P,EAAM6P,YAAc,SAAU/1B,EAAOurB,GAEnC,GAAIyK,GAAc/6B,KAAKg7B,cAAej2B,EAAMlD,QACxCo5B,EAAWF,GAAeA,EAAYtjB,QACtC+Y,EAAYuK,GAAe/6B,KAAK8vB,MAAMtlB,QAASuwB,EACnD/6B,MAAK2zB,cAAe,cAAe5uB,GAASurB,EAAS2K,EAAUzK,KAKjEvF,EAAMiQ,SAAW,WACf,GAAIC,GAASjF,IACTkF,EAAcp7B,KAAKy3B,kBAAkBlpB,EAAI4sB,EAAO5sB,EAChD8sB,EAAcr7B,KAAKy3B,kBAAkBjpB,EAAI2sB,EAAO3sB,GAE/CM,KAAK2pB,IAAK2C,GAAgB,GAAKtsB,KAAK2pB,IAAK4C,GAAgB,IAC5Dr7B,KAAKs7B,gBAeFh2B;;CCrYL,SAAU/E,EAAQ8pB,GAGlB,GAAsB,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,wBACA,oBACA,uBACA,SACA,UACA,aACC,SAAUU,EAAWyG,EAAS1F,EAAOwJ,EAAMgG,EAAOrJ,GACnD,MAAO7H,GAAS9pB,EAAQyqB,EAAWyG,EAAS1F,EAAOwJ,EAAMgG,EAAOrJ,SAE7D,IAAsB,gBAAVzxB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,YACRA,QAAQ,kBACRA,QAAQ,UACRA,QAAQ,WACRA,QAAQ,kBAEL,CAEL,GAAI03B,GAAYj7B,EAAO+E,QAEvB/E,GAAO+E,SAAW+kB,EAChB9pB,EACAA,EAAOyqB,UACPzqB,EAAOkxB,QACPlxB,EAAOurB,aACP0P,EAAUjG,KACViG,EAAUD,MACVC,EAAUtJ,oBAIb3xB,OAAQ,SAAkBA,EAAQyqB,EAAWyG,EAC9C1F,EAAOwJ,EAAMgG,EAAOrJ,GAEtB,YAOA,SAASuJ,GAAczO,EAAO0O,GAE5B,IADA1O,EAAQjB,EAAMQ,UAAWS,GACjBA,EAAMvkB,QACZizB,EAAOtiB,YAAa4T,EAAMwH,SAW9B,QAASlvB,GAAUmS,EAAS7J,GAC1B,GAAI+tB,GAAe5P,EAAMc,gBAAiBpV,EAC1C,KAAMkkB,EAIJ,YAHKl6B,GACHA,EAAQyZ,MAAO,8BAAiCygB,GAAgBlkB,IAMpE,IAFAzX,KAAKyX,QAAUkkB,EAEV37B,KAAKyX,QAAQmkB,aAAe,CAC/B,GAAIhN,GAAWiN,EAAW77B,KAAKyX,QAAQmkB,aAEvC,OADAhN,GAASkN,OAAQluB,GACVghB,EAIJD,IACH3uB,KAAK+7B,SAAWpN,EAAQ3uB,KAAKyX,UAG/BzX,KAAK4N,QAAUme,EAAM1f,UAAYrM,KAAKg8B,YAAY5F,UAClDp2B,KAAK87B,OAAQluB,GAGb5N,KAAKi8B,UA3CP,GAAItN,GAASpuB,EAAOouB,OAChBuN,EAAmB37B,EAAO27B,iBAC1Bz6B,EAAUlB,EAAOkB,QAYjB06B,EAAO,EAEPN,IA8BJv2B,GAAS8wB,UACPgG,eAAe,EAEf72B,UAAW,SAGX82B,mBAAoB,KACpBC,SAAU,IACVC,uBAAuB,EAEvBzI,iBAAiB,EACjBtb,QAAQ,EACR8c,mBAAoB,KACpB1vB,gBAAgB,GAMlBN,EAASwpB,gBAET,IAAI7D,GAAQ3lB,EAASpB,SAErB6nB,GAAM1f,OAAQ4e,EAAOD,EAAU9mB,WAE/B+mB,EAAMgR,QAAU,WAEd,GAAIr5B,GAAK5C,KAAKw8B,OAASL,CACvBn8B,MAAKyX,QAAQmkB,aAAeh5B,EAC5Bi5B,EAAWj5B,GAAO5C,KAElBA,KAAKyD,cAAgB,EAErBzD,KAAKqyB,cAAgB,EAErBryB,KAAKuO,EAAI,EACTvO,KAAK6zB,SAAW,EAChB7zB,KAAK21B,WAAa31B,KAAK4N,QAAQulB,YAAc,QAAU,OAEvDnzB,KAAK2Y,SAAWtX,SAAS0X,cAAc,OACvC/Y,KAAK2Y,SAASO,UAAY,oBAC1BlZ,KAAKy8B,iBAEAz8B,KAAK4N,QAAQ4K,QAAUxY,KAAK4N,QAAQ8uB,WACvCn8B,EAAOY,iBAAkB,SAAUnB,KAIrC,KAAM,GAAIkrB,KAAalrB,MAAK4N,QAAQ9N,GAAK,CACvC,GAAIqrB,GAAWnrB,KAAK4N,QAAQ9N,GAAIorB,EAChClrB,MAAKF,GAAIorB,EAAWC,GAGtB7lB,EAASwpB,cAActsB,QAAS,SAAUuoB,GACxC/qB,KAAM+qB,MACL/qB,MAEEA,KAAK4N,QAAQ8uB,SAChB18B,KAAK08B,WAEL18B,KAAK28B,YAST1R,EAAM6Q,OAAS,SAAUc,GACvB7Q,EAAM1f,OAAQrM,KAAK4N,QAASgvB,IAG9B3R,EAAM0R,SAAW,WACf,IAAK38B,KAAK0lB,SAAV,CAGA1lB,KAAK0lB,UAAW,EAChB1lB,KAAKyX,QAAQjW,UAAUY,IAAI,oBACtBpC,KAAK4N,QAAQulB,aAChBnzB,KAAKyX,QAAQjW,UAAUY,IAAI,gBAG7BpC,KAAKyxB,SAGLgK,GADgBz7B,KAAK68B,wBAAyB78B,KAAKyX,QAAQpP,UAClCrI,KAAKoF,QAC9BpF,KAAK2Y,SAASS,YAAapZ,KAAKoF,QAChCpF,KAAKyX,QAAQ2B,YAAapZ,KAAK2Y,UAE/B3Y,KAAK88B,cAEA98B,KAAK4N,QAAQwuB,gBAEhBp8B,KAAKyX,QAAQzV,SAAW,EAExBhC,KAAKyX,QAAQtW,iBAAkB,UAAWnB,OAG5CA,KAAK2rB,UAAU,YACf3rB,KAAK+8B,qBAEL/8B,KAAKg9B,iBAAkB,EAEvBh9B,KAAK2zB,cAAc,WAIrB1I,EAAMwR,cAAgB,WAEpB,GAAIr3B,GAAS/D,SAAS0X,cAAc,MACpC3T,GAAO8T,UAAY,kBACnB9T,EAAO6J,MAAOjP,KAAK21B,YAAe,EAClC31B,KAAKoF,OAASA,GAGhB6lB,EAAM4R,wBAA0B,SAAU7P,GACxC,MAAOjB,GAAMgB,mBAAoBC,EAAOhtB,KAAK4N,QAAQqvB,eAIvDhS,EAAM6R,YAAc,WAElB98B,KAAK8vB,MAAQ9vB,KAAK6wB,WAAY7wB,KAAKoF,OAAOiD,UAC1CrI,KAAKk9B,gBACLl9B,KAAK+xB,qBACL/xB,KAAK4F,kBAQPqlB,EAAM4F,WAAa,SAAU7D,GAQ3B,MAPgBhtB,MAAK68B,wBAAyB7P,GAGxBhlB,IAAK,SAAUizB,GACnC,MAAO,IAAI1F,GAAM0F,EAAUj7B,OAC1BA,OAKLirB,EAAMkS,YAAc,WAClB,MAAOn9B,MAAK8vB,MAAO9vB,KAAK8vB,MAAMrnB,OAAS,IAGzCwiB,EAAMuO,aAAe,WACnB,MAAOx5B,MAAKqY,OAAQrY,KAAKqY,OAAO5P,OAAS,IAI3CwiB,EAAMiS,cAAgB,WAEpBl9B,KAAKkxB,WAAYlxB,KAAK8vB,OAEtB9vB,KAAK8xB,eAAgB,IAOvB7G,EAAM6G,eAAiB,SAAUvY,GAC/BA,EAAQA,GAAS,EAGjBvZ,KAAK6Z,cAAgBN,EAAQvZ,KAAK6Z,eAAiB,EAAI,CACvD,IAAIujB,GAAQ,CAEZ,IAAK7jB,EAAQ,EAAI,CACf,GAAI8jB,GAAYr9B,KAAK8vB,MAAOvW,EAAQ,EACpC6jB,GAAQC,EAAU9uB,EAAI8uB,EAAUphB,KAAK0Y,WAGvC,IAAM,GADF7D,GAAM9wB,KAAK8vB,MAAMrnB,OACX+J,EAAE+G,EAAO/G,EAAIse,EAAKte,IAAM,CAChC,GAAIoH,GAAO5Z,KAAK8vB,MAAMtd,EACtBoH,GAAKgc,YAAawH,GAClBA,GAASxjB,EAAKqC,KAAK0Y,WACnB30B,KAAK6Z,cAAgB/K,KAAKC,IAAK6K,EAAKqC,KAAKwK,YAAazmB,KAAK6Z,eAG7D7Z,KAAK6yB,eAAiBuK,EAEtBp9B,KAAKs9B,eAELt9B,KAAKu9B,iBAELv9B,KAAK0zB,YAAc5C,EAAM9wB,KAAKw5B,eAAe33B,OAAS7B,KAAKqY,OAAO,GAAGxW,OAAS,GAOhFopB,EAAMiG,WAAa,SAAUpB,GAC3BA,EAAMttB,QAAS,SAAUoX,GACvBA,EAAK6X,aAMTxG,EAAMqS,aAAe,WAEnB,GADAt9B,KAAKqY,UACCrY,KAAK8vB,MAAMrnB,OAAjB,CAIA,GAAIkyB,GAAQ,GAAIY,GAAOv7B,KACvBA,MAAKqY,OAAOnI,KAAMyqB,EAClB,IAAI6C,GAAkC,QAAnBx9B,KAAK21B,WACpB8H,EAAaD,EAAe,cAAgB,aAE5CE,EAAa19B,KAAK29B,gBAEtB39B,MAAK8vB,MAAMttB,QAAS,SAAUoX,EAAMpH,GAElC,IAAMmoB,EAAM7K,MAAMrnB,OAEhB,WADAkyB,GAAMiD,QAAShkB,EAIjB,IAAIikB,GAAelD,EAAMhG,WAAagG,EAAMmD,aACxClkB,EAAKqC,KAAK0Y,WAAa/a,EAAKqC,KAAMwhB,GAEjCC,GAAWt5B,KAAMpE,KAAMwS,EAAGqrB,GAC7BlD,EAAMiD,QAAShkB,IAGf+gB,EAAM9E,eAEN8E,EAAQ,GAAIY,GAAOv7B,MACnBA,KAAKqY,OAAOnI,KAAMyqB,GAClBA,EAAMiD,QAAShkB,KAEhB5Z,MAEH26B,EAAM9E,eAEN71B,KAAK+9B,wBAGP9S,EAAM0S,eAAiB,WACrB,GAAIphB,GAAavc,KAAK4N,QAAQ2O,UAC9B,KAAMA,EACJ,MAAO,YACL,OAAO,EAEJ,IAA0B,gBAAdA,GAAyB,CAE1C,GAAI0F,GAAS9X,SAAUoS,EAAY,GACnC,OAAO,UAAU/J,GACf,MAASA,GAAIyP,GAAa,GAK9B,GAAI+b,GAAoC,gBAAdzhB,IACxBA,EAAWuR,MAAM,YACfmQ,EAAUD,EAAe7zB,SAAU6zB,EAAa,GAAI,IAAO,IAAM,CACrE,OAAO,UAAUxrB,EAAGqrB,GAClB,MAAOA,KAAgB79B,KAAKic,KAAKnC,WAAa,GAAMmkB,IAKxDhT,EAAMiT,MACNjT,EAAMkT,WAAa,WACjBn+B,KAAKk9B,gBACLl9B,KAAKiyB,4BAGPhH,EAAMwG,QAAU,WACdzxB,KAAKic,KAAOwV,EAASzxB,KAAKyX,SAC1BzX,KAAKo+B,eACLp+B,KAAKkzB,eAAiBlzB,KAAKic,KAAKnC,WAAa9Z,KAAKuF,UAGpD,IAAI84B,IAEF32B,QACE42B,KAAM,GACNC,MAAO,IAETD,MACEA,KAAM,EACNC,MAAO,GAETA,OACEA,MAAO,EACPD,KAAM,GA2hBV,OAvhBArT,GAAMmT,aAAe,WACnB,GAAII,GAAYH,EAAqBr+B,KAAK4N,QAAQrI,UAClDvF,MAAKuF,UAAYi5B,EAAYA,EAAWx+B,KAAK21B,YAAe31B,KAAK4N,QAAQrI,WAG3E0lB,EAAMrlB,eAAiB,WACrB,GAAK5F,KAAK4N,QAAQhI,eAAiB,CACjC,GAAIiJ,GAAS7O,KAAK4N,QAAQnI,gBAAkBzF,KAAK4zB,cAC/C5zB,KAAK4zB,cAAc/kB,OAAS7O,KAAK6Z,aACnC7Z,MAAK2Y,SAAS1J,MAAMJ,OAASA,EAAS,OAI1Coc,EAAM8G,mBAAqB,WAEzB,GAAM/xB,KAAK4N,QAAQ4D,WAAnB,CAIAxR,KAAK40B,cAAe50B,KAAKo0B,kBACzBp0B,KAAK40B,cAAe50B,KAAKs0B,gBAGzB,IAAImK,GAAOz+B,KAAKkzB,eACZ1C,EAAYxwB,KAAK8vB,MAAMrnB,OAAS,CACpCzI,MAAKo0B,iBAAmBp0B,KAAK0+B,aAAcD,EAAMjO,GAAY,GAG7DiO,EAAOz+B,KAAKic,KAAKnC,WAAa9Z,KAAKkzB,eAEnClzB,KAAKs0B,gBAAkBt0B,KAAK0+B,aAAcD,EAAM,EAAG,KAGrDxT,EAAMyT,aAAe,SAAUD,EAAMjO,EAAW4J,GAG9C,IADA,GAAItK,MACI2O,EAAO,GAAI,CACjB,GAAI7kB,GAAO5Z,KAAK8vB,MAAOU,EACvB,KAAM5W,EACJ,KAEFkW,GAAM5f,KAAM0J,GACZ4W,GAAa4J,EACbqE,GAAQ7kB,EAAKqC,KAAK0Y,WAEpB,MAAO7E,IAMT7E,EAAMsS,eAAiB,WACrB,GAAMv9B,KAAK4N,QAAQpI,UAAWxF,KAAK4N,QAAQ4D,YAAexR,KAAK8vB,MAAMrnB,OAArE,CAGA,GAAIk2B,GAAgB3+B,KAAK4N,QAAQulB,YAC7ByL,EAAcD,EAAgB,cAAgB,aAC9CE,EAAYF,EAAgB,aAAe,cAC3CG,EAAe9+B,KAAK6yB,eAAiB7yB,KAAKm9B,cAAclhB,KAAM4iB,GAE9DE,EAAmBD,EAAe9+B,KAAKic,KAAKnC,WAE5CklB,EAAah/B,KAAKkzB,eAAiBlzB,KAAK8vB,MAAM,GAAG7T,KAAM2iB,GACvDrF,EAAWuF,EAAe9+B,KAAKic,KAAKnC,YAAe,EAAI9Z,KAAKuF,UAEhEvF,MAAKqY,OAAO7V,QAAS,SAAUm4B,GACxBoE,EAEHpE,EAAM94B,OAASi9B,EAAe9+B,KAAKuF,WAGnCo1B,EAAM94B,OAASiN,KAAKC,IAAK4rB,EAAM94B,OAAQm9B,GACvCrE,EAAM94B,OAASiN,KAAKvD,IAAKovB,EAAM94B,OAAQ03B,KAExCv5B,QAWLirB,EAAM0I,cAAgB,SAAU7wB,EAAMiC,EAAO8P,GAC3C,GAAIoqB,GAAWl6B,GAAUA,GAAQ0pB,OAAQ5Z,GAASA,CAGlD,IAFA7U,KAAK2rB,UAAW7oB,EAAMm8B,GAEjBtQ,GAAU3uB,KAAK+7B,SAAW,CAE7Bj5B,GAAQ9C,KAAK4N,QAAQ2uB,sBAAwB,YAAc,EAC3D,IAAI2C,GAASp8B,CACb,IAAKiC,EAAQ,CAEX,GAAIo6B,GAAUxQ,EAAOyQ,MAAOr6B,EAC5Bo6B,GAAQr8B,KAAOA,EACfo8B,EAASC,EAEXn/B,KAAK+7B,SAAS9yB,QAASi2B,EAAQrqB,KAWnCoW,EAAMvO,OAAS,SAAUnD,EAAO8lB,EAAQ3P,GACtC,GAAM1vB,KAAK0lB,WAGXnM,EAAQpP,SAAUoP,EAAO,IACzBvZ,KAAKs/B,YAAa/lB,IAEbvZ,KAAK4N,QAAQ4D,YAAc6tB,KAC9B9lB,EAAQwS,EAAMI,OAAQ5S,EAAOvZ,KAAKqY,OAAO5P,SAGrCzI,KAAKqY,OAAQkB,IAAnB,CAGA,GAAIgmB,GAAYv/B,KAAKyD,aACrBzD,MAAKyD,cAAgB8V,EACrBvZ,KAAK+9B,sBACArO,EACH1vB,KAAKiyB,2BAELjyB,KAAKmyB,iBAEFnyB,KAAK4N,QAAQnI,gBAChBzF,KAAK4F,iBAGP5F,KAAK2zB,cAAe,SAAU,MAAQpa,IAEjCA,GAASgmB,GACZv/B,KAAK2zB,cAAe,SAAU,MAAQpa,IAGxCvZ,KAAK2zB,cAAc,gBAIrB1I,EAAMqU,YAAc,SAAU/lB,GAC5B,GAAIuX,GAAM9wB,KAAKqY,OAAO5P,MAEtB,MADiBzI,KAAK4N,QAAQ4D,YAAcsf,EAAM,GAEhD,MAAOvX,EAET,IAAIimB,GAAYzT,EAAMI,OAAQ5S,EAAOuX,GAEjC+J,EAAQ/rB,KAAK2pB,IAAK+G,EAAYx/B,KAAKyD,eACnCg8B,EAAgB3wB,KAAK2pB,IAAO+G,EAAY1O,EAAQ9wB,KAAKyD,eACrDi8B,EAAoB5wB,KAAK2pB,IAAO+G,EAAY1O,EAAQ9wB,KAAKyD,gBACvDzD,KAAK+5B,cAAgB0F,EAAgB5E,EACzCthB,GAASuX,GACE9wB,KAAK+5B,cAAgB2F,EAAoB7E,IACpDthB,GAASuX,GAGNvX,EAAQ,EACXvZ,KAAKuO,GAAKvO,KAAK6yB,eACLtZ,GAASuX,IACnB9wB,KAAKuO,GAAKvO,KAAK6yB,iBAInB5H,EAAMlM,SAAW,SAAUsgB,EAAQ3P,GACjC1vB,KAAK0c,OAAQ1c,KAAKyD,cAAgB,EAAG47B,EAAQ3P,IAG/CzE,EAAMhe,KAAO,SAAUoyB,EAAQ3P,GAC7B1vB,KAAK0c,OAAQ1c,KAAKyD,cAAgB,EAAG47B,EAAQ3P,IAG/CzE,EAAM8S,oBAAsB,WAC1B,GAAIpD,GAAQ36B,KAAKqY,OAAQrY,KAAKyD,cAExBk3B,KAIN36B,KAAK2/B,wBAEL3/B,KAAK4zB,cAAgB+G,EACrBA,EAAMje,SACN1c,KAAK4vB,cAAgB+K,EAAM7K,MAC3B9vB,KAAK4/B,iBAAmBjF,EAAMkF,kBAG9B7/B,KAAK2vB,aAAegL,EAAM7K,MAAM,GAChC9vB,KAAK6xB,gBAAkB7xB,KAAK4/B,iBAAiB,KAG/C3U,EAAM0U,sBAAwB,WACvB3/B,KAAK4zB,eACR5zB,KAAK4zB,cAAc6B,YAIvBxK,EAAM8R,mBAAqB,WACzB,GAAI+C,GAAe9/B,KAAK4N,QAAQkyB,YAEhC,IAAK9/B,KAAKg9B,gBAER,WADAh9B,MAAK0c,OAAQ1c,KAAKyD,eAAe,GAAO,EAI1C,IAAKq8B,GAAuC,gBAAhBA,GAA2B,CAErD,GADW9/B,KAAK+/B,UAAWD,GAGzB,WADA9/B,MAAKiwB,WAAY6P,GAAc,GAAO,GAK1C,GAAIvmB,GAAQ,CAEPumB,IAAgB9/B,KAAKqY,OAAQynB,KAChCvmB,EAAQumB,GAGV9/B,KAAK0c,OAAQnD,GAAO,GAAO,IAO7B0R,EAAMgF,WAAa,SAAUtsB,EAAO07B,EAAQ3P,GAE1C,GAAI9V,GAAO5Z,KAAK+/B,UAAWp8B,EAC3B,IAAMiW,EAAN,CAIA,GAAIL,GAAQvZ,KAAKgyB,kBAAmBpY,EACpC5Z,MAAK0c,OAAQnD,EAAO8lB,EAAQ3P,KAG9BzE,EAAM+G,kBAAoB,SAAUpY,GAElC,IAAM,GAAIpH,GAAE,EAAGA,EAAIxS,KAAKqY,OAAO5P,OAAQ+J,IAAM,CAG3C,IAAe,GAFHxS,KAAKqY,OAAO7F,GACNsd,MAAMtlB,QAASoP,GAE/B,MAAOpH,KAYbyY,EAAMuG,QAAU,SAAU1sB,GAExB,IAAM,GAAI0N,GAAE,EAAGA,EAAIxS,KAAK8vB,MAAMrnB,OAAQ+J,IAAM,CAC1C,GAAIoH,GAAO5Z,KAAK8vB,MAAMtd,EACtB,IAAKoH,EAAKnC,SAAW3S,EACnB,MAAO8U,KAUbqR,EAAMoG,SAAW,SAAUrE,GACzBA,EAAQjB,EAAMQ,UAAWS,EACzB,IAAI8C,KAOJ,OANA9C,GAAMxqB,QAAS,SAAUsC,GACvB,GAAI8U,GAAO5Z,KAAKwxB,QAAS1sB,EACpB8U,IACHkW,EAAM5f,KAAM0J,IAEb5Z,MACI8vB,GAOT7E,EAAM4U,gBAAkB,WACtB,MAAO7/B,MAAK8vB,MAAM9nB,IAAK,SAAU4R,GAC/B,MAAOA,GAAKnC,WAShBwT,EAAM+P,cAAgB,SAAUl2B,GAE9B,GAAI8U,GAAO5Z,KAAKwxB,QAAS1sB,EACzB,OAAK8U,KAIL9U,EAAOinB,EAAMa,UAAW9nB,EAAM,wBACvB9E,KAAKwxB,QAAS1sB,KASvBmmB,EAAM+U,wBAA0B,SAAUC,EAAU1mB,GAClD,IAAM0mB,EACJ,MAAOjgC,MAAK4zB,cAAciM,iBAE5BtmB,OAAkBlM,KAAVkM,EAAsBvZ,KAAKyD,cAAgB8V,CAEnD,IAAIuX,GAAM9wB,KAAKqY,OAAO5P,MACtB,IAAK,EAAiB,EAAXw3B,GAAkBnP,EAC3B,MAAO9wB,MAAK6/B,iBAId,KAAM,GADFK,MACM1tB,EAAI+G,EAAQ0mB,EAAUztB,GAAK+G,EAAQ0mB,EAAWztB,IAAM,CAC5D,GAAIkoB,GAAa16B,KAAK4N,QAAQ4D,WAAaua,EAAMI,OAAQ3Z,EAAGse,GAAQte,EAChEmoB,EAAQ36B,KAAKqY,OAAQqiB,EACpBC,KACHuF,EAAYA,EAAUzR,OAAQkM,EAAMkF,oBAGxC,MAAOK,IAOTjV,EAAM8U,UAAY,SAAUhsB,GAC1B,GAAwB,gBAAZA,GAEV,MAAO/T,MAAK8vB,MAAO/b,EAErB,IAAwB,gBAAZA,GAAuB,CAEjC,GAAKA,EAAS+Z,MAAM,iBAClB,MAGF/Z,GAAW/T,KAAKyX,QAAQ1W,cAAegT,GAGzC,MAAO/T,MAAKwxB,QAASzd,IAKvBkX,EAAMkV,SAAW,WACfngC,KAAK2rB,UAAU,aAIjBV,EAAMmV,mBAAqB,SAAUr7B,GAEhB,cAAdA,EAAMjC,MACTiC,EAAMG,iBAERlF,KAAKuM,SAKP0e,EAAMoV,SAAW,WACfrgC,KAAK08B,WACL18B,KAAKwY,UAGPuT,EAAMqB,eAAgB9nB,EAAU,WAAY,KAE5C2lB,EAAMzS,OAAS,WACb,GAAMxY,KAAK0lB,SAAX,CAGA1lB,KAAKyxB,UAEAzxB,KAAK4N,QAAQ4D,aAChBxR,KAAKuO,EAAIwd,EAAMI,OAAQnsB,KAAKuO,EAAGvO,KAAK6yB,iBAEtC7yB,KAAKk9B,gBACLl9B,KAAK+xB,qBACL/xB,KAAK4F,iBACL5F,KAAK2rB,UAAU,SAGf,IAAIkG,GAAkB7xB,KAAK4/B,kBAAoB5/B,KAAK4/B,iBAAiB,EACrE5/B,MAAKiwB,WAAY4B,GAAiB,GAAO,KAI3C5G,EAAMyR,SAAW,WACG18B,KAAK4N,QAAQ8uB,YAOW,GAFvBR,EAAkBl8B,KAAKyX,QAAS,UAAW6M,QAE5C9Z,QAAQ,YACxBxK,KAAK28B,WAEL38B,KAAKsgC,eAOTrV,EAAMsV,UAAY,SAAUx7B,GAE1B,GAAIy7B,GAAen/B,SAASC,eAAiBD,SAASC,eAAiBtB,KAAKyX,OAC5E,IAAMzX,KAAK4N,QAAQwuB,gBAAgBoE,EAAnC,CAIA,GAAIC,GAAUn7B,EAASuK,iBAAkB9K,EAAM2H,QAC1C+zB,IACHA,EAAQr8B,KAAMpE,QAIlBsF,EAASuK,kBAEP6wB,GAAI,WACF,GAAIC,GAAa3gC,KAAK4N,QAAQulB,YAAc,OAAS,UACrDnzB,MAAKmgC,WACLngC,KAAM2gC,MAGRC,GAAI,WACF,GAAIC,GAAc7gC,KAAK4N,QAAQulB,YAAc,WAAa,MAC1DnzB,MAAKmgC,WACLngC,KAAM6gC,OAMV5V,EAAM1e,MAAQ,WAGZ,GAAIu0B,GAAcvgC,EAAOwG,WACzB/G,MAAKyX,QAAQlL,OAAQw0B,eAAe,IAE/BxgC,EAAOwG,aAAe+5B,GACzBvgC,EAAOygC,SAAUzgC,EAAO41B,YAAa2K,IAOzC7V,EAAMqV,WAAa,WACXtgC,KAAK0lB,WAGX1lB,KAAKyX,QAAQjW,UAAUO,OAAO,oBAC9B/B,KAAKyX,QAAQjW,UAAUO,OAAO,gBAC9B/B,KAAK2/B,wBAEL3/B,KAAK8vB,MAAMttB,QAAS,SAAUoX,GAC5BA,EAAKmK,YAEP/jB,KAAKyX,QAAQrK,YAAapN,KAAK2Y,UAE/B8iB,EAAcz7B,KAAKoF,OAAOiD,SAAUrI,KAAKyX,SACpCzX,KAAK4N,QAAQwuB,gBAChBp8B,KAAKyX,QAAQ0B,gBAAgB,YAC7BnZ,KAAKyX,QAAQyP,oBAAqB,UAAWlnB,OAG/CA,KAAK0lB,UAAW,EAChB1lB,KAAK2rB,UAAU,gBAGjBV,EAAMlH,QAAU,WACd/jB,KAAKsgC,aACL//B,EAAO2mB,oBAAqB,SAAUlnB,MACtCA,KAAK6rB,SACL7rB,KAAK2rB,UAAU,WACVgD,GAAU3uB,KAAK+7B,UAClBpN,EAAOsS,WAAYjhC,KAAKyX,QAAS,kBAE5BzX,MAAKyX,QAAQmkB,mBACbC,GAAW77B,KAAKw8B,OAKzBzQ,EAAM1f,OAAQ4e,EAAOiH,GASrB5sB,EAASgO,KAAO,SAAUxO,GACxBA,EAAOinB,EAAMc,gBAAiB/nB,EAC9B,IAAIlC,GAAKkC,GAAQA,EAAK82B,YACtB,OAAOh5B,IAAMi5B,EAAWj5B,IAG1BmpB,EAAMmC,SAAU5oB,EAAU,YAErBqpB,GAAUA,EAAOuS,SACpBvS,EAAOuS,QAAS,WAAY57B,GAI9BA,EAAS67B,UAAY,SAAUC,GAC7BzS,EAASyS,GAGX97B,EAASiwB,KAAOA,EAChBjwB,EAASi2B,MAAQA,EAEVj2B;;CCn5BP,SAAY/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,SACA,qBACA,cACA,WACA,oBACA,cACCD,GACwB,gBAAV5pB,SAAsBA,OAAOC,UAE9CD,OAAOC,QAAU2pB,EACfvmB,QAAQ,cACRA,QAAQ,UACRA,QAAQ,sBACRA,QAAQ,eACRA,QAAQ,YACRA,QAAQ,qBACRA,QAAQ,iBAIVvD,OAAQ,SAAkB+E,GAE5B,MAAOA;;CCvCP,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,wBACC,SAAUhlB,EAAUymB,GACrB,MAAO1B,GAAS9pB,EAAQ+E,EAAUymB,KAET,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,mBAIVumB,EACE9pB,EACAA,EAAO+E,SACP/E,EAAOurB,eAIVvrB,OAAQ,SAAkBA,EAAQ+E,EAAUymB,GAC/C,YA6BA,SAASsV,GAAmBpG,GAE1B,GAA0B,OAArBA,EAAS/C,SAAoB,CAChC,GAAIoJ,GAAerG,EAAS90B,aAAa,0BACrCo7B,EAAUtG,EAAS90B,aAAa,8BAChCq7B,EAAavG,EAAS90B,aAAa,gCACvC,IAAKm7B,GAAgBC,GAAWC,EAC9B,OAASvG,GAIb,GAEIwG,GAAOxG,EAAS/5B,iBAFD,mGAGnB,OAAO6qB,GAAMQ,UAAWkV,GAQ1B,QAASC,GAAYC,EAAKppB,GACxBvY,KAAK2hC,IAAMA,EACX3hC,KAAKuY,SAAWA,EAChBvY,KAAKwG,OApDPlB,EAASwpB,cAAc5e,KAAK,kBAC5B,IAAI+a,GAAQ3lB,EAASpB,SAmGrB,OAjGA+mB,GAAM2W,gBAAkB,WACtB5hC,KAAKF,GAAI,SAAUE,KAAK6hC,WAG1B5W,EAAM4W,SAAW,WACf,GAAIA,GAAW7hC,KAAK4N,QAAQi0B,QAC5B,IAAMA,EAAN,CAIA,GAAI5B,GAA8B,gBAAZ4B,GAAuBA,EAAW,EACpD3B,EAAYlgC,KAAKggC,wBAAyBC,GAE1C6B,IACJ5B,GAAU19B,QAAS,SAAUy4B,GAC3B,GAAI8G,GAAiBV,EAAmBpG,EACxC6G,GAAaA,EAAWrT,OAAQsT,KAGlCD,EAAWt/B,QAAS,SAAUm/B,GAC5B,GAAID,GAAYC,EAAK3hC,OACpBA,QA+BL0hC,EAAWx9B,UAAU4oB,YAAcf,EAAMe,YAEzC4U,EAAWx9B,UAAUsC,KAAO,WAC1BxG,KAAK2hC,IAAIxgC,iBAAkB,OAAQnB,MACnCA,KAAK2hC,IAAIxgC,iBAAkB,QAASnB,KAEpC,IAAIgiC,GAAMhiC,KAAK2hC,IAAIx7B,aAAa,2BAC9BnG,KAAK2hC,IAAIx7B,aAAa,8BACpB87B,EAASjiC,KAAK2hC,IAAIx7B,aAAa,gCAEnCnG,MAAK2hC,IAAIK,IAAMA,EACVC,GACHjiC,KAAK2hC,IAAItxB,aAAc,SAAU4xB,GAGnCjiC,KAAK2hC,IAAIxoB,gBAAgB,0BACzBnZ,KAAK2hC,IAAIxoB,gBAAgB,8BACzBnZ,KAAK2hC,IAAIxoB,gBAAgB,kCAG3BuoB,EAAWx9B,UAAUg+B,OAAS,SAAUn9B,GACtC/E,KAAKmiC,SAAUp9B,EAAO,wBAGxB28B,EAAWx9B,UAAUk+B,QAAU,SAAUr9B,GACvC/E,KAAKmiC,SAAUp9B,EAAO,uBAGxB28B,EAAWx9B,UAAUi+B,SAAW,SAAUp9B,EAAOmU,GAE/ClZ,KAAK2hC,IAAIza,oBAAqB,OAAQlnB,MACtCA,KAAK2hC,IAAIza,oBAAqB,QAASlnB,KAEvC,IAAI4Z,GAAO5Z,KAAKuY,SAASyiB,cAAeh7B,KAAK2hC,KACzC1G,EAAWrhB,GAAQA,EAAKnC,OAC5BzX,MAAKuY,SAASgZ,eAAgB0J,GAE9Bj7B,KAAK2hC,IAAIngC,UAAUY,IAAK8W,GACxBlZ,KAAKuY,SAASob,cAAe,WAAY5uB,EAAOk2B,IAKlD31B,EAASo8B,WAAaA,EAEfp8B;;CClIL,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,wBACA,wBACC,SAAUhlB,EAAU+8B,EAAYtW,GACjC,MAAO1B,GAAS9pB,EAAQ+E,EAAU+8B,EAAYtW,KAErB,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIVumB,EACE9pB,EACAA,EAAO+E,SACP/E,EAAO8hC,WACP9hC,EAAOurB,eAIVvrB,OAAQ,SAAkBA,EAAQ+E,EAAU+8B,EAAYtW,GAI3D,YAEA,SAASuW,GAAUriC,GACjBD,KAAKC,OAASA,EACdD,KAAKi8B,UAGPqG,EAASp+B,UAAYof,OAAOkS,OAAQ6M,EAAWn+B,WAE/Co+B,EAASp+B,UAAU+3B,QAAU,WAE3Bj8B,KAAKuiC,OAASlhC,SAAS0X,cAAc,MACrC/Y,KAAKuiC,OAAOrpB,UAAY,qBAExBlZ,KAAK6Y,QAEL7Y,KAAKwiC,YAAcxiC,KAAKyiC,QAAQ5+B,KAAM7D,MACtCA,KAAKF,GAAI,cAAeE,KAAKC,OAAOmgC,mBAAmBv8B,KAAM7D,KAAKC,UAGpEqiC,EAASp+B,UAAUy4B,SAAW,WAC5B38B,KAAK0iC,UACL1iC,KAAKuiC,OAAOphC,iBAAkB,QAASnB,KAAKwiC,aAC5CxiC,KAAK2iC,eAAgB3iC,KAAKuiC,QAE1BviC,KAAKC,OAAOwX,QAAQ2B,YAAapZ,KAAKuiC,SAGxCD,EAASp+B,UAAUo8B,WAAa,WAC9BtgC,KAAKuiC,OAAOrb,oBAAqB,QAASlnB,KAAKwiC,aAC/CxiC,KAAK4iC,iBAAkB5iC,KAAKuiC,QAE5BviC,KAAKC,OAAOwX,QAAQrK,YAAapN,KAAKuiC,SAGxCD,EAASp+B,UAAUw+B,QAAU,WAE3B,GAAI7H,GAAQ76B,KAAKC,OAAOoY,OAAO5P,OAASzI,KAAK6Y,KAAKpQ,MAC7CoyB,GAAQ,EACX76B,KAAK6iC,QAAShI,GACJA,EAAQ,GAClB76B,KAAK8iC,YAAajI,IAItByH,EAASp+B,UAAU2+B,QAAU,SAAU35B,GAMrC,IAAM,GALFwnB,GAAWrvB,SAASsvB,yBACpBoS,KACAt6B,EAASzI,KAAK6Y,KAAKpQ,OACnBsG,EAAMtG,EAASS,EAETsJ,EAAI/J,EAAQ+J,EAAIzD,EAAKyD,IAAM,CACnC,GAAIsG,GAAMzX,SAAS0X,cAAc,KACjCD,GAAII,UAAY,MAChBJ,EAAIzI,aAAc,aAAc,aAAgBmC,EAAI,IACpDke,EAAStX,YAAaN,GACtBiqB,EAAQ7yB,KAAM4I,GAGhB9Y,KAAKuiC,OAAOnpB,YAAasX,GACzB1wB,KAAK6Y,KAAO7Y,KAAK6Y,KAAK4V,OAAQsU,IAGhCT,EAASp+B,UAAU4+B,WAAa,SAAU55B,GAEvBlJ,KAAK6Y,KAAK6S,OAAQ1rB,KAAK6Y,KAAKpQ,OAASS,EAAOA,GAElD1G,QAAS,SAAUsW,GAC5B9Y,KAAKuiC,OAAOn1B,YAAa0L,IACxB9Y,OAGLsiC,EAASp+B,UAAU8+B,eAAiB,WAE7BhjC,KAAKijC,cACRjjC,KAAKijC,YAAY/pB,UAAY,MAC7BlZ,KAAKijC,YAAY9pB,gBAAgB,iBAG7BnZ,KAAK6Y,KAAKpQ,SAGhBzI,KAAKijC,YAAcjjC,KAAK6Y,KAAM7Y,KAAKC,OAAOwD,eAC1CzD,KAAKijC,YAAY/pB,UAAY,kBAC7BlZ,KAAKijC,YAAY5yB,aAAc,eAAgB,UAGjDiyB,EAASp+B,UAAUg/B,MACnBZ,EAASp+B,UAAUu+B,QAAU,SAAU19B,GACrC,GAAIlD,GAASkD,EAAMlD,MAEnB,IAAwB,MAAnBA,EAAOq2B,SAAZ,CAIAl4B,KAAKC,OAAOkgC,UACZ,IAAI5mB,GAAQvZ,KAAK6Y,KAAKrO,QAAS3I,EAC/B7B,MAAKC,OAAOyc,OAAQnD,KAGtB+oB,EAASp+B,UAAU6f,QAAU,WAC3B/jB,KAAKsgC,aACLtgC,KAAK6rB,UAGPvmB,EAASg9B,SAAWA,EAIpBvW,EAAM1f,OAAQ/G,EAAS8wB,UACrBzwB,UAAU,IAGZL,EAASwpB,cAAc5e,KAAK,kBAE5B,IAAI+a,GAAQ3lB,EAASpB,SAmCrB,OAjCA+mB,GAAMkY,gBAAkB,WAChBnjC,KAAK4N,QAAQjI,WAGnB3F,KAAK2F,SAAW,GAAI28B,GAAUtiC,MAE9BA,KAAKF,GAAI,WAAYE,KAAKojC,kBAC1BpjC,KAAKF,GAAI,SAAUE,KAAKqjC,wBACxBrjC,KAAKF,GAAI,aAAcE,KAAKsjC,gBAC5BtjC,KAAKF,GAAI,SAAUE,KAAKsjC,gBACxBtjC,KAAKF,GAAI,aAAcE,KAAKujC,sBAG9BtY,EAAMmY,iBAAmB,WACvBpjC,KAAK2F,SAASg3B,YAGhB1R,EAAMoY,uBAAyB,WAC7BrjC,KAAK2F,SAASq9B,kBAGhB/X,EAAMqY,eAAiB,WACrBtjC,KAAK2F,SAAS+8B,WAGhBzX,EAAMsY,mBAAqB,WACzBvjC,KAAK2F,SAAS26B,cAKhBh7B,EAASg9B,SAAWA,EAEbh9B;;CCxLL,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,wBACA,uBACA,cACC,SAAUU,EAAWe,EAAOzmB,GAC7B,MAAO+kB,GAASW,EAAWe,EAAOzmB,KAET,gBAAV7E,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACfvmB,QAAQ,cACRA,QAAQ,kBACRA,QAAQ,eAIVumB,EACE9pB,EAAOyqB,UACPzqB,EAAOurB,aACPvrB,EAAO+E,WAIV/E,OAAQ,SAAkByqB,EAAWe,EAAOzmB,GAE/C,YAIA,SAASk+B,GAAQvjC,GACfD,KAAKC,OAASA,EACdD,KAAKyjC,MAAQ,UAEbzjC,KAAK0jC,mBAAqB1jC,KAAK2jC,iBAAiB9/B,KAAM7D,MACtDA,KAAK4jC,iBAAmB5jC,KAAK6jC,eAAehgC,KAAM7D,MAGpDwjC,EAAOt/B,UAAYof,OAAOkS,OAAQxK,EAAU9mB,WAG5Cs/B,EAAOt/B,UAAU6V,KAAO,WACtB,GAAmB,WAAd/Z,KAAKyjC,MAAV,CAKA,GADmBpiC,SAASyiC,OAG1B,WADAziC,UAASF,iBAAkB,mBAAoBnB,KAAK4jC,iBAItD5jC,MAAKyjC,MAAQ,UAEbpiC,SAASF,iBAAkB,mBAAoBnB,KAAK0jC,oBAEpD1jC,KAAK+jC,SAGPP,EAAOt/B,UAAU6/B,KAAO,WAEtB,GAAmB,WAAd/jC,KAAKyjC,MAAV,CAIA,GAAIniB,GAAOthB,KAAKC,OAAO2N,QAAQ/H,QAE/Byb,GAAsB,gBAARA,GAAmBA,EAAO,GACxC,IAAIoM,GAAQ1tB,IAEZA,MAAK0L,QACL1L,KAAKiC,QAAUK,WAAY,WACzBorB,EAAMztB,OAAOgN,MAAM,GACnBygB,EAAMqW,QACLziB,KAGLkiB,EAAOt/B,UAAU8/B,KAAO,WACtBhkC,KAAKyjC,MAAQ,UACbzjC,KAAK0L,QAELrK,SAAS6lB,oBAAqB,mBAAoBlnB,KAAK0jC,qBAGzDF,EAAOt/B,UAAUwH,MAAQ,WACvBvJ,aAAcnC,KAAKiC,UAGrBuhC,EAAOt/B,UAAU+V,MAAQ,WACJ,WAAdja,KAAKyjC,QACRzjC,KAAKyjC,MAAQ,SACbzjC,KAAK0L,UAIT83B,EAAOt/B,UAAU+/B,QAAU,WAEN,UAAdjkC,KAAKyjC,OACRzjC,KAAK+Z,QAKTypB,EAAOt/B,UAAUy/B,iBAAmB,WAElC3jC,KADmBqB,SAASyiC,OACP,QAAU,cAGjCN,EAAOt/B,UAAU2/B,eAAiB,WAChC7jC,KAAK+Z,OACL1Y,SAAS6lB,oBAAqB,mBAAoBlnB,KAAK4jC,mBAKzD7X,EAAM1f,OAAQ/G,EAAS8wB,UACrB8N,sBAAsB,IAGxB5+B,EAASwpB,cAAc5e,KAAK,gBAC5B,IAAI+a,GAAQ3lB,EAASpB,SA+DrB,OA7DA+mB,GAAMkZ,cAAgB,WACpBnkC,KAAKokC,OAAS,GAAIZ,GAAQxjC,MAE1BA,KAAKF,GAAI,WAAYE,KAAKqkC,gBAC1BrkC,KAAKF,GAAI,WAAYE,KAAKskC,YAC1BtkC,KAAKF,GAAI,cAAeE,KAAKskC,YAC7BtkC,KAAKF,GAAI,aAAcE,KAAKukC,mBAG9BtZ,EAAMoZ,eAAiB,WACfrkC,KAAK4N,QAAQ/H,WAGnB7F,KAAKokC,OAAOrqB,OACZ/Z,KAAKyX,QAAQtW,iBAAkB,aAAcnB,QAK/CirB,EAAMuZ,WAAa,WACjBxkC,KAAKokC,OAAOrqB,QAGdkR,EAAMqZ,WAAa,WACjBtkC,KAAKokC,OAAOJ,QAGd/Y,EAAMwZ,YAAc,WAClBzkC,KAAKokC,OAAOnqB,SAGdgR,EAAMyZ,cAAgB,WACpB1kC,KAAKokC,OAAOH,WAGdhZ,EAAMsZ,iBAAmB,WACvBvkC,KAAKokC,OAAOJ,OACZhkC,KAAKyX,QAAQyP,oBAAqB,aAAclnB,OAMlDirB,EAAM0Z,aAAe,WACb3kC,KAAK4N,QAAQs2B,uBAGnBlkC,KAAKokC,OAAOnqB,QACZja,KAAKyX,QAAQtW,iBAAkB,aAAcnB,QAI/CirB,EAAM2Z,aAAe,WACnB5kC,KAAKokC,OAAOH,UACZjkC,KAAKyX,QAAQyP,oBAAqB,aAAclnB,OAKlDsF,EAASk+B,OAASA,EAEXl+B;;CC3LL,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,aACA,wBACA,wBACC,SAAUhlB,EAAU+8B,EAAYtW,GACjC,MAAO1B,GAAS9pB,EAAQ+E,EAAU+8B,EAAYtW,KAErB,gBAAVtrB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIVumB,EACE9pB,EACAA,EAAO+E,SACP/E,EAAO8hC,WACP9hC,EAAOurB,eAIVvrB,OAAQ,SAAkBA,EAAQ+E,EAAU+8B,EAAYtW,GAC3D,YAMA,SAAS8Y,GAAgBxL,EAAWp5B,GAClCD,KAAKq5B,UAAYA,EACjBr5B,KAAKC,OAASA,EACdD,KAAKi8B,UA8DP,QAAS6I,GAAmBC,GAE1B,MAAqB,gBAATA,GACHA,EAGF,KAAOA,EAAMrzB,GAAK,SACfqzB,EAAMpzB,GAAK,KAAQozB,EAAMnzB,GAAK,IACtC,MAAQmzB,EAAMlzB,GAAK,KAAQkzB,EAAMjzB,GAAK,IACtC,MAAQizB,EAAMhzB,GAAK,UACXgzB,EAAMlzB,GAAK,KAAQ,GAAKkzB,EAAMjzB,IACtC,MAAQizB,EAAMpzB,GAAK,KAAQ,GAAKozB,EAAMnzB,IACtC,KAjFJ,GAAIozB,GAAS,4BAUbH,GAAe3gC,UAAYof,OAAOkS,OAAQ6M,EAAWn+B,WAErD2gC,EAAe3gC,UAAU+3B,QAAU,WAEjCj8B,KAAKilC,WAAY,EACjBjlC,KAAKklC,YAAgC,GAAnBllC,KAAKq5B,SACvB,IAAI8L,GAAgBnlC,KAAKC,OAAO2N,QAAQulB,YAAc,GAAK,CAC3DnzB,MAAKolC,OAASplC,KAAKq5B,WAAa8L,CAEhC,IAAI1tB,GAAUzX,KAAKyX,QAAUpW,SAAS0X,cAAc,SACpDtB,GAAQyB,UAAY,4CACpBzB,EAAQyB,WAAalZ,KAAKklC,WAAa,YAAc,QAErDztB,EAAQpH,aAAc,OAAQ,UAE9BrQ,KAAKqlC,UAEL5tB,EAAQpH,aAAc,aAAcrQ,KAAKklC,WAAa,WAAa,OAGnE,IAAII,GAAMtlC,KAAKulC,WACf9tB,GAAQ2B,YAAaksB,GAErBtlC,KAAKC,OAAOH,GAAI,SAAUE,KAAKsb,OAAOzX,KAAM7D,OAC5CA,KAAKF,GAAI,cAAeE,KAAKC,OAAOmgC,mBAAmBv8B,KAAM7D,KAAKC,UAGpE4kC,EAAe3gC,UAAUy4B,SAAW,WAClC38B,KAAK2iC,eAAgB3iC,KAAKyX,SAC1BzX,KAAKyX,QAAQtW,iBAAkB,QAASnB,MAExCA,KAAKC,OAAOwX,QAAQ2B,YAAapZ,KAAKyX,UAGxCotB,EAAe3gC,UAAUo8B,WAAa,WAEpCtgC,KAAKC,OAAOwX,QAAQrK,YAAapN,KAAKyX,SAEtCzX,KAAK4iC,iBAAkB5iC,KAAKyX,SAC5BzX,KAAKyX,QAAQyP,oBAAqB,QAASlnB,OAG7C6kC,EAAe3gC,UAAUqhC,UAAY,WACnC,GAAID,GAAMjkC,SAASmkC,gBAAiBR,EAAQ,MAC5CM,GAAIj1B,aAAc,QAAS,wBAC3Bi1B,EAAIj1B,aAAc,UAAW,cAC7B,IAAIo1B,GAAOpkC,SAASmkC,gBAAiBR,EAAQ,QACzCU,EAAgBZ,EAAmB9kC,KAAKC,OAAO2N,QAAQ6D,WAQ3D,OAPAg0B,GAAKp1B,aAAc,IAAKq1B,GACxBD,EAAKp1B,aAAc,QAAS,SAEtBrQ,KAAKolC,QACTK,EAAKp1B,aAAc,YAAa,oCAElCi1B,EAAIlsB,YAAaqsB,GACVH,GAmBTT,EAAe3gC,UAAU4oB,YAAcf,EAAMe,YAE7C+X,EAAe3gC,UAAUyhC,QAAU,WACjC,GAAM3lC,KAAKilC,UAAX,CAGAjlC,KAAKC,OAAOkgC,UACZ,IAAIpV,GAAS/qB,KAAKklC,WAAa,WAAa,MAC5CllC,MAAKC,OAAQ8qB,OAKf8Z,EAAe3gC,UAAU0hC,OAAS,WAC3B5lC,KAAKilC,YAGVjlC,KAAKyX,QAAQ1L,UAAW,EACxB/L,KAAKilC,WAAY,IAGnBJ,EAAe3gC,UAAUmhC,QAAU,WAC3BrlC,KAAKilC,YAGXjlC,KAAKyX,QAAQ1L,UAAW,EACxB/L,KAAKilC,WAAY,IAGnBJ,EAAe3gC,UAAUoX,OAAS,WAEhC,GAAIjD,GAASrY,KAAKC,OAAOoY,MAEzB,IAAKrY,KAAKC,OAAO2N,QAAQ4D,YAAc6G,EAAO5P,OAAS,EAErD,WADAzI,MAAK4lC,QAGP,IAAI7V,GAAY1X,EAAO5P,OAAS4P,EAAO5P,OAAS,EAAI,EAChDo9B,EAAa7lC,KAAKklC,WAAa,EAAInV,CAEvC/vB,MADaA,KAAKC,OAAOwD,eAAiBoiC,EAAa,UAAY,aAIrEhB,EAAe3gC,UAAU6f,QAAU,WACjC/jB,KAAKsgC,aACLtgC,KAAK6rB,UAKPE,EAAM1f,OAAQ/G,EAAS8wB,UACrB1wB,iBAAiB,EACjB+L,YACEC,GAAI,GACJC,GAAI,GAAIC,GAAI,GACZC,GAAI,GAAIC,GAAI,GACZC,GAAI,MAIRzM,EAASwpB,cAAc5e,KAAK,yBAC5B,IAAI+a,GAAQ3lB,EAASpB,SA6BrB,OA3BA+mB,GAAM6a,uBAAyB,WACvB9lC,KAAK4N,QAAQlI,kBAInB1F,KAAKwc,WAAa,GAAIqoB,IAAiB,EAAG7kC,MAC1CA,KAAK+lC,WAAa,GAAIlB,GAAgB,EAAG7kC,MAEzCA,KAAKF,GAAI,WAAYE,KAAKgmC,2BAG5B/a,EAAM+a,wBAA0B,WAC9BhmC,KAAKwc,WAAWmgB,WAChB38B,KAAK+lC,WAAWpJ,WAChB38B,KAAKF,GAAI,aAAcE,KAAKimC,4BAG9Bhb,EAAMgb,0BAA4B,WAChCjmC,KAAKwc,WAAW8jB,aAChBtgC,KAAK+lC,WAAWzF,aAChBtgC,KAAKmnB,IAAK,aAAcnnB,KAAKimC,4BAK/B3gC,EAASu/B,eAAiBA,EAEnBv/B;;CC/ML,SAAU/E,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,OAAQD,GACmB,gBAAV5pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,KAGjB9pB,EAAO+E,SAAW/E,EAAO+E,aACzB/E,EAAO+E,SAASi2B,MAAQlR,MAGzB9pB,OAAQ,WACX,YAEA,SAASg7B,GAAOt7B,GACdD,KAAKC,OAASA,EACdD,KAAKw9B,aAAoC,QAArBv9B,EAAO01B,WAC3B31B,KAAK8vB,SACL9vB,KAAK20B,WAAa,EAClB30B,KAAK6O,OAAS,EAGhB,GAAIoc,GAAQsQ,EAAMr3B,SA4ClB,OA1CA+mB,GAAM2S,QAAU,SAAUhkB,GAKxB,GAJA5Z,KAAK8vB,MAAM5f,KAAM0J,GACjB5Z,KAAK20B,YAAc/a,EAAKqC,KAAK0Y,WAC7B30B,KAAK6O,OAASC,KAAKC,IAAK6K,EAAKqC,KAAKwK,YAAazmB,KAAK6O,QAE1B,GAArB7O,KAAK8vB,MAAMrnB,OAAc,CAC5BzI,KAAKuO,EAAIqL,EAAKrL,CACd,IAAIqwB,GAAc5+B,KAAKw9B,aAAe,aAAe,aACrDx9B,MAAK89B,YAAclkB,EAAKqC,KAAM2iB,KAIlC3T,EAAM4K,aAAe,WACnB,GAAIgJ,GAAY7+B,KAAKw9B,aAAe,cAAgB,aAChD0I,EAAWlmC,KAAKm9B,cAChBgJ,EAAaD,EAAWA,EAASjqB,KAAM4iB,GAAc,EACrDhB,EAAa79B,KAAK20B,YAAe30B,KAAK89B,YAAcqI,EACxDnmC,MAAK6B,OAAS7B,KAAKuO,EAAIvO,KAAK89B,YAAcD,EAAa79B,KAAKC,OAAOsF,WAGrE0lB,EAAMkS,YAAc,WAClB,MAAOn9B,MAAK8vB,MAAO9vB,KAAK8vB,MAAMrnB,OAAS,IAGzCwiB,EAAMvO,OAAS,WACb1c,KAAK8vB,MAAMttB,QAAS,SAAUoX,GAC5BA,EAAK8C,YAITuO,EAAMwK,SAAW,WACfz1B,KAAK8vB,MAAMttB,QAAS,SAAUoX,GAC5BA,EAAK6b,cAITxK,EAAM4U,gBAAkB,WACtB,MAAO7/B,MAAK8vB,MAAM9nB,IAAK,SAAU4R,GAC/B,MAAOA,GAAKnC,WAIT8jB;;CC9DP,SAAYh7B,EAAQ8pB,GAEI,kBAAVC,SAAwBA,OAAOC,IAEzCD,OAAQD,GACmB,gBAAV5pB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,IAGjB9pB,EAAOkxB,QAAUpH,KAGjB9pB,OAAQ,WACZ,YAKA,SAAS6lC,GAAcziC,GACrB,GAAIyoB,GAAMvU,WAAYlU,EAGtB,QADqC,GAAvBA,EAAM6G,QAAQ,OAAe2B,MAAOigB,IAChCA,EAGpB,QAASia,MA0BT,QAASC,KASP,IAAM,GARFrqB,IACFhX,MAAO,EACP4J,OAAQ,EACRiL,WAAY,EACZjT,YAAa,EACb8tB,WAAY,EACZlO,YAAa,GAELjU,EAAE,EAAGA,EAAI+zB,EAAoB/zB,IAAM,CAE3CyJ,EADkBuqB,EAAah0B,IACT,EAExB,MAAOyJ,GAST,QAASwqB,GAAU3hC,GACjB,GAAImK,GAAQitB,iBAAkBp3B,EAM9B,OALMmK,IACJy3B,EAAU,kBAAoBz3B,EAC5B,6FAGGA,EAcT,QAAS03B,KAEP,IAAKC,EAAL,CAGAA,GAAU,CAQV,IAAIva,GAAMhrB,SAAS0X,cAAc,MACjCsT,GAAIpd,MAAMhK,MAAQ,QAClBonB,EAAIpd,MAAM43B,QAAU,kBACpBxa,EAAIpd,MAAM63B,YAAc,QACxBza,EAAIpd,MAAM83B,YAAc,kBACxB1a,EAAIpd,MAAM+3B,UAAY,YAEtB,IAAI3iB,GAAOhjB,SAASgjB,MAAQhjB,SAASE,eACrC8iB,GAAKjL,YAAaiT,EAClB,IAAIpd,GAAQw3B,EAAUpa,EAEtB4a,GAA8D,KAA7Cn4B,KAAKilB,MAAOqS,EAAcn3B,EAAMhK,QACjDwsB,EAAQwV,eAAiBA,EAEzB5iB,EAAKjX,YAAaif,IAKpB,QAASoF,GAAS3sB,GAShB,GARA6hC,IAGoB,gBAAR7hC,KACVA,EAAOzD,SAASN,cAAe+D,IAI3BA,GAAuB,gBAARA,IAAqBA,EAAKoiC,SAA/C,CAIA,GAAIj4B,GAAQw3B,EAAU3hC,EAGtB,IAAsB,QAAjBmK,EAAMk4B,QACT,MAAOb,IAGT,IAAIrqB,KACJA,GAAKhX,MAAQH,EAAKsiC,YAClBnrB,EAAKpN,OAAS/J,EAAKuiC,YAKnB,KAAM,GAHFC,GAAcrrB,EAAKqrB,YAAiC,cAAnBr4B,EAAM+3B,UAGjCx0B,EAAE,EAAGA,EAAI+zB,EAAoB/zB,IAAM,CAC3C,GAAI+0B,GAAcf,EAAah0B,GAC3B7O,EAAQsL,EAAOs4B,GACfnb,EAAMvU,WAAYlU,EAEtBsY,GAAMsrB,GAAiBp7B,MAAOigB,GAAc,EAANA,EAGxC,GAAIob,GAAevrB,EAAKwrB,YAAcxrB,EAAKyrB,aACvCC,EAAgB1rB,EAAK2rB,WAAa3rB,EAAK4rB,cACvCC,EAAc7rB,EAAK8rB,WAAa9rB,EAAK+rB,YACrCC,EAAehsB,EAAKisB,UAAYjsB,EAAKksB,aACrCpB,EAAc9qB,EAAKmsB,gBAAkBnsB,EAAKosB,iBAC1CC,EAAersB,EAAKssB,eAAiBtsB,EAAKusB,kBAE1CC,EAAuBnB,GAAeL,EAGtCyB,EAAatC,EAAcn3B,EAAMhK,QACjB,IAAfyjC,IACHzsB,EAAKhX,MAAQyjC,GAETD,EAAuB,EAAIjB,EAAeT,GAGhD,IAAI4B,GAAcvC,EAAcn3B,EAAMJ,OAatC,QAZqB,IAAhB85B,IACH1sB,EAAKpN,OAAS85B,GAEVF,EAAuB,EAAId,EAAgBW,IAGjDrsB,EAAKnC,WAAamC,EAAKhX,OAAUuiC,EAAeT,GAChD9qB,EAAKpV,YAAcoV,EAAKpN,QAAW84B,EAAgBW,GAEnDrsB,EAAK0Y,WAAa1Y,EAAKhX,MAAQ6iC,EAC/B7rB,EAAKwK,YAAcxK,EAAKpN,OAASo5B,EAE1BhsB,GApKT,GA4DIgrB,GA5DAP,EAA6B,mBAAXjlC,SAAyB4kC,EAC7C,SAAU7lB,GACR/e,QAAQyZ,MAAOsF,IAKfgmB,GACF,cACA,eACA,aACA,gBACA,aACA,cACA,YACA,eACA,kBACA,mBACA,iBACA,qBAGED,EAAqBC,EAAa/9B,OAoClCm+B,GAAU,CA6Gd,OAAOnV;;;AC1EP,QAASmX,UAASC,EAAMC,EAAMl7B,GAuB5B,QAASm7B,GAAWznB,GAClB,GAAIzM,GAAOm0B,EACPC,EAAUC,CAKd,OAHAF,GAAWE,MAAW77B,GACtB87B,EAAiB7nB,EACjBtB,EAAS6oB,EAAKtiB,MAAM0iB,EAASp0B,GAI/B,QAASu0B,GAAY9nB,GAMnB,MAJA6nB,GAAiB7nB,EAEjB+nB,EAAU/mC,WAAWgnC,EAAcR,GAE5BS,EAAUR,EAAWznB,GAAQtB,EAGtC,QAASwpB,GAAcloB,GACrB,GAAImoB,GAAoBnoB,EAAOooB,EAC3BC,EAAsBroB,EAAO6nB,EAC7BnpB,EAAS8oB,EAAOW,CAEpB,OAAOG,GAASC,UAAU7pB,EAAQ8pB,EAAUH,GAAuB3pB,EAGrE,QAAS+pB,GAAazoB,GACpB,GAAImoB,GAAoBnoB,EAAOooB,EAC3BC,EAAsBroB,EAAO6nB,CAKjC,YAAyB97B,KAAjBq8B,GAA+BD,GAAqBX,GACzDW,EAAoB,GAAOG,GAAUD,GAAuBG,EAGjE,QAASR,KACP,GAAIhoB,GAAO9B,KACX,IAAIuqB,EAAazoB,GACf,MAAO0oB,GAAa1oB,EAGtB+nB,GAAU/mC,WAAWgnC,EAAcE,EAAcloB,IAGnD,QAAS0oB,GAAa1oB,GAKpB,MAJA+nB,OAAUh8B,GAIN48B,GAAYjB,EACPD,EAAWznB,IAEpB0nB,EAAWE,MAAW77B,GACf2S,GAGT,QAASkqB,SACS78B,KAAZg8B,GACFlnC,aAAaknC,GAEfF,EAAiB,EACjBH,EAAWU,EAAeR,EAAWG,MAAUh8B,GAGjD,QAAS88B,KACP,WAAmB98B,KAAZg8B,EAAwBrpB,EAASgqB,EAAaxqB,OAGvD,QAAS4qB,KACP,GAAI9oB,GAAO9B,MACP6qB,EAAaN,EAAazoB,EAM9B,IAJA0nB,EAAWvb,UACXyb,EAAWlpC,KACX0pC,EAAepoB,EAEX+oB,EAAY,CACd,OAAgBh9B,KAAZg8B,EACF,MAAOD,GAAYM,EAErB,IAAIE,EAGF,MADAP,GAAU/mC,WAAWgnC,EAAcR,GAC5BC,EAAWW,GAMtB,WAHgBr8B,KAAZg8B,IACFA,EAAU/mC,WAAWgnC,EAAcR,IAE9B9oB,EAlHT,GAAIgpB,GACAE,EACAY,EACA9pB,EACAqpB,EACAK,EACAP,EAAiB,EACjBI,GAAU,EACVK,GAAS,EACTK,GAAW,CAEf,IAAmB,kBAARpB,GACT,KAAM,IAAIyB,WAAUC,gBA0GtB,OAxGAzB,GAAO0B,SAAS1B,IAAS,EACrB2B,SAAS78B,KACX27B,IAAY37B,EAAQ27B,QACpBK,EAAS,WAAah8B,GACtBk8B,EAAUF,EAASc,UAAUF,SAAS58B,EAAQk8B,UAAY,EAAGhB,GAAQgB,EACrEG,EAAW,YAAcr8B,KAAYA,EAAQq8B,SAAWA,GAiG1DG,EAAUF,OAASA,EACnBE,EAAUD,MAAQA,EACXC,EA+CT,QAASzjC,UAASkiC,EAAMC,EAAMl7B,GAC5B,GAAI27B,IAAU,EACVU,GAAW,CAEf,IAAmB,kBAARpB,GACT,KAAM,IAAIyB,WAAUC,gBAMtB,OAJIE,UAAS78B,KACX27B,EAAU,WAAa37B,KAAYA,EAAQ27B,QAAUA,EACrDU,EAAW,YAAcr8B,KAAYA,EAAQq8B,SAAWA,GAEnDrB,SAASC,EAAMC,GACpBS,QAAWA,EACXO,QAAWhB,EACXmB,SAAYA,IA6BhB,QAASQ,UAAS9mC,GAChB,GAAIb,SAAca,EAClB,SAASA,IAAkB,UAARb,GAA4B,YAARA,GA2BzC,QAAS6nC,cAAahnC,GACpB,QAASA,GAAyB,gBAATA,GAoB3B,QAASinC,UAASjnC,GAChB,MAAuB,gBAATA,IACXgnC,aAAahnC,IAAUknC,eAAezmC,KAAKT,IAAUmnC,UA0B1D,QAASN,UAAS7mC,GAChB,GAAoB,gBAATA,GACT,MAAOA,EAET,IAAIinC,SAASjnC,GACX,MAAOonC,IAET,IAAIN,SAAS9mC,GAAQ,CACnB,GAAIqnC,GAAgC,kBAAjBrnC,GAAMsnC,QAAwBtnC,EAAMsnC,UAAYtnC,CACnEA,GAAQ8mC,SAASO,GAAUA,EAAQ,GAAMA,EAE3C,GAAoB,gBAATrnC,GACT,MAAiB,KAAVA,EAAcA,GAASA,CAEhCA,GAAQA,EAAMuI,QAAQg/B,OAAQ,GAC9B,IAAIC,GAAWC,WAAWC,KAAK1nC,EAC/B,OAAQwnC,IAAYG,UAAUD,KAAK1nC,GAC/B4nC,aAAa5nC,EAAMQ,MAAM,GAAIgnC,EAAW,EAAI,GAC3CK,WAAWH,KAAK1nC,GAASonC,KAAOpnC,EAzavC,GAAI4mC,iBAAkB,sBAGlBQ,IAAM,IAGND,UAAY,kBAGZI,OAAS,aAGTM,WAAa,qBAGbJ,WAAa,aAGbE,UAAY,cAGZC,aAAephC,SAGfshC,WAA8B,gBAAVjrC,SAAsBA,QAAUA,OAAO8iB,SAAWA,QAAU9iB,OAGhFkrC,SAA0B,gBAARC,OAAoBA,MAAQA,KAAKroB,SAAWA,QAAUqoB,KAGxEC,KAAOH,YAAcC,UAAYG,SAAS,iBAG1CC,YAAcxoB,OAAOpf,UAOrB2mC,eAAiBiB,YAAYC,SAG7BrB,UAAY57B,KAAKC,IACjB86B,UAAY/6B,KAAKvD,IAkBjBiU,IAAM,WACR,MAAOosB,MAAK1hC,KAAKsV,MA6WnB/e,QAAOC,QAAUiG;;;;CC/ahB,SAAUnG,EAAQ6pB,GACE,gBAAZ3pB,UAA0C,mBAAXD,QAAyBA,OAAOC,QAAU2pB,IAC9D,kBAAXC,SAAyBA,OAAOC,IAAMD,OAAOD,IACnD7pB,EAASA,GAAUmrC,KAAMnrC,EAAO6oB,MAAQgB,MACzCrqB,KAAM,WAAc,YAEpB,SAASqpB,GAAMxnB,EAAQunB,GACrB,GAAIwT,GAAOnP,UAAUhlB,OAAS,OAAsB4E,KAAjBogB,UAAU,GAAmBA,UAAU,KAC1E,KAAKrE,EAAW,KAAM4iB,OAAM,wBAC5B,IAAIC,GAAwB,gBAAXpqC,GAAsBR,SAASH,iBAAiBW,GAAUA,CAC3E,IAAKoqC,EAAL,CACA,GAAIC,GAAYtP,EAAKsP,WAAa,IAC9BC,EAAYvP,EAAKuP,WAAa,WAC9BC,EAAgC,iBAAhBxP,GAAKwP,QAAuBxP,EAAKwP,OACjDC,EAAW,+BAAiC5d,OAAOyd,EAAW,UAC5D,WAAYD,KAAMA,GAAOA,GAE/B,KAAK,GAAIz5B,GAAI,EAAGA,EAAIy5B,EAAIxjC,OAAQ+J,GAAK,EAAG,CACtC,GAAI7S,GAAKssC,EAAIz5B,GACTpL,EAASzH,EAAGsP,MACZq9B,EAAO3sC,EAAGoB,cAAc,IAAI0tB,OAAO0d,IACnCI,MAA8Bl/B,KAAnB1N,EAAGukB,YAA4B,YAAc,aAExDooB,KAEF3sC,EAAGyN,YAAYzN,EAAGoB,cAAc,mBAChCpB,EAAG4sC,GAAY5sC,EAAG4sC,GAIpB,IAAIC,GAAW7sC,EAAG4sC,GACdE,EAAQL,EAASI,EAASrjC,MAAM,KAAOqjC,CAE3C,MAAIC,EAAMhkC,OAAS,GAAnB,CAEA,GAAIikC,GAActlC,EAAOyH,MACzBzH,GAAOyH,OAAS,MAChB,IAAI89B,GAAiBvlC,EAAOgiB,SAG5B,IAFAhiB,EAAOgiB,UAAY,OAEfzpB,EAAG0nC,cAAgBje,EACrBhiB,EAAOyH,OAAS69B,EAChBtlC,EAAOgiB,UAAYujB,MAFrB,CAWA,IAJA,GAAI59B,GAAM09B,EAAMhkC,OAAS,EACrB8C,EAAM,EACNqhC,MAAQ,GAELrhC,EAAMwD,GACX69B,EAAQrhC,EAAMwD,EAAM,GAAK,EAEzBpP,EAAG4sC,GAAYH,EAASK,EAAMtoC,MAAM,EAAGyoC,GAAOC,KAAK,KAAOJ,EAAMtoC,MAAM,EAAGyoC,GACzEjtC,EAAGmtC,mBAAmB,YAAaT,GAC/B1sC,EAAG0nC,aAAeje,EAAWra,EAAMq9B,EAASQ,EAAQ,EAAIA,EAAQ,EAAOrhC,EAAMqhC,CAGnFjtC,GAAG4sC,GAAYH,EAASK,EAAMtoC,MAAM,EAAG4K,GAAK89B,KAAK,KAAOJ,EAAMtoC,MAAM,EAAG4K,GACvEpP,EAAGmtC,mBAAmB,YAAaT,EACnC,IAAIU,GAAOX,EAAS,IAAI3d,OAAOge,EAAMtoC,MAAM4K,GAAK89B,KAAK,MAAQJ,EAAMtoC,MAAM4K,GACrEi+B,EAAa3rC,SAAS4rC,eAAeF,GACrCG,EAAmB7rC,SAAS0X,cAAc,OAC9Cm0B,GAAiB1rC,UAAUY,IAAI+pC,GAC/Be,EAAiBj+B,MAAMk4B,QAAU,OACjC+F,EAAiB9zB,YAAY4zB,GAC7BrtC,EAAGwtC,sBAAsB,YAAaD,GACtC9lC,EAAOyH,OAAS69B,EAChBtlC,EAAOgiB,UAAYujB,MAIvB,MAAOtjB;;AChFT,GAAI+jB,YAAatpC,QAAQ,oBAEzBrD,QAAOC,QAAU0sC;;ACFjB,GAAIC,UAAWvpC,QAAQ,kBAEvBrD,QAAOC,SACLklC,OAAQ,SAAShX,GAEf,GAAI0e,GAAO1e,EAAS0W,IAAIvkC,cAAc,OAQtC,IAPKusC,IACHA,EAAOjsC,SAASmkC,gBAAgB6H,SAASE,MAAO,QAChD3e,EAAS0W,IAAIlsB,YAAYk0B,KAIbA,EAAKvsC,cAAc,sCACnB,CACZ,GAAIkO,GAAQ5N,SAASmkC,gBAAgB6H,SAASE,MAAO,QACrDt+B,GAAMoB,aAAa,KAAM,gCACzBpB,EAAMoB,aAAa,OAAQ,YAC3BpB,EAAMiV,YACJ,+PACFopB,EAAKl0B,YAAYnK,GAInB,GAAIu+B,GAAYnsC,SAASmkC,gBAAgB6H,SAASE,MAAO,IACzDC,GAAUn9B,aAAa,KAAM,yBAC7Bm9B,EAAUn9B,aACR,YACA,cACGue,EAAS3pB,MAAQ,IAClB,KACC2pB,EAAS/f,OAAS,IACnB,iBAEJ2+B,EAAUn9B,aAAa,QAAS,wBAGhCm9B,EAAUp0B,YAAYpZ,KAAKytC,cAAc7e,IACzC4e,EAAUp0B,YAAYpZ,KAAK0tC,iBAAiB9e,IAC5C4e,EAAUp0B,YAAYpZ,KAAK2tC,eAAe/e,IAG1CA,EAAS0W,IAAIlsB,YAAYo0B,GAGzB5e,EAASgf,aAAeJ,GAG1BC,cAAe,SAAS7e,GACtB,GAAIvf,GAAShO,SAASmkC,gBAAgB6H,SAASE,MAAO,IACtDl+B,GAAOgB,aAAa,KAAM,wBAC1BhB,EAAOgB,aAAa,YAAa,kCACjChB,EAAOgB,aAAa,QAAS,wBAC7BhB,EAAOlO,iBACL,QACA,WACEytB,EAASif,oBAAoBx+B,WAE/B,GAEFA,EAAOlO,iBACL,aACA,WACEytB,EAASif,oBAAoBx+B,WAE/B,EAGF,IAAIy+B,GAAmBzsC,SAASmkC,gBAAgB6H,SAASE,MAAO,OAChEO,GAAiBz9B,aAAa,IAAK,KACnCy9B,EAAiBz9B,aAAa,IAAK,KACnCy9B,EAAiBz9B,aAAa,QAAS,QACvCy9B,EAAiBz9B,aAAa,SAAU,QACxCy9B,EAAiBz9B,aAAa,QAAS,mCACvChB,EAAO+J,YAAY00B,EAEnB,IAAIC,GAAc1sC,SAASmkC,gBAAgB6H,SAASE,MAAO,OAQ3D,OAPAQ,GAAY19B,aACV,IACA,wXAEF09B,EAAY19B,aAAa,QAAS,gCAClChB,EAAO+J,YAAY20B,GAEZ1+B,GAGTq+B,iBAAkB,SAAS9e,GAEzB,GAAIof,GAAsB3sC,SAASmkC,gBAAgB6H,SAASE,MAAO,IACnES,GAAoB39B,aAAa,KAAM,+BACvC29B,EAAoB39B,aAAa,YAAa,8BAC9C29B,EAAoB39B,aAAa,QAAS,wBAC1C29B,EAAoB7sC,iBAClB,QACA,WACEytB,EAASif,oBAAoBl0B,UAE/B,GAEFq0B,EAAoB7sC,iBAClB,aACA,WACEytB,EAASif,oBAAoBl0B,UAE/B,EAGF,IAAIs0B,GAAgC5sC,SAASmkC,gBAC3C6H,SAASE,MACT,OAEFU,GAA8B59B,aAAa,IAAK,KAChD49B,EAA8B59B,aAAa,IAAK,KAChD49B,EAA8B59B,aAAa,QAAS,OACpD49B,EAA8B59B,aAAa,SAAU,MACrD49B,EAA8B59B,aAC5B,QACA,mCAEF29B,EAAoB50B,YAAY60B,EAEhC,IAAIC,GAA4B7sC,SAASmkC,gBACvC6H,SAASE,MACT,OAEFW,GAA0B79B,aACxB,IACA,yLAEF69B,EAA0B79B,aACxB,QACA,gCAEF29B,EAAoB50B,YAAY80B,EAEhC,IAAIC,GAA4B9sC,SAASmkC,gBACvC6H,SAASE,MACT,OAYF,OAVAY,GAA0B99B,aACxB,IACA,wzDAEF89B,EAA0B99B,aACxB,QACA,gCAEF29B,EAAoB50B,YAAY+0B,GAEzBH,GAGTL,eAAgB,SAAS/e,GAEvB,GAAItf,GAAUjO,SAASmkC,gBAAgB6H,SAASE,MAAO,IACvDj+B,GAAQe,aAAa,KAAM,yBAC3Bf,EAAQe,aAAa,YAAa,mCAClCf,EAAQe,aAAa,QAAS,wBAC9Bf,EAAQnO,iBACN,QACA,WACEytB,EAASif,oBAAoBv+B,YAE/B,GAEFA,EAAQnO,iBACN,aACA,WACEytB,EAASif,oBAAoBv+B,YAE/B,EAGF,IAAI8+B,GAAoB/sC,SAASmkC,gBAAgB6H,SAASE,MAAO,OACjEa,GAAkB/9B,aAAa,IAAK,KACpC+9B,EAAkB/9B,aAAa,IAAK,KACpC+9B,EAAkB/9B,aAAa,QAAS,QACxC+9B,EAAkB/9B,aAAa,SAAU,QACzC+9B,EAAkB/9B,aAAa,QAAS,mCACxCf,EAAQ8J,YAAYg1B,EAEpB,IAAIC,GAAehtC,SAASmkC,gBAAgB6H,SAASE,MAAO,OAQ5D,OAPAc,GAAah+B,aACX,IACA,sQAEFg+B,EAAah+B,aAAa,QAAS,gCACnCf,EAAQ8J,YAAYi1B,GAEb/+B,GAGT+1B,QAAS,SAASzW,GACZA,EAASgf,eACXhf,EAASgf,aAAajsC,WAAWyL,YAAYwhB,EAASgf,cACtDhf,EAASgf,aAAe;;ACnM9B,GAAIP,UAAWvpC,QAAQ,mBACrBwqC,MAAQxqC,QAAQ,eAEdyqC,eAAiB,SAAS51B,EAAU/K,GACtC5N,KAAKsG,KAAKqS,EAAU/K,GAStB2gC,gBAAerqC,UAAUoC,KAAO,SAASqS,EAAU/K,GAEjD5N,KAAK2Y,SAAWA,EAChB3Y,KAAK4N,QAAUA,EAGf5N,KAAKwuC,eAAkB1mC,KAAM,EAAGyG,EAAG,EAAGC,EAAG,GACzCxO,KAAK2mB,aAAgB7e,KAAM,EAAGyG,EAAG,EAAGC,EAAG,GAEvCxO,KAAKyuC,gBAAkBH,MAAMI,MAAM1uC,KAAK2uC,UAAW3uC,MAGnDA,KAAK4yB,sBAAwB0b,MAAMM,4BACjC5uC,KAAK4N,QAAQihC,aAIf7uC,KAAK8uC,SAAYvgC,EAAG,EAAGC,EAAG,EAAGvJ,MAAO,EAAG4J,OAAQ,GAC/C7O,KAAK+uC,cAGL,IAAIC,GAAShvC,KAAKivC,YAGlBjvC,MAAKkvC,OAAOF,GAGZhvC,KAAK2uC,aAOPJ,eAAerqC,UAAU6qC,aAAe,WACtC,GAAII,GAAanvC,KAAK4N,QAAQ03B,IAAIn/B,aAAa,UAE/C,IAAIgpC,EAAY,CACd,GAAIC,GAAgBD,EACjBhmC,MAAM,UACNtG,OAAO,SAASwsC,GACf,MAAOA,KAERrnC,IAAI6P,WAGP7X,MAAK8uC,QAAQvgC,EAAI6gC,EAAc,GAC/BpvC,KAAK8uC,QAAQtgC,EAAI4gC,EAAc,GAC/BpvC,KAAK8uC,QAAQ7pC,MAAQmqC,EAAc,GACnCpvC,KAAK8uC,QAAQjgC,OAASugC,EAAc,EAEpC,IAAItnC,GAAOgH,KAAKvD,IACdvL,KAAK4N,QAAQ3I,MAAQjF,KAAK8uC,QAAQ7pC,MAClCjF,KAAK4N,QAAQiB,OAAS7O,KAAK8uC,QAAQjgC,OAIrC7O,MAAK2mB,YAAY7e,KAAOA,EACxB9H,KAAK2mB,YAAYpY,GAAKvO,KAAK4N,QAAQ3I,MAAQjF,KAAK8uC,QAAQ7pC,MAAQ6C,GAAQ,EACxE9H,KAAK2mB,YAAYnY,GAAKxO,KAAK4N,QAAQiB,OAAS7O,KAAK8uC,QAAQjgC,OAAS/G,GAAQ,EAG1E9H,KAAKsvC,uBAELtvC,KAAK4N,QAAQ03B,IAAInsB,gBAAgB,eAEjCnZ,MAAKuvC,sBAOThB,eAAerqC,UAAUqrC,mBAAqB,WAC5C,GAAIC,GAAOxvC,KAAK2Y,SAAS82B,SAEzBzvC,MAAK8uC,QAAQvgC,EAAIihC,EAAKjhC,EACtBvO,KAAK8uC,QAAQtgC,EAAIghC,EAAKhhC,EACtBxO,KAAK8uC,QAAQ7pC,MAAQuqC,EAAKvqC,MAC1BjF,KAAK8uC,QAAQjgC,OAAS2gC,EAAK3gC,QAQ7B0/B,eAAerqC,UAAUwrC,WAAa,WACpC,MAAOpB,OAAMjiC,UAAWrM,KAAK8uC,UAS/BP,eAAerqC,UAAU+qC,WAAa,WACpC,GAAID,GAAShvC,KAAK2vC,QAElB,IAAI3vC,KAAK4N,QAAQE,KAAO9N,KAAK4N,QAAQpI,QAAS,CAC5C,GAAIoqC,EAEFA,GADE5vC,KAAK4N,QAAQE,IACJgB,KAAKvD,IACdvL,KAAK4N,QAAQ3I,MAAQjF,KAAK8uC,QAAQ7pC,MAClCjF,KAAK4N,QAAQiB,OAAS7O,KAAK8uC,QAAQjgC,QAG1BC,KAAKC,IACd/O,KAAK4N,QAAQ3I,MAAQjF,KAAK8uC,QAAQ7pC,MAClCjF,KAAK4N,QAAQiB,OAAS7O,KAAK8uC,QAAQjgC,QAIvCmgC,EAAOhjB,EAAI4jB,EACXZ,EAAOzU,EAAIqV,EACXZ,EAAOptC,GAAK5B,KAAK8uC,QAAQvgC,EAAIqhC,EAC7BZ,EAAOa,GAAK7vC,KAAK8uC,QAAQtgC,EAAIohC,EAG/B,GAAI5vC,KAAK4N,QAAQlG,OAAQ,CACvB,GAAIooC,GAGA,IAFC9vC,KAAK4N,QAAQ3I,OACXjF,KAAK8uC,QAAQ7pC,MAAyB,EAAjBjF,KAAK8uC,QAAQvgC,GAASygC,EAAOhjB,GAEvD+jB,EAGE,IAFC/vC,KAAK4N,QAAQiB,QACX7O,KAAK8uC,QAAQjgC,OAA0B,EAAjB7O,KAAK8uC,QAAQtgC,GAASwgC,EAAOhjB,EAG1DgjB,GAAOptC,EAAIkuC,EACXd,EAAOa,EAAIE,EAQb,MAJA/vC,MAAKwuC,cAAc1mC,KAAOknC,EAAOhjB,EACjChsB,KAAKwuC,cAAcjgC,EAAIygC,EAAOptC,EAC9B5B,KAAKwuC,cAAchgC,EAAIwgC,EAAOa,EAEvBb,GAQTT,eAAerqC,UAAU8rC,iBAAmB,WAC1C,MAAO1B,OAAMjiC,UAAWrM,KAAKwuC,gBAQ/BD,eAAerqC,UAAU+rC,SAAW,WAClC,MAAO3B,OAAMjiC,UAAWrM,KAAK2mB,cAQ/B4nB,eAAerqC,UAAUoK,QAAU,WACjC,MAAOtO,MAAK2mB,YAAY7e,MAQ1BymC,eAAerqC,UAAUgsC,gBAAkB,WACzC,MAAOlwC,MAAK2mB,YAAY7e,KAAO9H,KAAKwuC,cAAc1mC,MAQpDymC,eAAerqC,UAAUisC,oBAAsB,SAASC,GACtD,MAAOA,GAAQpwC,KAAKwuC,cAAc1mC,MAQpCymC,eAAerqC,UAAUmsC,OAAS,WAChC,OAAS9hC,EAAGvO,KAAK2mB,YAAYpY,EAAGC,EAAGxO,KAAK2mB,YAAYnY,IAQtD+/B,eAAerqC,UAAUyrC,OAAS,WAChC,GAAIW,GAAUtwC,KAAK4N,QAAQ03B,IAAIiL,iBAU/B,OAPAD,GAAQtkB,EAAIhsB,KAAK2mB,YAAY7e,KAC7BwoC,EAAQrkB,EAAI,EACZqkB,EAAQE,EAAI,EACZF,EAAQ/V,EAAIv6B,KAAK2mB,YAAY7e,KAC7BwoC,EAAQ1uC,EAAI5B,KAAK2mB,YAAYpY,EAC7B+hC,EAAQT,EAAI7vC,KAAK2mB,YAAYnY,EAEtB8hC,GAQT/B,eAAerqC,UAAUgrC,OAAS,SAASF,GACzC,GAAIyB,GAAWzwC,KAAK0wC,gBAAgB1B,GAClC2B,EAAU3wC,KAAK4wC,eAAe5B,EAEhC,IAAIyB,GAAYE,EAAS,CAmBvB,GAjBIF,KAMM,IAHNzwC,KAAK4N,QAAQijC,WACX7wC,KAAKkwC,kBACLlwC,KAAKmwC,oBAAoBnB,EAAOhjB,KAGlCgjB,EAAOhjB,EAAIgjB,EAAOzU,EAAIv6B,KAAK2mB,YAAY7e,KACvC2oC,GAAW,IAEXzwC,KAAK8wC,YAAY9B,GACjBhvC,KAAK4N,QAAQmjC,OAAO/wC,KAAKkwC,qBAKzBS,EAAS,CACX,GAAIK,GAAahxC,KAAK4N,QAAQM,UAAUlO,KAAKqwC,UACzC9hC,EAAGygC,EAAOptC,EACV4M,EAAGwgC,EAAOa,IAGZoB,GAAc,EACdC,GAAc,GAGG,IAAfF,GAEFhC,EAAOptC,EAAI5B,KAAKqwC,SAAS9hC,EACzBygC,EAAOa,EAAI7vC,KAAKqwC,SAAS7hC,EAEzByiC,EAAcC,GAAc,GACnB5C,MAAM7D,SAASuG,MAEH,IAAjBA,EAAWziC,GAEbygC,EAAOptC,EAAI5B,KAAKqwC,SAAS9hC,EACzB0iC,GAAc,GACL3C,MAAM6C,SAASH,EAAWziC,KAEnCygC,EAAOptC,EAAIovC,EAAWziC,IAIH,IAAjByiC,EAAWxiC,GAEbwgC,EAAOa,EAAI7vC,KAAKqwC,SAAS7hC,EACzB0iC,GAAc,GACL5C,MAAM6C,SAASH,EAAWxiC,KAEnCwgC,EAAOa,EAAImB,EAAWxiC,IAMrByiC,GAAeC,IAAiBlxC,KAAK4wC,eAAe5B,GACvD2B,GAAU,GAEV3wC,KAAK8wC,YAAY9B,GACjBhvC,KAAK4N,QAAQwjC,MAAMpxC,KAAKqwC,YAKxBI,GAAYE,IACd3wC,KAAKsvC,yBAKXf,eAAerqC,UAAUwsC,gBAAkB,SAAS1B,GAClD,MAAOhvC,MAAK2mB,YAAY7e,OAASknC,EAAOhjB,GAG1CuiB,eAAerqC,UAAU0sC,eAAiB,SAAS5B,GACjD,MAAOhvC,MAAK2mB,YAAYpY,IAAMygC,EAAOptC,GAAK5B,KAAK2mB,YAAYnY,IAAMwgC,EAAOa,GAQ1EtB,eAAerqC,UAAU4sC,YAAc,SAAS9B,GAC9ChvC,KAAK2mB,YAAY7e,KAAOknC,EAAOhjB,EAC/BhsB,KAAK2mB,YAAYpY,EAAIygC,EAAOptC,EAC5B5B,KAAK2mB,YAAYnY,EAAIwgC,EAAOa,GAG9BtB,eAAerqC,UAAUmtC,eAAgB,EAKzC9C,eAAerqC,UAAUorC,qBAAuB,WACzCtvC,KAAKqxC,gBAERrxC,KAAKqxC,eAAgB,EAGrBrxC,KAAK4yB,sBAAsBxuB,KAAK7D,OAAQP,KAAKyuC,mBAOjDF,eAAerqC,UAAUyqC,UAAY,WACnC,GAAI2C,GAAMtxC,KAAK2vC,QAGftC,UAAS6B,OAAOlvC,KAAK2Y,SAAU24B,EAAKtxC,KAAKstC,MAGzCttC,KAAKqxC,eAAgB,EAGjBrxC,KAAK4N,QAAQ2jC,cACfvxC,KAAK4N,QAAQ2jC,aAAaD,IAI9B7wC,OAAOC,QAAU,SAASiY,EAAU/K,GAClC,MAAO,IAAI2gC,gBAAe51B,EAAU/K;;AC5WtC,GAAI4jC,OAAQ1tC,QAAQ,cAClB2tC,aAAe3tC,QAAQ,mBACvBwqC,MAAQxqC,QAAQ,eAChBupC,SAAWvpC,QAAQ,mBACnByqC,eAAiBzqC,QAAQ,qBAEvBspC,WAAa,SAAS9H,EAAK13B,GAC7B5N,KAAKsG,KAAKg/B,EAAK13B,IAGb8jC,iBACFC,iBAAkB,yBAClBC,YAAY,EACZ7jC,qBAAqB,EACrBF,aAAa,EACbgkC,qBAAqB,EACrBC,uBAAuB,EACvBC,2BAA2B,EAC3BC,qBAAsB,GACtBhkC,QAAS,GACTC,QAAS,GACTH,KAAK,EACLtI,SAAS,EACTkC,QAAQ,EACRmnC,YAAa,OACbgC,WAAY,KACZE,OAAQ,KACR7iC,UAAW,KACXkjC,MAAO,KACPa,oBAAqB,KACrBC,sBAAuB,KACvBX,aAAc,MAGZY,uBAA0BC,SAAS,EAEvChF,YAAWlpC,UAAUoC,KAAO,SAASg/B,EAAK13B,GACxC,GAAIykC,GAAOryC,IAEXA,MAAKslC,IAAMA,EACXtlC,KAAKstC,KAAOhI,EAAIvkC,cAAc,QAG9BssC,SAASiF,mBAAmBtyC,KAAKslC,KAGjCtlC,KAAK4N,QAAU0gC,MAAMjiC,OAAOiiC,MAAMjiC,UAAWqlC,iBAAkB9jC,GAG/D5N,KAAKyjC,MAAQ,MAGb,IAAI8O,GAA+BlF,SAASmF,gCAC1ClN,EAEFtlC,MAAKiF,MAAQstC,EAA6BttC,MAC1CjF,KAAK6O,OAAS0jC,EAA6B1jC,OAG3C7O,KAAK2Y,SAAW41B,eACdlB,SAASoF,oBAAoBzyC,KAAKslC,IAAKtlC,KAAK4N,QAAQ+jC,mBAElDrM,IAAKtlC,KAAKslC,IACVrgC,MAAOjF,KAAKiF,MACZ4J,OAAQ7O,KAAK6O,OACbf,IAAK9N,KAAK4N,QAAQE,IAClBtI,QAASxF,KAAK4N,QAAQpI,QACtBkC,OAAQ1H,KAAK4N,QAAQlG,OACrBmnC,YAAa7uC,KAAK4N,QAAQihC,YAE1BgC,WAAY,SAAS6B,EAAU9C,GAC7B,GAAIyC,EAAK15B,UAAY05B,EAAKzkC,QAAQijC,WAChC,MAAOwB,GAAKzkC,QAAQijC,WAAW6B,EAAU9C,IAG7CmB,OAAQ,SAASX,GACf,GAAIiC,EAAK15B,UAAY05B,EAAKzkC,QAAQmjC,OAChC,MAAOsB,GAAKzkC,QAAQmjC,OAAOX,IAG/BliC,UAAW,SAASykC,EAAUC,GAC5B,GAAIP,EAAK15B,UAAY05B,EAAKzkC,QAAQM,UAChC,MAAOmkC,GAAKzkC,QAAQM,UAAUykC,EAAUC,IAG5CxB,MAAO,SAASyB,GACd,GAAIR,EAAK15B,UAAY05B,EAAKzkC,QAAQwjC,MAChC,MAAOiB,GAAKzkC,QAAQwjC,MAAMyB,IAG9BtB,aAAc,SAASD,GACrB,GAAIe,EAAK15B,UAAY05B,EAAKzkC,QAAQ2jC,aAChC,MAAOc,GAAKzkC,QAAQ2jC,aAAaD,KAOzC,IAAIwB,GAAiB9yC,KAAK6tC,mBAC1BiF,GAAeC,cAAc/yC,KAAK4N,QAAQijC,YAC1CiC,EAAeE,UAAUhzC,KAAK4N,QAAQmjC,QACtC+B,EAAeG,aAAajzC,KAAK4N,QAAQM,WACzC4kC,EAAeI,SAASlzC,KAAK4N,QAAQwjC,OACrC0B,EAAeK,gBAAgBnzC,KAAK4N,QAAQ2jC,cAExCvxC,KAAK4N,QAAQG,qBACf0jC,aAAa7L,OAAO5lC,MAItBA,KAAKozC,wBAA0BlpC,KAAKsV,MACpCxf,KAAKqzC,iBAMPjG,WAAWlpC,UAAUmvC,cAAgB,WACnC,GAAIhB,GAAOryC,KACTszC,EAAU,IA6CZ,IA3CAtzC,KAAKuzC,gBAEHC,UAAW,SAASC,GAClB,GAAIzzB,GAASqyB,EAAKqB,gBAAgBD,EAAKH,EAEvC,OADAA,GAAUG,EACHzzB,GAET2zB,WAAY,SAASF,GACnB,GAAIzzB,GAASqyB,EAAKqB,gBAAgBD,EAAKH,EAEvC,OADAA,GAAUG,EACHzzB,GAIT4zB,QAAS,SAASH,GAChB,MAAOpB,GAAKwB,cAAcJ,IAE5BK,SAAU,SAASL,GACjB,MAAOpB,GAAKwB,cAAcJ,IAI5BM,UAAW,SAASN,GAClB,MAAOpB,GAAK2B,gBAAgBP,IAE9BQ,UAAW,SAASR,GAClB,MAAOpB,GAAK2B,gBAAgBP,IAI9BS,WAAY,SAAST,GACnB,MAAOpB,GAAKwB,cAAcJ,IAE5BU,WAAY,SAASV,GACnB,MAAOpB,GAAKwB,cAAcJ,IAE5BW,YAAa,SAASX,GACpB,MAAOpB,GAAKwB,cAAcJ,KAMU,MAApCzzC,KAAK4N,QAAQqkC,oBAA6B,CAC5CjyC,KAAK4N,QAAQqkC,oBAAoB3rC,MAC/B+tC,WAAYr0C,KAAKslC,IACjB4M,sBAAuBlyC,KAAK4N,QAAQskC,sBACpCtjB,SAAU5uB,KAAK6tC,qBAIjB,IAAIyG,GAAqBt0C,KAAK4N,QAAQqkC,oBACnCqC,kBACH,IAAIA,GAAsBA,EAAmB7rC,OAC3C,IAAK,GAAI+J,GAAI8hC,EAAmB7rC,OAAS,EAAG+J,GAAK,EAAGA,IAC9CxS,KAAKuzC,eAAegB,eAAeD,EAAmB9hC,WACjDxS,MAAKuzC,eAAee,EAAmB9hC,IAOtD,IAAK,GAAIzN,KAAS/E,MAAKuzC,gBAEpBvzC,KAAK4N,QAAQskC,uBAAyBlyC,KAAKslC,KAAKnkC,iBAC/C4D,EACA/E,KAAKuzC,eAAexuC,IACnB/E,KAAK4N,QAAQmkC,2BAA4BI,sBAK1CnyC,MAAK4N,QAAQkkC,wBACf9xC,KAAK4N,QAAQkkC,uBAAwB,EACrC9xC,KAAKw0C,yBAOTpH,WAAWlpC,UAAUswC,qBAAuB,WAC1C,IAAKx0C,KAAK4N,QAAQkkC,sBAAuB,CACvC,GAAIO,GAAOryC,IAGXA,MAAKy0C,cAAgB,SAAShB,GAC5B,MAAOpB,GAAKqC,iBAAiBjB,GAI/B,IAAIkB,IAAqB30C,KAAK4N,QAAQmkC,yBACtCP,OAAM1xC,GACJE,KAAK4N,QAAQskC,uBAAyBlyC,KAAKslC,IAC3CtlC,KAAKy0C,cACLE,GAGF30C,KAAK4N,QAAQkkC,uBAAwB,IAOzC1E,WAAWlpC,UAAU0wC,sBAAwB,WAC3C,GAAI50C,KAAK4N,QAAQkkC,sBAAuB,CACtC,GAAI6C,IAAqB30C,KAAK4N,QAAQmkC,yBACtCP,OAAMrqB,IACJnnB,KAAK4N,QAAQskC,uBAAyBlyC,KAAKslC,IAC3CtlC,KAAKy0C,cACLE,GAEF30C,KAAK4N,QAAQkkC,uBAAwB,IASzC1E,WAAWlpC,UAAUwwC,iBAAmB,SAASjB,GAC/C,GAAKzzC,KAAK4N,QAAQC,aAA8B,SAAf7N,KAAKyjC,MAAtC,CAIIzjC,KAAK4N,QAAQmkC,4BACX0B,EAAIvuC,eACNuuC,EAAIvuC,iBAEJuuC,EAAIoB,aAAc,EAKtB,IAAIha,GAAQ4Y,EAAIqB,QAAU,EACxBC,EAAY7qC,KAAKsV,MAAQxf,KAAKozC,wBAC9B4B,EAAU,EAAIlmC,KAAKC,IAAI,EAAG,GAAKgmC,EAGjC/0C,MAAKozC,wBAA0BlpC,KAAKsV,MAGhC,aAAei0B,IAAyB,IAAlBA,EAAIwB,WAAmBxB,EAAIyB,aACnDra,EAAuB,IAAf4Y,EAAIqB,OAAe,EAAIhmC,KAAK2pB,IAAIgb,EAAIyB,YAAczB,EAAIqB,QAGhEja,GACG,GAAMA,GAASA,EAAQ,GACpBA,GACEA,EAAQ,EAAI,GAAK,GAAK/rB,KAAKpN,IAAIoN,KAAK2pB,IAAIoC,GAAS,IAAOma,CAEhE,IAAIG,GAAoBn1C,KAAKslC,IAAI31B,eAAeC,UAC9CwlC,EAAqB/H,SAASgI,cAAc5B,EAAKzzC,KAAKslC,KAAK51B,gBACzDylC,GAEFrtC,EAAOgH,KAAKwmC,IAAI,EAAIt1C,KAAK4N,QAAQokC,sBAAuB,EAAInX,EAE9D76B,MAAKu1C,YAAYztC,EAAMstC,KAWzBhI,WAAWlpC,UAAUqxC,YAAc,SAASC,EAAW3C,EAAO4C,GAC5D,GAAIjH,GAAgBxuC,KAAK2Y,SAASq3B,kBAE7ByF,IAeHD,EAAY1mC,KAAKC,IACf/O,KAAK4N,QAAQI,QAAUwgC,EAAc1mC,KACrCgH,KAAKvD,IAAIvL,KAAK4N,QAAQK,QAAUugC,EAAc1mC,KAAM0tC,IAGtDA,GAAwBx1C,KAAKsO,WAjB3BtO,KAAKsO,UAAYknC,EACjBx1C,KAAK4N,QAAQI,QAAUwgC,EAAc1mC,KAErC0tC,EAAax1C,KAAK4N,QAAQI,QAAUwgC,EAAc1mC,KAAQ9H,KAAKsO,UAE/DtO,KAAKsO,UAAYknC,EACjBx1C,KAAK4N,QAAQK,QAAUugC,EAAc1mC,OAErC0tC,EAAax1C,KAAK4N,QAAQK,QAAUugC,EAAc1mC,KAAQ9H,KAAKsO,UAYnE,IAAIonC,GAAS11C,KAAK2Y,SAASg3B,SACzBgG,EAAgB9C,EAAMnjC,gBAAgBgmC,EAAO9lC,WAC7CgmC,EAAW51C,KAAKslC,IACbiL,kBACAsF,UAAUF,EAAcpnC,EAAGonC,EAAcnnC,GACzC4hC,MAAMoF,GACNK,WAAWF,EAAcpnC,GAAIonC,EAAcnnC,GAC9CwgC,EAAS0G,EAAOI,SAASF,EAEvB5G,GAAOhjB,IAAM0pB,EAAO1pB,GACtBhsB,KAAK2Y,SAASu2B,OAAOF,IAUzB5B,WAAWlpC,UAAU4D,KAAO,SAASsoC,EAAO2F,GAC1C/1C,KAAKu1C,YACHnF,EACA/C,SAAS2I,kBAAkBh2C,KAAKslC,IAAKtlC,KAAKiF,MAAOjF,KAAK6O,QACtDknC,IAUJ3I,WAAWlpC,UAAU+xC,WAAa,SAAS7F,EAAO2F,GAC5CA,IACF3F,EAAQpwC,KAAKk2C,wBAAwB9F,IAGvCpwC,KAAK8H,KAAKsoC,EAAO2F,IAUnB3I,WAAWlpC,UAAUiyC,kBAAoB,SAAS/F,EAAOyC,EAAOkD,GAO9D,GANIA,IAEF3F,EAAQpwC,KAAKk2C,wBAAwB9F,IAIV,aAAzB9B,MAAM8H,QAAQvD,GAAuB,CACvC,KAAI,KAAOA,IAAS,KAAOA,IAGzB,KAAM,IAAI7G,OAAM,yBAFhB6G,GAAQxF,SAAS59B,eAAezP,KAAKslC,IAAKuN,EAAMtkC,EAAGskC,EAAMrkC,GAM7DxO,KAAKu1C,YAAYnF,EAAOyC,EAAOkD,IAQjC3I,WAAWlpC,UAAUoK,QAAU,WAC7B,MAAOtO,MAAK2Y,SAASrK,WAQvB8+B,WAAWlpC,UAAUgsC,gBAAkB,WACrC,MAAOlwC,MAAK2Y,SAASu3B,mBASvB9C,WAAWlpC,UAAUgyC,wBAA0B,SAASpuC,GACtD,MAAOA,GAAO9H,KAAK2Y,SAASq3B,mBAAmBloC,MAMjDslC,WAAWlpC,UAAUmyC,UAAY,WAC/B,GAAI7H,GAAgBxuC,KAAK2Y,SAASq3B,kBAElChwC,MAAK8H,KAAK0mC,EAAc1mC,MAAM,IAMhCslC,WAAWlpC,UAAUoyC,SAAW,WAC9Bt2C,KAAKu2C,IAAIv2C,KAAK2Y,SAASq3B,qBAMzB5C,WAAWlpC,UAAUyV,MAAQ,WAC3B3Z,KAAKq2C,YACLr2C,KAAKs2C,YASPlJ,WAAWlpC,UAAUsyC,eAAiB,SAAS/C,GAU7C,GATIzzC,KAAK4N,QAAQmkC,4BACX0B,EAAIvuC,eACNuuC,EAAIvuC,iBAEJuuC,EAAIoB,aAAc,GAKlB70C,KAAK4N,QAAQG,oBAAqB,CAEpC,IADkB0lC,EAAI5xC,OAAOsE,aAAa,UAAY,IACtCqE,QAAQ,yBAA2B,EACjD,OAAO,EAIX,GAAIisC,EAGFA,GADEhD,EAAIiD,SACO,GAA+C,GAAzC,EAAI12C,KAAK4N,QAAQokC,uBAEmB,GAAzC,EAAIhyC,KAAK4N,QAAQokC,qBAGjC,IAAIa,GAAQxF,SAASgI,cAAc5B,EAAKzzC,KAAKslC,KAAK51B,gBAChD1P,KAAKslC,IAAI31B,eAAeC,UAE1B5P,MAAKu1C,YAAYkB,EAAY5D,IAQ/BzF,WAAWlpC,UAAUwvC,gBAAkB,SAASD,EAAKH,GAC/CtzC,KAAK4N,QAAQmkC,4BACX0B,EAAIvuC,eACNuuC,EAAIvuC,iBAEJuuC,EAAIoB,aAAc,GAItBvG,MAAMqI,uBAAuBlD,EAAKzzC,KAAKslC,KAGnCtlC,KAAK4N,QAAQikC,qBAAuBvD,MAAMsI,WAAWnD,EAAKH,GAC5DtzC,KAAKw2C,eAAe/C,IAGpBzzC,KAAKyjC,MAAQ,MACbzjC,KAAK62C,cAAgB72C,KAAK2Y,SAASg3B,SACnC3vC,KAAK82C,YAAczJ,SAASgI,cAAc5B,EAAKzzC,KAAKslC,KAAK51B,gBACvD1P,KAAK62C,cAAcjnC,aAUzBw9B,WAAWlpC,UAAU8vC,gBAAkB,SAASP,GAS9C,GARIzzC,KAAK4N,QAAQmkC,4BACX0B,EAAIvuC,eACNuuC,EAAIvuC,iBAEJuuC,EAAIoB,aAAc,GAIH,QAAf70C,KAAKyjC,OAAmBzjC,KAAK4N,QAAQgkC,WAAY,CAEnD,GAAIiB,GAAQxF,SAASgI,cAAc5B,EAAKzzC,KAAKslC,KAAK51B,gBAC9C1P,KAAK62C,cAAcjnC,WAErBmnC,EAAc/2C,KAAK62C,cAAchB,UAC/BhD,EAAMtkC,EAAIvO,KAAK82C,YAAYvoC,EAC3BskC,EAAMrkC,EAAIxO,KAAK82C,YAAYtoC,EAG/BxO,MAAK2Y,SAASu2B,OAAO6H,KASzB3J,WAAWlpC,UAAU2vC,cAAgB,SAASJ,GACxCzzC,KAAK4N,QAAQmkC,4BACX0B,EAAIvuC,eACNuuC,EAAIvuC,iBAEJuuC,EAAIoB,aAAc,GAIH,QAAf70C,KAAKyjC,QAEPzjC,KAAKyjC,MAAQ,SAQjB2J,WAAWlpC,UAAU4J,IAAM,WACzB,GAAIghC,GAAU9uC,KAAK2Y,SAAS+2B,aAC1BE,EAAW9gC,KAAKvD,IACdvL,KAAKiF,MAAQ6pC,EAAQ7pC,MACrBjF,KAAK6O,OAASigC,EAAQjgC,OAG1B7O,MAAK8H,KAAK8nC,GAAU,IAOtBxC,WAAWlpC,UAAUsB,QAAU,WAC7B,GAAIspC,GAAU9uC,KAAK2Y,SAAS+2B,aAC1BE,EAAW9gC,KAAKC,IACd/O,KAAKiF,MAAQ6pC,EAAQ7pC,MACrBjF,KAAK6O,OAASigC,EAAQjgC,OAG1B7O,MAAK8H,KAAK8nC,GAAU,IAOtBxC,WAAWlpC,UAAUwD,OAAS,WAC5B,GAAIonC,GAAU9uC,KAAK2Y,SAAS+2B,aAC1BI,EACoE,IAAjE9vC,KAAKiF,OAAS6pC,EAAQ7pC,MAAoB,EAAZ6pC,EAAQvgC,GAASvO,KAAKsO,WACvDyhC,EACsE,IAAnE/vC,KAAK6O,QAAUigC,EAAQjgC,OAAqB,EAAZigC,EAAQtgC,GAASxO,KAAKsO,UAE3DtO,MAAK6tC,oBAAoB0I,KAAMhoC,EAAGuhC,EAASthC,EAAGuhC,KAOhD3C,WAAWlpC,UAAU8yC,WAAa,WAChCh3C,KAAK2Y,SAAS42B,sBAQhBnC,WAAWlpC,UAAUqyC,IAAM,SAAS1D,GAClC,GAAIkE,GAAc/2C,KAAK2Y,SAASg3B,QAChCoH,GAAYn1C,EAAIixC,EAAMtkC,EACtBwoC,EAAYlH,EAAIgD,EAAMrkC,EACtBxO,KAAK2Y,SAASu2B,OAAO6H,IAQvB3J,WAAWlpC,UAAU4L,MAAQ,SAAS+iC,GACpC,GAAIkE,GAAc/2C,KAAK2Y,SAASg3B,QAChCoH,GAAYn1C,GAAKixC,EAAMtkC,EACvBwoC,EAAYlH,GAAKgD,EAAMrkC,EACvBxO,KAAK2Y,SAASu2B,OAAO6H,IAQvB3J,WAAWlpC,UAAUmsC,OAAS,WAC5B,GAAI5M,GAAQzjC,KAAK2Y,SAASs3B,UAE1B,QAAS1hC,EAAGk1B,EAAMl1B,EAAGC,EAAGi1B,EAAMj1B,IAMhC4+B,WAAWlpC,UAAUsU,OAAS,WAE5B,GAAI+5B,GAA+BlF,SAASmF,gCAC1CxyC,KAAKslC,IAEPtlC,MAAKiF,MAAQstC,EAA6BttC,MAC1CjF,KAAK6O,OAAS0jC,EAA6B1jC,MAG3C,IAAI8J,GAAW3Y,KAAK2Y,QACpBA,GAAS/K,QAAQ3I,MAAQjF,KAAKiF,MAC9B0T,EAAS/K,QAAQiB,OAAS7O,KAAK6O,OAC/B8J,EAASs2B,aAGLjvC,KAAK4N,QAAQG,sBACf/N,KAAK6tC,oBAAoBoJ,sBACzBj3C,KAAK6tC,oBAAoBqJ,uBAO7B9J,WAAWlpC,UAAU6f,QAAU,WAC7B,GAAIsuB,GAAOryC,IAGXA,MAAK6wC,WAAa,KAClB7wC,KAAK+wC,OAAS,KACd/wC,KAAKkO,UAAY,KACjBlO,KAAKoxC,MAAQ,KACbpxC,KAAKuxC,aAAe,KAIoB,MAApCvxC,KAAK4N,QAAQqkC,qBACfjyC,KAAK4N,QAAQqkC,oBAAoBluB,SAC/BswB,WAAYr0C,KAAKslC,IACjB4M,sBAAuBlyC,KAAK4N,QAAQskC,sBACpCtjB,SAAU5uB,KAAK6tC,qBAKnB,KAAK,GAAI9oC,KAAS/E,MAAKuzC,gBACpBvzC,KAAK4N,QAAQskC,uBAAyBlyC,KAAKslC,KAAKpe,oBAC/CniB,EACA/E,KAAKuzC,eAAexuC,IACnB/E,KAAK4N,QAAQmkC,2BAA4BI,sBAK9CnyC,MAAK40C,wBAGL50C,KAAK6tC,oBAAoBoJ,sBAGzBj3C,KAAK2Z,QAGLw9B,eAAiBA,eAAet0C,OAAO,SAAS+rB,GAC9C,MAAOA,GAAS0W,MAAQ+M,EAAK/M,YAIxBtlC,MAAK4N,cAGL5N,MAAK2Y,eAGL3Y,MAAK8yC,qBACL9yC,MAAKo3C,GACZp3C,KAAK6tC,kBAAoB,WACvB,MAAO,QASXT,WAAWlpC,UAAU2pC,kBAAoB,WACvC,GAAIwE,GAAOryC,IAyMX,OAtMKA,MAAK8yC,iBACR9yC,KAAK8yC,eAAiB9yC,KAAKo3C,IAEzBC,UAAW,WAET,MADAhF,GAAKzkC,QAAQgkC,YAAa,EACnBS,EAAK+E,IAEdE,WAAY,WAEV,MADAjF,GAAKzkC,QAAQgkC,YAAa,EACnBS,EAAK+E,IAEdG,aAAc,WACZ,QAASlF,EAAKzkC,QAAQgkC,YAExB2E,IAAK,SAAS1D,GAEZ,MADAR,GAAKkE,IAAI1D,GACFR,EAAK+E,IAEdtnC,MAAO,SAAS+iC,GAEd,MADAR,GAAKviC,MAAM+iC,GACJR,EAAK+E,IAEd/G,OAAQ,WACN,MAAOgC,GAAKhC,UAGd4C,aAAc,SAASuE,GAGrB,MAFAnF,GAAKzkC,QAAQM,UACJ,OAAPspC,EAAc,KAAOlJ,MAAMI,MAAM8I,EAAInF,EAAKS,gBACrCT,EAAK+E,IAEdlE,SAAU,SAASsE,GAGjB,MAFAnF,GAAKzkC,QAAQwjC,MACJ,OAAPoG,EAAc,KAAOlJ,MAAMI,MAAM8I,EAAInF,EAAKS,gBACrCT,EAAK+E,IAGdK,WAAY,WAEV,MADApF,GAAKzkC,QAAQC,aAAc,EACpBwkC,EAAK+E,IAEdM,YAAa,WAEX,MADArF,GAAKzkC,QAAQC,aAAc,EACpBwkC,EAAK+E,IAEdO,cAAe,WACb,QAAStF,EAAKzkC,QAAQC,aAExBqpC,mBAAoB,WAKlB,MAJK7E,GAAKzkC,QAAQG,sBAChBskC,EAAKzkC,QAAQG,qBAAsB,EACnC0jC,aAAa7L,OAAOyM,IAEfA,EAAK+E,IAEdH,oBAAqB,WAKnB,MAJI5E,GAAKzkC,QAAQG,sBACfskC,EAAKzkC,QAAQG,qBAAsB,EACnC0jC,aAAapM,QAAQgN,IAEhBA,EAAK+E,IAEdQ,sBAAuB,WACrB,QAASvF,EAAKzkC,QAAQG,qBAGxB8pC,mBAAoB,WAElB,MADAxF,GAAKzkC,QAAQikC,qBAAsB,EAC5BQ,EAAK+E,IAEdU,oBAAqB,WAEnB,MADAzF,GAAKzkC,QAAQikC,qBAAsB,EAC5BQ,EAAK+E,IAEdW,sBAAuB,WACrB,QAAS1F,EAAKzkC,QAAQikC,qBAGxB2C,qBAAsB,WAEpB,MADAnC,GAAKmC,uBACEnC,EAAK+E,IAEdxC,sBAAuB,WAErB,MADAvC,GAAKuC,wBACEvC,EAAK+E,IAEdY,wBAAyB,WACvB,QAAS3F,EAAKzkC,QAAQkkC,uBAGxBmG,wBAAyB,SAAS7H,GAEhC,MADAiC,GAAKzkC,QAAQokC,qBAAuB5B,EAC7BiC,EAAK+E,IAEdc,WAAY,SAASpwC,GAEnB,MADAuqC,GAAKzkC,QAAQI,QAAUlG,EAChBuqC,EAAK+E,IAEde,WAAY,SAASrwC,GAEnB,MADAuqC,GAAKzkC,QAAQK,QAAUnG,EAChBuqC,EAAK+E,IAGdrE,cAAe,SAASyE,GAGtB,MAFAnF,GAAKzkC,QAAQijC,WACJ,OAAP2G,EAAc,KAAOlJ,MAAMI,MAAM8I,EAAInF,EAAKS,gBACrCT,EAAK+E,IAEdpE,UAAW,SAASwE,GAGlB,MAFAnF,GAAKzkC,QAAQmjC,OACJ,OAAPyG,EAAc,KAAOlJ,MAAMI,MAAM8I,EAAInF,EAAKS,gBACrCT,EAAK+E,IAGdtvC,KAAM,SAASsoC,GAEb,MADAiC,GAAK4D,WAAW7F,GAAO,GAChBiC,EAAK+E,IAEdgB,OAAQ,SAAShI,GAEf,MADAiC,GAAK4D,WAAW7F,GAAO,GAChBiC,EAAK+E,IAEd7B,YAAa,SAASnF,EAAOyC,GAE3B,MADAR,GAAK8D,kBAAkB/F,EAAOyC,GAAO,GAC9BR,EAAK+E,IAEdiB,cAAe,SAASjI,EAAOyC,GAE7B,MADAR,GAAK8D,kBAAkB/F,EAAOyC,GAAO,GAC9BR,EAAK+E,IAEd/nC,OAAQ,WAEN,MADArP,MAAKo4C,OAAO,EAAI/F,EAAKzkC,QAAQokC,sBACtBK,EAAK+E,IAEd9nC,QAAS,WAEP,MADAtP,MAAKo4C,OAAO,GAAK,EAAI/F,EAAKzkC,QAAQokC,uBAC3BK,EAAK+E,IAEd9oC,QAAS,WACP,MAAO+jC,GAAKnC,mBAGdiD,gBAAiB,SAASqE,GAGxB,MAFAnF,GAAKzkC,QAAQ2jC,aACJ,OAAPiG,EAAc,KAAOlJ,MAAMI,MAAM8I,EAAInF,EAAKS,gBACrCT,EAAK+E,IAGdf,UAAW,WAET,MADAhE,GAAKgE,YACEhE,EAAK+E,IAEdd,SAAU,WAER,MADAjE,GAAKiE,WACEjE,EAAK+E,IAEdz9B,MAAO,WAEL,MADA04B,GAAK14B,QACE04B,EAAK+E,IAGdtpC,IAAK,WAEH,MADAukC,GAAKvkC,MACEukC,EAAK+E,IAEd5xC,QAAS,WAEP,MADA6sC,GAAK7sC,UACE6sC,EAAK+E,IAEd1vC,OAAQ,WAEN,MADA2qC,GAAK3qC,SACE2qC,EAAK+E,IAGdJ,WAAY,WAEV,MADA3E,GAAK2E,aACE3E,EAAK+E,IAEd5+B,OAAQ,WAEN,MADA65B,GAAK75B,SACE65B,EAAK+E,IAEd1oC,SAAU,WACR,OACEzJ,MAAOotC,EAAKptC,MACZ4J,OAAQwjC,EAAKxjC,OACbypC,SAAUjG,EAAK/jC,UACfwgC,QAASuD,EAAK15B,SAAS+2B,eAI3B3rB,QAAS,WAEP,MADAsuB,GAAKtuB,UACEsuB,EAAK+E,MAKXp3C,KAAK8yC,eASd,IAAIqE,mBAEAjoC,WAAa,SAASqpC,EAAmB3qC,GAC3C,GAAI03B,GAAMgJ,MAAMkK,OAAOD,EAEvB,IAAY,OAARjT,EACF,MAAO,KAGP,KAAK,GAAI9yB,GAAI2kC,eAAe1uC,OAAS,EAAG+J,GAAK,EAAGA,IAC9C,GAAI2kC,eAAe3kC,GAAG8yB,MAAQA,EAC5B,MAAO6R,gBAAe3kC,GAAGoc,SAASif,mBAWtC,OANAsJ,gBAAejnC,MACbo1B,IAAKA,EACL1W,SAAU,GAAIwe,YAAW9H,EAAK13B,KAIzBupC,eACLA,eAAe1uC,OAAS,GACxBmmB,SAASif,oBAIfptC,QAAOC,QAAUwO;;ACr8BjB,GAAIo/B,OAAQxqC,QAAQ,eAClB20C,SAAW,SAGep3C,UAASq3C,eAEnCD,SAAW,MAGbh4C,OAAOC,SACL6sC,MAAO,6BACPoL,MAAO,uCACPC,QAAS,gCACTC,QAAS,+BACTC,KAAM,oCAQNtG,gCAAiC,SAASlN,GACxC,GAAIA,EAAIyT,aAAezT,EAAI0T,aACzB,OAAS/zC,MAAOqgC,EAAIyT,YAAalqC,OAAQy2B,EAAI0T,aACxC,IAAM1T,EAAIt2B,wBACf,MAAOs2B,GAAIt2B,uBAEX,MAAM,IAAIg9B,OAAM,2CAUpByG,oBAAqB,SAASnN,EAAKvxB,GACjC,GAAI4E,GAAW,IASf,MANEA,EADE21B,MAAM2K,UAAUllC,GACPA,EAEAuxB,EAAIvkC,cAAcgT,IAIhB,CACb,GAAImlC,GAAaj1C,MAAMC,UAAUC,MAC9BC,KAAKkhC,EAAI4T,YAAc5T,EAAIj9B,UAC3BxF,OAAO,SAASlD,GACf,MAAuB,SAAhBA,EAAGu4B,UAAuC,UAAhBv4B,EAAGu4B,UAMhB,KAAtBghB,EAAWzwC,QACgB,MAA3BywC,EAAW,GAAGhhB,UAC8B,OAA5CghB,EAAW,GAAG/yC,aAAa,eAE3BwS,EAAWugC,EAAW,IAK1B,IAAKvgC,EAAU,CACb,GAAIwgC,GACF,aAAc,GAAIjvC,OAAOkvC,cAAcltC,QAAQ,MAAO,GACxDyM,GAAWtX,SAASmkC,gBAAgBxlC,KAAKutC,MAAO,KAChD50B,EAAStI,aAAa,KAAM8oC,EAG5B,IAAIE,GAAc/T,EAAI4T,YAAc5T,EAAIj9B,QACxC,IAAMgxC,GAAeA,EAAY5wC,OAAS,EACxC,IAAK,GAAI+J,GAAI6mC,EAAY5wC,OAAQ+J,EAAI,EAAGA,IAEe,SAAjD6mC,EAAYA,EAAY5wC,OAAS+J,GAAG0lB,UACtCvf,EAASS,YAAYigC,EAAYA,EAAY5wC,OAAS+J,GAI5D8yB,GAAIlsB,YAAYT,GAIlB,GAAI2gC,KAWJ,OAVI3gC,GAASxS,aAAa,WACxBmzC,EAAa3gC,EAASxS,aAAa,SAASgD,MAAM,OAI9CmwC,EAAW9uC,QAAQ,2BACvB8uC,EAAWppC,KAAK,yBAChByI,EAAStI,aAAa,QAASipC,EAAWzM,KAAK,OAG1Cl0B,GAQT25B,mBAAoB,SAAShN,GAO3B,GALAA,EAAIj1B,aAAa,QAASrQ,KAAKutC,OAC/BjI,EAAIiU,eAAev5C,KAAK44C,QAAS,cAAe54C,KAAK64C,SACrDvT,EAAIiU,eAAev5C,KAAK44C,QAAS,WAAY54C,KAAK84C,MAG3B,OAAnBxT,EAAI3jC,WAAqB,CAC3B,GAAIsN,GAAQq2B,EAAIn/B,aAAa,UAAY,IACQ,IAA7C8I,EAAMgf,cAAczjB,QAAQ,aAC9B86B,EAAIj1B,aAAa,QAAS,qBAAuBpB,KAQvDuqC,kCAAmC,IAanCC,kBAAmBnL,MAAM3nC,SACvB,WAGE,IAAK,GAFD+yC,GAAUr4C,SAASH,iBAAiB,QACpCy4C,EAAeD,EAAQjxC,OAClB+J,EAAI,EAAGA,EAAImnC,EAAcnnC,IAAK,CACrC,GAAIonC,GAAWF,EAAQlnC,EACvBonC,GAASj4C,WAAW8a,aAAam9B,EAAUA,KAG/C55C,KAAOA,KAAKw5C,kCAAoC,MAUlDtK,OAAQ,SAASz3B,EAASoiC,EAAQvM,GAChC,GAAI+E,GAAOryC,KACT85C,EACE,UACAD,EAAO7tB,EACP,IACA6tB,EAAO5tB,EACP,IACA4tB,EAAOrJ,EACP,IACAqJ,EAAOtf,EACP,IACAsf,EAAOj4C,EACP,IACAi4C,EAAOhK,EACP,GAEJp4B,GAAQ8hC,eAAe,KAAM,YAAaO,GACtC,aAAeriC,GAAQxI,MACzBwI,EAAQxI,MAAMqkB,UAAYwmB,EACjB,iBAAmBriC,GAAQxI,MACpCwI,EAAQxI,MAAM,iBAAmB6qC,EACxB,qBAAuBriC,GAAQxI,QACxCwI,EAAQxI,MAAM,qBAAuB6qC,GAMtB,OAAbrB,UAAuBnL,IAEzBA,EAAK3rC,WAAW8a,aAAa6wB,EAAMA,GAInC/sC,OAAO+B,WAAW,WAChB+vC,EAAKoH,qBACJpH,EAAKmH,qCAWZnE,cAAe,SAAS5B,EAAKnO,GAC3B,GAAIuN,GAAQvN,EAAI71B,gBAOhB,OALA6+B,OAAMqI,uBAAuBlD,EAAKnO,GAElCuN,EAAMtkC,EAAIklC,EAAIsG,QACdlH,EAAMrkC,EAAIilC,EAAIuG,QAEPnH,GASTmD,kBAAmB,SAAS1Q,EAAKrgC,EAAO4J,GACtC,MAAO7O,MAAKyP,eAAe61B,EAAKrgC,EAAQ,EAAG4J,EAAS,IAWtDY,eAAgB,SAAS61B,EAAK/2B,EAAGC,GAC/B,GAAIqkC,GAAQvN,EAAI71B,gBAIhB,OAHAojC,GAAMtkC,EAAIA,EACVskC,EAAMrkC,EAAIA,EAEHqkC;;AC1OXpyC,OAAOC,QAAU,WAwBf,QAASu5C,GAAexiC,EAAQqO,GAE9B,GAAI0xB,GAAK,SAAS0C,IAEfA,IAAmBA,EAAgB35C,OAAOwE,MAG3C,IAAIA,IAEFm1C,cAAeA,EACfr4C,OAAQq4C,EAAcr4C,QAAUq4C,EAAcC,WAC9Cr3C,KAAM,QACNmyC,UAAiC,uBAAtBiF,EAAcp3C,KAAgC,EAAI,EAC7Ds3C,OAAQ,EACRC,OAAQ,EACRn1C,eAAgB,WACdg1C,EAAch1C,eACZg1C,EAAch1C,iBACdg1C,EAAcrF,aAAc,GAclC,OATgB,cAAXyF,GACHv1C,EAAM+vC,QAAS,KAASoF,EAAchF,WAEtCgF,EAAcK,cAAiBx1C,EAAMq1C,QAAS,KAASF,EAAcK,cAErEx1C,EAAM+vC,OAASoF,EAAcM,OAIxB10B,EAAU/gB,GASnB,OALA01C,GAAIvqC,MACFuH,QAASA,EACT+/B,GAAIA,IAGCA,EAGT,QAASkD,GAAYjjC,GACnB,IAAK,GAAIjF,GAAI,EAAGA,EAAIioC,EAAIhyC,OAAQ+J,IAC9B,GAAIioC,EAAIjoC,GAAGiF,UAAYA,EACrB,MAAOgjC,GAAIjoC,GAAGglC,EAGlB,OAAO,cAGT,QAASmD,GAAeljC,GACtB,IAAK,GAAIjF,GAAI,EAAGA,EAAIioC,EAAIhyC,OAAQ+J,IAC9B,GAAIioC,EAAIjoC,GAAGiF,UAAYA,EACrB,MAAOgjC,GAAI/uB,OAAOlZ,EAAE,GAK1B,QAASooC,GAAkB91C,EAAMomB,EAAWpF,EAAU6uB,GACpD,GAAIkG,EAGFA,GADc,UAAZP,EACGx0B,EAEAm0B,EAAen1C,EAAMghB,GAG5BhhB,EAAKg2C,GACHhwB,EAASI,EACT2vB,EACAlG,EAAoBxC,EAAwB4I,GAIhD,QAASC,GAAqBl2C,EAAMomB,EAAWpF,EAAU6uB,GAEvD,GAAIkG,EAGFA,GADc,UAAZP,EACGx0B,EAEA40B,EAAY51C,GAGnBA,EAAKm2C,GACHnwB,EAASI,EACT2vB,EACAlG,EAAoBxC,EAAwB4I,GAG9CJ,EAAe71C,GAGjB,QAASo2C,GAAkBp2C,EAAMghB,EAAU6uB,GACzCiG,EAAkB91C,EAAMw1C,EAASx0B,EAAU6uB,GAG5B,kBAAX2F,GACFM,EAAkB91C,EAAM,sBAAuBghB,EAAU6uB,GAI7D,QAASwG,GAAoBr2C,EAAMghB,EAAU6uB,GAC3CqG,EAAqBl2C,EAAMw1C,EAASx0B,EAAU6uB,GAG/B,kBAAX2F,GACFU,EAAqBl2C,EAAM,sBAAuBghB,EAAU6uB,GAlIhE,GAAiBmG,GAAmBG,EAAsBX,EAAtDxvB,EAAS,GAAsD2vB,KAC/DtI,GAAyBC,SAAS,GAClC2I,GAAwB3I,SAAS,EAoIrC,OAjIK7xC,QAAOY,kBACV25C,EAAoB,mBACpBG,EAAuB,wBAEvBH,EAAoB,cACpBG,EAAuB,cACvBnwB,EAAS,MAIXwvB,EAAU,WAAaj5C,UAAS0X,cAAc,OAAS,YACnB1L,KAA1BhM,SAAS+5C,aAA6B,aACtC,kBAsHRt7C,GAAIo7C,EACJ/zB,IAAKg0B;;ACmJT,QAASE,gBAAep5C,GACtB,MAAO,UAAS6jB,GACdvlB,OAAO+B,WAAWwjB,EAAU7jB,IArShCxB,OAAOC,SAQL2L,OAAQ,SAASxK,EAAQy5C,GACvBz5C,EAASA,KACT,KAAK,GAAIqqB,KAAQovB,GAEXt7C,KAAKyqC,SAAS6Q,EAAOpvB,IACvBrqB,EAAOqqB,GAAQlsB,KAAKqM,OAAOxK,EAAOqqB,GAAOovB,EAAOpvB,IAEhDrqB,EAAOqqB,GAAQovB,EAAOpvB,EAG1B,OAAOrqB,IASTo3C,UAAW,SAASsC,GAClB,MACEA,aAAaruB,cACbquB,YAAaC,aACbD,YAAaE,gBACZF,GACc,gBAANA,IACD,OAANA,GACe,IAAfA,EAAErU,UACoB,gBAAfqU,GAAErjB,UAUfuS,SAAU,SAAS8Q,GACjB,MAA6C,oBAAtCj4B,OAAOpf,UAAU6nC,SAAS3nC,KAAKm3C,IASxCpK,SAAU,SAASuK,GACjB,OAAQvvC,MAAM0L,WAAW6jC,KAAOC,SAASD,IAS3ClD,OAAQ,SAASD,GACf,GAAI9gC,GAAS6tB,CAEb,IAAKtlC,KAAKi5C,UAAUV,GAqBlB9gC,EAAU8gC,MArB4B,CAEtC,KAC+B,gBAAtBA,IACPA,YAA6BqD,SAa7B,KAAM,IAAI5P,OAAM,qDARhB,MAFAv0B,EAAUpW,SAASN,cAAcw3C,IAG/B,KAAM,IAAIvM,OACR,0DACEuM,GAYV,GAAsC,QAAlC9gC,EAAQokC,QAAQ5tB,cAClBqX,EAAM7tB,MAEN,IAAsC,WAAlCA,EAAQokC,QAAQ5tB,cAClBqX,EAAM7tB,EAAQqkC,gBAAgBv6C,oBACzB,CACL,GAAsC,UAAlCkW,EAAQokC,QAAQ5tB,cAGlB,KAAsC,QAAlCxW,EAAQokC,QAAQ5tB,cACZ,GAAI+d,OACR,+FAGI,GAAIA,OAAM,kBAPlB1G,GAAM7tB,EAAQskC,iBAAiBx6C,gBAcrC,MAAO+jC,IASToJ,MAAO,SAAS8I,EAAI7sC,GAClB,MAAO,YACL,MAAO6sC,GAAGjxB,MAAM5b,EAAS8iB,aAY7B2oB,QAAS,SAASmF,GAChB,MAAOj4B,QAAOpf,UAAU6nC,SACrBxlB,MAAMg1B,GACNrvC,QAAQ,cAAe,IACvBA,QAAQ,MAAO,KASpByqC,uBAAwB,SAASlD,EAAKnO,GAEpC,OAAoB,KAAhBmO,EAAIsG,SAAsC,OAAhBtG,EAAIsG,QAMhC,GAJAtG,EAAIsG,QAAU,EACdtG,EAAIuG,QAAU,MAGM,KAAhBvG,EAAIuI,SAAsBvI,EAAIuI,QAAQvzC,QACxC,OAA+B,KAA3BgrC,EAAIuI,QAAQ,GAAGjC,QACjBtG,EAAIsG,QAAUtG,EAAIuI,QAAQ,GAAGjC,QAC7BtG,EAAIuG,QAAUvG,EAAIuI,QAAQ,GAAGhC,YACxB,QAA6B,KAAzBvG,EAAIuI,QAAQ,GAAGrkB,MAAkB,CAC1C,GAAInO,GAAO8b,EAAIt2B,uBAEfykC,GAAIsG,QAAUtG,EAAIuI,QAAQ,GAAGrkB,MAAQnO,EAAK8U,KAC1CmV,EAAIuG,QAAUvG,EAAIuI,QAAQ,GAAGpkB,MAAQpO,EAAK5R,cAGb,KAAtB67B,EAAIyG,mBACqB,KAA9BzG,EAAIyG,cAAcH,UACpBtG,EAAIsG,QAAUtG,EAAIyG,cAAcH,QAChCtG,EAAIuG,QAAUvG,EAAIyG,cAAcF,UAexCpD,WAAY,SAASnD,EAAKH,GAExB,GAAmB,IAAfG,EAAI+G,OACN,OAAO,CAGJ,QAAgB,KAAZlH,GAAkC,OAAZA,EAAkB,CAC/C,GAAI2I,GAAgBxI,EAAIyI,UAAY5I,EAAQ4I,UAC1CC,EAAkBrtC,KAAKstC,KACrBttC,KAAKwmC,IAAI7B,EAAIsG,QAAUzG,EAAQyG,QAAS,GACtCjrC,KAAKwmC,IAAI7B,EAAIuG,QAAU1G,EAAQ0G,QAAS,GAG9C,OAAOiC,GAAgB,KAAOE,EAAkB,GAIlD,OAAO,GAQT38B,IACEtV,KAAKsV,KACL,WACE,OAAO,GAAItV,OAAOmyC,WAStB11C,SAAU,SAASkiC,EAAMC,EAAMl7B,GAC7B,GACIjD,GAASkK,EAAMmL,EADfqyB,EAAOryC,KAEPiC,EAAU,KACV8c,EAAW,CACVnR,KACHA,KAEF,IAAI0uC,GAAQ,WACVv9B,GAA+B,IAApBnR,EAAQ27B,QAAoB,EAAI8I,EAAK7yB,MAChDvd,EAAU,KACV+d,EAAS6oB,EAAKtiB,MAAM5b,EAASkK,GACxB5S,IACH0I,EAAUkK,EAAO,MAGrB,OAAO,YACL,GAAI2K,GAAM6yB,EAAK7yB,KACVT,KAAgC,IAApBnR,EAAQ27B,UACvBxqB,EAAWS,EAEb,IAAIuJ,GAAY+f,GAAQtpB,EAAMT,EAc9B,OAbApU,GAAU3K,KACV6U,EAAO4Y,UACH1E,GAAa,GAAKA,EAAY+f,GAChC3mC,aAAaF,GACbA,EAAU,KACV8c,EAAWS,EACXQ,EAAS6oB,EAAKtiB,MAAM5b,EAASkK,GACxB5S,IACH0I,EAAUkK,EAAO,OAET5S,IAAgC,IAArB2L,EAAQq8B,WAC7BhoC,EAAUK,WAAWg6C,EAAOvzB,IAEvB/I,IAUX4uB,4BAA6B,SAASC,GACpC,GAAI5sC,GAAU,IAOd,OAJoB,SAAhB4sC,GAA0BA,EAAc,IAAMA,EAAc,IAC9D5sC,EAAU6M,KAAKqT,MAAM,IAAO0sB,IAGd,OAAZ5sC,EACK1B,OAAOqyB,uBAAyByoB,eAAe,IAE/CA,eAAep5C;;CCxR3B,SAAUzB,EAAQ6pB,GACE,gBAAZ3pB,UAA0C,mBAAXD,QAAyBA,OAAOC,QAAU2pB,IAC9D,kBAAXC,SAAyBA,OAAOC,IAAMD,OAAOD,GACnD7pB,EAAOwK,eAAiBqf,KACzBrqB,KAAM,WAAe,YAWrB,SAASwf,KACP,GAAIrK,GAAK,GAAIjL,KAEb,OADAiL,GAAGonC,SAAS,EAAG,EAAG,EAAG,GACdpnC,EAUT,QAASqnC,GAAQC,EAAOC,GACtB,OAAQD,GAASA,EAAME,mBAAqBD,GAASA,EAAMC,gBAU7D,QAASC,GAASznC,EAAIumC,GAGpB,MAFAvmC,GAAK,GAAIjL,MAAKiL,GACdA,EAAG0nC,QAAQ1nC,EAAGxL,UAAY+xC,GACnBvmC,EAYT,QAAS2nC,GAAW3nC,EAAIumC,EAAG9gB,GACzBzlB,EAAK,GAAIjL,MAAKiL,EAEd,IAAI4nC,GAAa5nC,EAAGxL,UAChBkH,EAAQsE,EAAGzL,WAAagyC,CAY5B,OAVAvmC,GAAG0nC,QAAQ,GACX1nC,EAAG6nC,SAASpiB,GAAQ,GAAK/pB,GAAS,GAAKA,GACvCsE,EAAG0nC,QAAQE,GAIP5nC,EAAGxL,UAAYozC,GACjB5nC,EAAG0nC,QAAQ,GAGN1nC,EAUT,QAAS8nC,GAAU9nC,EAAIumC,GAGrB,MAFAvmC,GAAK,GAAIjL,MAAKiL,GACdA,EAAG+nC,YAAY/nC,EAAGvL,cAAgB8xC,GAC3BvmC,EAST,QAASgoC,GAAQhoC,EAAIioC,GAGnB,MAFAjoC,GAAK,GAAIjL,MAAKiL,GACdA,EAAG+nC,YAAYE,GACRjoC,EAST,QAAS6nC,GAAS7nC,EAAItE,GACpB,MAAOisC,GAAW3nC,EAAItE,EAAQsE,EAAGzL,YASnC,QAAS2zC,GAAYrxC,GACnB,MAAO,UAAUmJ,GACf,MAAOmoC,GAAuB,gBAAPnoC,GAAkBnJ,EAAMmJ,GAAMA,IAazD,QAASooC,GAAcpoC,EAAI5J,EAAKwD,GAC9B,MAAQoG,GAAK5J,EAAOA,EACZ4J,EAAKpG,EAAOA,EACboG,EAGT,QAASmoC,GAASnoC,GAGhB,MAFAA,GAAK,GAAIjL,MAAKiL,GACdA,EAAGonC,SAAS,EAAG,EAAG,EAAG,GACdpnC,EAcT,QAASqoC,GAASC,EAAIjG,GACpB,GAAIv1C,OAAUoL,EACd,OAAO,YACLlL,aAAaF,GACbA,EAAUK,WAAWk1C,EAAIiG,IAO7B,QAASpX,MAST,QAASqX,KAGP,IAAK,GAFD7oC,GAAO4Y,UACPkwB,EAAK9oC,EAAK,GACLrC,EAAI,EAAGA,EAAIqC,EAAKpM,SAAU+J,EAAG,CACpC,GAAIorC,GAAK/oC,EAAKrC,MACd,KAAK,GAAIhG,KAAOoxC,GACdD,EAAGnxC,GAAOoxC,EAAGpxC,GAGjB,MAAOmxC,GAmCT,QAASE,GAAkBjhB,GACzBA,EAAOA,MACPA,EAAO8gB,EAAGtnB,IAAYwG,EACtB,IAAI5wB,GAAQqxC,EAAYzgB,EAAK5wB,MAQ7B,OAPA4wB,GAAKpxB,KAAOkyC,EAAGI,EAASlhB,EAAKpxB,MAC7BoxB,EAAK5wB,MAAQA,EACb4wB,EAAK1nB,QAAU6oC,EAAcnhB,GAC7BA,EAAKrxB,IAAMS,EAAM4wB,EAAKrxB,KAAO0xC,EAAUz9B,KAAQ,MAC/Cod,EAAK7tB,IAAM/C,EAAM4wB,EAAK7tB,KAAOkuC,EAAUz9B,IAAO,MAC9Cod,EAAKohB,cAAgBphB,EAAK5wB,MAAM4wB,EAAKohB,eAE9BphB,EAGT,QAASxG,KACP,OACE5qB,KAAMsyC,EAGNxyC,KAAM,WAIN0yC,cAAex+B,IAEfpU,OAAQ,SAAU+J,GAChB,MAAQA,GAAGzL,WAAa,EAAK,IAAMyL,EAAGxL,UAAY,IAAMwL,EAAGvL,eAG7DoC,MAAO,SAAUC,GACf,GAAIxC,GAAO,GAAIS,MAAK+B,EACpB,OAAOE,OAAM1C,GAAQ+V,IAAQ/V,GAG/Bw0C,UAAW,aAEX/oC,QAAS,WACP,OAAO,IAKb,QAAS6oC,GAAcnhB,GACrB,GAAI1nB,GAAU0nB,EAAK1nB,OAEnB,OAAO,UAAUC,EAAI+oC,GACnB,MAAOhpC,GAAQC,EAAI+oC,IAAOthB,EAAKrxB,KAAO4J,GAAMynB,EAAK7tB,KAAOoG,GA0B5D,QAASrV,GAAG2zC,EAAK9zC,EAAI8gC,GAGnB,MAFA9gC,GAAGwB,iBAAiBsyC,EAAKhT,GAAS,GAE3B,WACL9gC,EAAGunB,oBAAoBusB,EAAKhT,GAAS,IAgDzC,QAAS0d,GAAOD,GACd,GAAIthB,GAAOshB,EAAGthB,KACVpxB,EAAOoxB,EAAKpxB,KACZi4B,EAAQya,EAAGza,MACX2a,EAAW5yC,EAAKX,KAChBwzC,EAAYzhB,EAAKyhB,WAAa,EAC9B5wC,EAAeg2B,EAAMh2B,aACrBuwC,EAAgBva,EAAMua,cACtBM,EAAiBN,EAAct0C,WAC/B+B,EAAQ+T,IAAM68B,SAElB,OACE,+KAIM7wC,EAAK+yC,OAAOD,GACd,oEAEEN,EAAcp0C,cAChB,2GAIAw0C,EAASp2C,IAAI,SAAU4K,EAAMJ,GAC3B,MACE,+BAAiC4rC,GAAU5rC,EAAI6rC,GAAaD,EAAS31C,QAAU,YAEhFokC,KAAK,IACR2R,EAAQR,EAAeK,EAAW,SAAU50C,GAC1C,GAAIg1C,GAAeh1C,EAAKC,aAAe40C,EACnCI,GAAc9hB,EAAK1nB,QAAQzL,GAC3Bk1C,EAAUl1C,EAAK4yC,YAAc5wC,EAC7ByN,EAAY,QAQhB,OAPAA,IAAculC,EAAe,eAAiB,GAC9CvlC,GAAcsjC,EAAQ/yC,EAAMu0C,GAAiB,cAAgB,GAC7D9kC,GAAcsjC,EAAQ/yC,EAAMgE,GAAgB,eAAiB,GAC7DyL,GAAcwlC,EAAa,mBAAqB,GAChDxlC,GAAcylC,EAAU,gBAAkB,GAIxC,+CAHFzlC,GAAa,IAAM0jB,EAAKqhB,UAAUx0C,EAAMy0C,IAGsB,gBAAkBz0C,EAAK4yC,UAAY,KAC7F5yC,EAAKE,UACP,cAGN,4FAE4D6B,EAAKC,MAAQ,iEACbD,EAAKE,MAAQ,iEACbF,EAAKG,MAAQ,2BAY/E,QAASizC,GAAQh9C,EAAGs8C,GAClB,GAAI1xC,GAAM5K,EAAE8K,QACRmyC,EACDryC,IAAQsyC,EAAIxgB,MAAS,EACrB9xB,IAAQsyC,EAAIvgB,MAAS,EACrB/xB,IAAQsyC,EAAIC,IAAO,EACnBvyC,IAAQsyC,EAAIE,KAAQ,EACrB,CAEExyC,KAAQsyC,EAAIG,IACdf,EAAGvyC,QACMkzC,IACTj9C,EAAEsD,iBACFg5C,EAAGgB,UACDlB,cAAepB,EAASsB,EAAGza,MAAMua,cAAea,MAKtD,QAASM,GAAYv9C,EAAGs8C,GACtBA,EAAGgB,UACDzxC,aAAc+R,MAIlB,QAAS9T,GAAM9J,EAAGs8C,GAChBA,EAAGgB,UACDzxC,aAAc,OAIlB,QAAS9B,GAAM/J,EAAGs8C,GAChBA,EAAGvyC,QAGL,QAASyzC,GAAgBx9C,EAAGs8C,GAC1BA,EAAGgB,UACDG,KAAM,UAIV,QAASC,GAAe19C,EAAGs8C,GACzBA,EAAGgB,UACDG,KAAM,SAIV,QAASE,GAAc39C,EAAGs8C,GACxB,GAAIF,GAAgBE,EAAGza,MAAMua,aAC7BE,GAAGgB,UACDlB,cAAelB,EAAWkB,EAAe,KAI7C,QAASwB,GAAc59C,EAAGs8C,GACxB,GAAIF,GAAgBE,EAAGza,MAAMua,aAC7BE,GAAGgB,UACDlB,cAAelB,EAAWkB,GAAgB,KAI9C,QAASyB,GAAU79C,EAAGs8C,GACpBA,EAAGgB,UACDzxC,aAAc,GAAIvD,MAAKC,SAASvI,EAAEC,OAAOsE,aAAa,iBAI1D,QAASq4C,GAAQkB,EAAarB,EAAW7G,GACvC,GAAIx3B,GAAS,GACT2/B,EAAO,GAAIz1C,MAAKw1C,EACpBC,GAAK9C,QAAQ,GACb8C,EAAK9C,QAAQ,EAAI8C,EAAKl1C,SAAW4zC,GAK7BA,GAAasB,EAAKh2C,YAAc00C,EAAY,GAC9CsB,EAAK9C,QAAQwB,EAAY,EAK3B,KAAK,GAAIttC,GAAM,EAAGA,EAAM,KAAWA,EACjCiP,GAAUw3B,EAAGmI,GACbA,EAAK9C,QAAQ8C,EAAKh2C,UAAY,EAGhC,OAAOqW,GAeT,QAAS4/B,GAAch+C,EAAGs8C,GACxBA,EAAGgB,UACDlB,cAAehB,EAASkB,EAAGza,MAAMua,cAAe7zC,SAASvI,EAAEC,OAAOsE,aAAa,gBAC/Ek5C,KAAM,QAUV,QAASQ,GAAS3B,GAChB,GAAIthB,GAAOshB,EAAGthB,KACVpxB,EAAOoxB,EAAKpxB,KACZ+yC,EAAS/yC,EAAK+yC,OACdmB,EAAcxB,EAAGza,MAAMua,cACvB8B,EAAeJ,EAAYh2C,UAE/B,OACE,0BACE60C,EAAOv2C,IAAI,SAAU6I,EAAO2B,GAC1B,GAAI0G,GAAY,UAGhB,OACE,+CAHFA,GAAc4mC,IAAiBttC,EAAI,cAAgB,IAGW,iBAAmBA,EAAI,KACjF3B,EACF,cAEDg8B,KAAK,IACV,SAUJ,QAASkT,GAAUn+C,EAAGs8C,GACpB,GAAI1xC,GAAM5K,EAAE8K,QACRmyC,EACDryC,IAAQsyC,EAAIxgB,MAAS,EACrB9xB,IAAQsyC,EAAIvgB,MAAS,EACrB/xB,IAAQsyC,EAAIC,IAAO,EACnBvyC,IAAQsyC,EAAIE,KAAQ,EACrB,CAEExyC,KAAQsyC,EAAIG,IACdf,EAAGgB,UACDG,KAAM,QAECR,IACTj9C,EAAEsD,iBACFg5C,EAAGgB,UACDlB,cAAelB,EAAWoB,EAAGza,MAAMua,cAAea,GAAS,MAuBjE,QAASmB,GAAS9B,GAChB,GAAIza,GAAQya,EAAGza,MACXwc,EAAcxc,EAAMua,cAAcp0C,cAClCs2C,EAAezc,EAAMh2B,aAAa7D,aAEtC,OACE,yBACEu2C,EAASjC,EAAI,SAAUd,GACrB,GAAIlkC,GAAY,SAIhB,OAHAA,IAAckkC,IAAS6C,EAAc,cAAgB,GAInD,+CAHF/mC,GAAckkC,IAAS8C,EAAe,eAAiB,IAGO,gBAAkB9C,EAAO,KACnFA,EACF,cAGN,SAIJ,QAASgD,GAAax+C,EAAGs8C,GACvBA,EAAGgB,UACDlB,cAAeb,EAAQe,EAAGza,MAAMua,cAAe7zC,SAASvI,EAAEC,OAAOsE,aAAa,eAC9Ek5C,KAAM,QAIV,QAASgB,GAAUz+C,EAAGs8C,GACpB,GAAI1xC,GAAM5K,EAAE8K,QACRkwB,EAAOshB,EAAGthB,KACViiB,EACDryC,IAAQsyC,EAAIxgB,MAAQ9xB,IAAQsyC,EAAIC,GAAM,EACtCvyC,IAAQsyC,EAAIvgB,OAAS/xB,IAAQsyC,EAAIE,MAAS,EAC3C,CAEF,IAAIxyC,IAAQsyC,EAAIG,IACdf,EAAGgB,UACDG,KAAM,YAEH,IAAIR,EAAS,CAClBj9C,EAAEsD,gBACF,IAAIo7C,GAAcrD,EAAUiB,EAAGza,MAAMua,cAAea,EAEpDX,GAAGgB,UACDlB,cAAeT,EAAc+C,EAAa1jB,EAAKrxB,IAAKqxB,EAAK7tB,QAK/D,QAASoxC,GAASjC,EAAI1G,GAIpB,IAAK,GAHDx3B,GAAS,GACTjR,EAAMmvC,EAAGthB,KAAK7tB,IAAInF,cAEb4I,EAAIzD,EAAKyD,GAAK0rC,EAAGthB,KAAKrxB,IAAI3B,gBAAiB4I,EAClDwN,GAAUw3B,EAAGhlC,EAGf,OAAOwN,GAaT,QAASugC,GAAS1/B,EAAO2/B,EAAM5jB,GAC7B,GAAI6jB,GAEAhzC,EADAizC,GAAU,EAEVxC,GAEFv+C,OAAI0N,GACJuvB,KAAMA,EACN+jB,mBAAmB,EACnBC,qBAAqB,EACrBnd,MA6HF,WACE,OACEh2B,mBACE,MAAOA,IAETA,iBAAiB0H,GACXA,IAAOynB,EAAK1nB,QAAQC,KAIpBA,GACF1H,EAAe,GAAIvD,MAAKiL,GACxB+oC,EAAGza,MAAMua,cAAgBvwC,GAEzBA,EAAe0H,EAGjB+oC,EAAG2C,YAAYpzC,GACf+yC,EAAK,UACLtC,EAAGvyC,UAEL0zC,KAAM,UAjJRyB,eAAgBza,EAChB0a,cAAe,yBAEfC,YAAa,WACX3/C,SAASgjB,KAAKjL,YAAY8kC,EAAGv+C,KAG/BkhD,YAAa,SAAUpzC,GACrB,GAAI7L,GAAI,GAAIq/C,GAAY,UAAWC,SAAS,GAC5Ct/C,GAAEu/C,WAAY,EACdtgC,EAAMld,MAAQ8J,EAAemvB,EAAKxxB,OAAOqC,GAAgB,GACzDoT,EAAM8S,cAAc/xB,IAGtBw/C,oBAAqB,WACnB,MAAOxkB,GAAK5wB,MAAM6U,EAAMld,QAG1B09C,YAAa,WACX,MAAOC,IAAMpD,EAAGza,MAAM4b,OAGxBzyC,KAAM,WACA8zC,IAICxC,EAAGv+C,KACNu+C,EAAGv+C,GAAK4hD,EAAuB3kB,EAAMshB,EAAG6C,eACxCS,EAAsBtD,IAGxBzwC,EAAe8vC,EAAcW,EAAGkD,sBAAuBxkB,EAAKrxB,IAAKqxB,EAAK7tB,KACtEmvC,EAAGza,MAAMua,cAAgBvwC,GAAgBmvB,EAAKohB,cAC9CE,EAAGza,MAAM4b,KAAO,MAEhBnB,EAAG8C,cACH9C,EAAGC,SAEHqC,EAAK,UAGPiB,UAAW,WACT,QAASvD,EAAGv+C,MAAQu+C,EAAGv+C,GAAGgC,YAG5B+/C,SAAU,WACR,GAAIC,GAAUtgD,SAASC,aACvB,OAAO48C,GAAGv+C,IACRu+C,EAAGv+C,GAAGmC,SAAS6/C,IACfA,EAAQzoC,UAAU1O,QAAQ,cAAgB,GAG9Co3C,WAAY,WACV,MAAO1D,GAAGuD,aAGZ91C,MAAO,SAAUk2C,GACf,GAAIliD,GAAKu+C,EAAGv+C,EAEZ,IAAKu+C,EAAGuD,YAAR,CAIA,GAAI9hD,EAAI,CACN,GAAIM,GAASN,EAAGgC,UAChB1B,IAAUA,EAAOmN,YAAYzN,GAG/B+gD,GAAU,EAENmB,GAAiB3D,EAAGyC,mBACtBmB,EAAWjhC,GAMbve,WAAW,WACTo+C,GAAU,GACT,KAEHF,EAAK,WAGPz8B,QAAS,WACPm6B,EAAGvyC,QACH80C,KAGFtC,OAAQ,WACN,GAAKD,EAAGv+C,IAAOu+C,EAAGv+C,GAAGoiD,WAArB,CAIA,GAAIC,GAAW9D,EAAGwD,WACd3mC,EAAOmjC,EAAGmD,cAAclD,OAAOD,EACnCnjC,KAASmjC,EAAGv+C,GAAGoiD,WAAWv+C,UAAYuX,GAEtCmjC,EAAG4C,kBAECkB,GAAY9D,EAAG0C,sBACjBqB,EAAa/D,KAMjBgB,SAAU,SAAUzb,GAClB,IAAK,GAAIj3B,KAAOi3B,GACdya,EAAGza,MAAMj3B,GAAOi3B,EAAMj3B,EAGxBg0C,GAAK,eACLtC,EAAGC,UAmCP,OA/BAsC,GAAqByB,EAAkBrhC,EAAOq9B,GA+BvCA,EAGT,QAASqD,GAAuB3kB,EAAMmkB,GACpC,GAAIphD,GAAK0B,SAAS0X,cAAc,MAKhC,OAHApZ,GAAGuZ,UAAY0jB,EAAKtxB,KACpB3L,EAAG6D,UAAYu9C,EAERphD,EAGT,QAASuiD,GAAkBrhC,EAAOq9B,GAChC,GAAIiE,GAAa3E,EAAS,EAAG,WACvBU,EAAG0D,aACL1D,EAAGvyC,QAEHuyC,EAAGtxC,SAIHua,GACFrnB,EAAG,OAAQ+gB,EAAO28B,EAAS,IAAK,WACzBU,EAAGwD,YACNxD,EAAGvyC,OAAM,MAIb7L,EAAG,YAAa+gB,EAAO,WACjBA,IAAUxf,SAASC,eACrB6gD,MAIJriD,EAAG,QAAS+gB,EAAOshC,GAEnBriD,EAAG,QAAS+gB,EAAO,SAAUjf,GAC3B,GAAI6H,GAAOy0C,EAAGthB,KAAK5wB,MAAMpK,EAAEC,OAAO8B,MAClCwI,OAAM1C,IAASy0C,EAAGgB,UAChBlB,cAAev0C,MAMrB,OAAO,YACL0d,EAAI3kB,QAAQ,SAAUqtC,GACpBA,OAKN,QAASoS,GAAa/D,GACpB,GAAIrxC,GAAUqxC,EAAGv+C,GAAGoB,cAAc,cAClC,OAAO8L,IAAWA,EAAQN,QAG5B,QAASi1C,GAAsBtD,GAO7B,QAASzb,GAAQ7gC,GACfA,EAAEC,OAAOqX,UAAU/P,MAAM,KAAK3G,QAAQ,SAASixC,GAC7C,GAAIhT,GAAUyd,EAAGmD,cAAc5e,QAAQgR,EACvChT,IAAWA,EAAQ7+B,EAAGs8C,KAT1B,GAAIv+C,GAAKu+C,EAAGv+C,GACRyiD,EAAQziD,EAAGoB,cAAc,MAG7BpB,GAAG0iD,aAAehc,EAelBvmC,EAAG,OAAQsiD,EAAO5E,EAAS,IAAK,WACzBU,EAAGwD,YACNxD,EAAGvyC,OAAM,MAIb7L,EAAG,UAAWH,EAAI,SAAUiC,GACtBA,EAAE8K,UAAYoyC,EAAIwD,MACpB7f,EAAQ7gC,GAERs8C,EAAGmD,cAAckB,UAAU3gD,EAAGs8C,KAOlCp+C,EAAG,YAAasiD,EAAO,SAAUxgD,GAC/BA,EAAEC,OAAO0K,OAAS3K,EAAEC,OAAO0K,QACvBlL,SAASC,gBAAkBM,EAAEC,SAC/BD,EAAEsD,iBACF+8C,EAAa/D,MAIjBp+C,EAAG,QAASH,EAAI8iC,GAGlB,QAASqf,GAAWjhC,GAGlBA,EAAMtU,QAGF,mBAAmB8+B,KAAKmX,UAAUC,aAAeliD,OAAOmiD,UAC1D7hC,EAAM8hC,OAQV,QAASC,GAAU/hC,EAAO2/B,EAAM5jB,GAC9B,GAAIshB,GAAKqC,EAAS1/B,EAAO2/B,EAAM5jB,EAa/B,OATA/b,GAAMgiC,UAAW,EAOjB3E,EAAG6C,eAAiB,uCAEb7C,EAOT,QAAS4E,GAAajiC,EAAO2/B,EAAM5jB,GACjC,GAAIshB,GAAKqC,EAAS1/B,EAAO2/B,EAAM5jB,EAc/B,OAZAshB,GAAGyC,mBAAoB,EAEvBr9B,OAAOy/B,eAAe7E,EAAI,uBACxB32B,IAAK,WACH,MAAO1G,KAAUxf,SAASC,iBAI9B48C,EAAG4C,eAAiB,WAClBkC,EAAaniC,EAAOq9B,IAGfA,EAGT,QAAS8E,GAAaniC,EAAOq9B,GAC3B,GAAI+E,GAAWpiC,EAAM7R,wBACjBk0C,EAAM3iD,MAEV4iD,GAAWjF,EAAI+E,EAAUC,GACzBE,EAAWlF,EAAI+E,EAAUC,GAEzBhF,EAAGv+C,GAAGsP,MAAMzH,WAAa,GAG3B,QAAS47C,GAAWlF,EAAI+E,EAAUC,GAChC,GAAIG,GAAMnF,EAAGv+C,GACT2jD,EAAaJ,EAAI/sB,YACjBotB,EAAYN,EAAS3kB,KAAOglB,EAC5BE,EAAWN,EAAIppC,WAAawpC,EAC5Blc,EAAcic,EAAIjc,YAClBqc,EAAWF,EAAYnc,EACvBsc,EAAcF,EAAWpc,EACzB9I,EAAOmlB,EAAWD,GAAYE,EAAc,EAAIA,EAAcH,CAElEF,GAAIp0C,MAAMqvB,KAAOA,EAAO,KAG1B,QAAS6kB,GAAWjF,EAAI+E,EAAUC,GAChC,GAAIG,GAAMnF,EAAGv+C,GACTqY,EAAYkrC,EAAIn8C,YAChB48C,EAAW3rC,EAAYirC,EAASrrC,IAChCgsC,EAAYP,EAAIhc,aAChBwc,EAAWF,EAAWV,EAASp0C,OAAS,EACxCi1C,EAAWH,EAAWC,EAAY,EAClCG,EAAWD,EAAW,GAAKD,EAAWD,EAAY5rC,EAAYkrC,EAAIr8C,YAClE+Q,EAAMmsC,EAAUD,EAAWD,CAE3BR,GAAI7hD,YACN6hD,EAAI7hD,UAAUR,OAAO,cAAe+iD,GACpCV,EAAI7hD,UAAUR,OAAO,eAAgB+iD,IAEvCV,EAAIp0C,MAAM2I,IAAMA,EAAM,KAOxB,QAASosC,GAAcpY,EAAM4U,EAAM5jB,GACjC,GAAIshB,GAAKqC,EAAS3U,EAAM4U,EAAM5jB,EAiB9B,OAfAshB,GAAGvyC,MAAQ06B,EACX6X,EAAGn6B,QAAUsiB,EACb6X,EAAG2C,YAAcxa,EACjB6X,EAAG0C,oBAAsBhkB,EAAKgkB,oBAE9B1C,EAAGkD,oBAAsB,WACvB,MAAOxkB,GAAKohB,eAGdE,EAAG8C,YAAc,WACfpV,EAAKxyB,YAAY8kC,EAAGv+C,KAGtBu+C,EAAGtxC,OAEIsxC,EAOT,QAAS+F,GAAKpjC,EAAO2/B,EAAM5jB,GAGzB,MAFA/b,GAAQA,GAASA,EAAMg7B,QAAUh7B,EAAQxf,SAASN,cAAc8f,GAE9C,aAAd+b,EAAKtxB,KACAs3C,EAAU/hC,EAAO2/B,EAAM5jB,GAGd,aAAdA,EAAKtxB,KACAw3C,EAAajiC,EAAO2/B,EAAM5jB,GAGjB,iBAAdA,EAAKtxB,KACA04C,EAAcnjC,EAAO2/B,EAAM5jB,OADpC,GAcF,QAASsnB,KAGP,QAASC,GAAMvxC,EAAM6tB,IAClB2jB,EAASxxC,GAASwxC,EAASxxC,QAAc1C,KAAKuwB,GAGjD,QAAS4jB,GAAO5J,GACd,IAAK,GAAI7nC,KAAQ6nC,GACf0J,EAAMvxC,EAAM6nC,EAAI7nC,IARpB,GAAIwxC,KAYJ,QACEtkD,GAAI,SAAU8S,EAAM6tB,GAOlB,MANIA,GACF0jB,EAAMvxC,EAAM6tB,GAEZ4jB,EAAOzxC,GAGF5S,MAGTwgD,KAAM,SAAU5tC,EAAM0xC,IACnBF,EAASxxC,QAAapQ,QAAQ,SAAUi+B,GACvCA,EAAQ7tB,EAAM0xC,MAIlBn9B,IAAK,SAAUvU,EAAM6tB,GAWnB,MAVK7tB,GAKHwxC,EAASxxC,GAHC6tB,GAGQ2jB,EAASxxC,QAAa/P,OAAO,SAAU0hD,GACvD,MAAOA,KAAM9jB,OALf2jB,KASKpkD,OA+Db,QAASgL,GAAe6V,EAAO+b,GAgB7B,QAAS4jB,GAAK/M,GACZ+Q,EAAQhE,KAAK/M,EAAKgR,GAhBpB,GAAID,GAAUN,IACVt2C,EAAUiwC,EAAkBjhB,GAC5BtxB,EAAO24C,EAAKpjC,EAAO2/B,EAAM5yC,GACzB62C,GACFhhB,YACE,MAAOn4B,GAAKm4B,OAEd3jC,GAAI0kD,EAAQ1kD,GACZqnB,IAAKq9B,EAAQr9B,IACb+3B,SAAU5zC,EAAK4zC,SACftyC,KAAMtB,EAAKsB,KACXjB,MAAOL,EAAKK,MACZoY,QAASzY,EAAKyY,QAOhB,OAAO0gC,GA/+BT,GAAI3G,IACFjzC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACjD0zC,QACE,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEF9yC,MAAO,QACPC,MAAO,QACPC,MAAO,SAgELmzC,GACFxgB,KAAM,GACNygB,GAAI,GACJxgB,MAAO,GACPygB,KAAM,GACNsD,MAAO,GACPrD,IAAK,IAoBHgC,EAEJ,WACE,GAAIA,GAAc1gD,OAAO0gD,WAazB,OAX2B,kBAAhBA,KACTA,EAAc,SAAUl8C,EAAO2/C,GAC7BA,EAASA,IAAWxD,SAAS,EAAOyD,YAAY,EAAOnK,WAAQntC,GAC/D,IAAIomC,GAAMpyC,SAASujD,YAAY,cAE/B,OADAnR,GAAIoR,gBAAgB9/C,EAAO2/C,EAAOxD,QAASwD,EAAOC,WAAYD,EAAOlK,QAC9D/G,GAGTwN,EAAY/8C,UAAY3D,OAAO6+B,MAAMl7B,WAGhC+8C,KAOL6D,GACFvC,UAAW3D,EACXnc,SACEsiB,SAAUtF,EACVuF,UAAWzF,EACX0F,UAAWzF,EACX0F,WAAY/F,EACZgG,WAAYz5C,EACZ05C,WAAYz5C,EACZ05C,eAAgBjG,EAChBkG,cAAehG,GAEjBnB,OAAQA,GAsKNoH,IACFhD,UAAWxC,EACXtd,SACE+iB,WAAY5F,GAEdzB,OAAQ0B,GAsEN4F,IACFtH,OAAQ6B,EACRuC,UAAWlC,EACX5d,SACEijB,UAAWtF,IA4EXkB,IACFvwC,IAAK+zC,EACL1H,KAAMqI,GACN50C,MAAO00C,GA+hBT,OAAOv6C;;CCtqCP,SAAUzK,EAAQ8pB,GAII,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,yBACC,SAAU+X,GACX,MAAOhY,GAAS9pB,EAAQ8hC,KAEC,gBAAV5hC,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,eAIVvD,EAAO01B,WAAa5L,EAClB9pB,EACAA,EAAO8hC,aAIV9hC,OAAQ,SAAkBA,EAAQ8hC,GAErC,YAIA,SAASpM,MAGT,GAAIhL,GAAQgL,EAAW/xB,UAAYof,OAAOkS,OAAQ6M,EAAWn+B,UAI7D+mB,GAAM8L,YAAc,WAClB/2B,KAAK2lD,cAAc,IAGrB16B,EAAM+L,cAAgB,WACpBh3B,KAAK2lD,cAAc,IAOrB16B,EAAM06B,aAAe,SAAUC,GAE7BA,MAAkBv4C,KAAVu4C,GAA6BA,CAIrC,KAAM,GAFFC,GAAaD,EAAQ,mBAAqB,sBAC1CE,EAAcF,EAAQ5lD,KAAKs2B,kBAAoB,GACzC9jB,EAAE,EAAGA,EAAIxS,KAAK82B,QAAQruB,OAAQ+J,IAAM,CAC5C,GAAIuzC,GAAS/lD,KAAK82B,QAAQtkB,EAC1BxS,MAAKgmD,gBAAiBD,EAAQH,GAC9BG,EAAQF,GAAc,QAAS7lD,MAE1BO,EAAO0lD,eACVF,EAAO92C,MAAM62C,YAAcA,KAMjC76B,EAAMqL,kBAAoB,OAS1BrL,EAAMkM,YAAc,SAAUpyB,EAAOurB,GACtBtwB,KAAKq3B,gBAAiBtyB,KAKnC/E,KAAK03B,mBAAqBpH,EAE1BvrB,EAAMG,iBACNlF,KAAKw3B,kBAELx3B,KAAK63B,qBAAsB9yB,GAC3B/E,KAAK2rB,UAAW,eAAiB5mB,EAAOurB,KAI1C,IAAI41B,IACFluB,UAAU,EACVD,OAAO,EACPE,QAAQ,EACRkuB,QAAQ,GAINC,GACFC,OAAO,EACP1xC,UAAU,EACVV,QAAQ,EACRjO,QAAQ,EACRsgD,OAAO,EACPC,MAAM,EAiKR,OA7JAt7B,GAAMoM,gBAAkB,SAAUtyB,GAChC,GAAIyhD,GAAeN,EAAanhD,EAAMlD,OAAOq2B,UACzCuuB,EAAcL,EAAYrhD,EAAMlD,OAAOiB,MACvC4jD,GAAUF,GAAgBC,CAI9B,OAHMC,IACJ1mD,KAAK2mD,gBAEAD,GAITz7B,EAAMuM,gBAAkB,WACtB,GAAImqB,GAAUtgD,SAASC,aAETqgD,IAAWA,EAAQgB,MAAQhB,GAAWtgD,SAASgjB,MAE3Ds9B,EAAQgB,QAWZ13B,EAAM+N,YAAc,SAAUj0B,EAAOurB,GACnC,GAAIkI,GAAax4B,KAAKi5B,iBAAkBl0B,EAAOurB,EAC/CtwB,MAAK2rB,UAAW,eAAiB5mB,EAAOurB,EAASkI,IACjDx4B,KAAKk5B,UAAWn0B,EAAOurB,EAASkI,IAIlCvN,EAAMgO,iBAAmB,SAAUl0B,EAAOurB,GACxC,GAAIkI,IACFjqB,EAAG+hB,EAAQqH,MAAQ33B,KAAK03B,mBAAmBC,MAC3CnpB,EAAG8hB,EAAQsH,MAAQ53B,KAAK03B,mBAAmBE,MAM7C,QAHM53B,KAAK4mD,YAAc5mD,KAAKu4B,eAAgBC,IAC5Cx4B,KAAK6mD,WAAY9hD,EAAOurB,GAEnBkI,GAITvN,EAAMsN,eAAiB,SAAUC,GAC/B,MAAO1pB,MAAK2pB,IAAKD,EAAWjqB,GAAM,GAAKO,KAAK2pB,IAAKD,EAAWhqB,GAAM,GAUpEyc,EAAMyN,UAAY,SAAU3zB,EAAOurB,GACjCtwB,KAAK2rB,UAAW,aAAe5mB,EAAOurB,IACtCtwB,KAAK44B,eAAgB7zB,EAAOurB,IAG9BrF,EAAM2N,eAAiB,SAAU7zB,EAAOurB,GACjCtwB,KAAK4mD,WACR5mD,KAAK8mD,SAAU/hD,EAAOurB,GAGtBtwB,KAAK+mD,aAAchiD,EAAOurB,IAO9BrF,EAAM47B,WAAa,SAAU9hD,EAAOurB,GAClCtwB,KAAK4mD,YAAa,EAElB5mD,KAAKgnD,oBAAqB,EAC1BhnD,KAAK84B,UAAW/zB,EAAOurB,IAGzBrF,EAAM6N,UAAY,SAAU/zB,EAAOurB,GACjCtwB,KAAK2rB,UAAW,aAAe5mB,EAAOurB,KAIxCrF,EAAMiO,UAAY,SAAUn0B,EAAOurB,EAASkI,GAEpCx4B,KAAK4mD,YAIX5mD,KAAKm5B,SAAUp0B,EAAOurB,EAASkI,IAGjCvN,EAAMkO,SAAW,SAAUp0B,EAAOurB,EAASkI,GACzCzzB,EAAMG,iBACNlF,KAAK2rB,UAAW,YAAc5mB,EAAOurB,EAASkI,KAIhDvN,EAAM67B,SAAW,SAAU/hD,EAAOurB,GAEhCtwB,KAAK4mD,YAAa,EAElBtkD,WAAY,iBACHtC,MAAKgnD,oBACZnjD,KAAM7D,OAERA,KAAK05B,QAAS30B,EAAOurB,IAGvBrF,EAAMyO,QAAU,SAAU30B,EAAOurB,GAC/BtwB,KAAK2rB,UAAW,WAAa5mB,EAAOurB,KAMtCrF,EAAM0a,QAAU,SAAU5gC,GACnB/E,KAAKgnD,oBACRjiD,EAAMG,kBAOV+lB,EAAM87B,aAAe,SAAUhiD,EAAOurB,GAE/BtwB,KAAKinD,mBAAmC,WAAdliD,EAAMjC,OAIrC9C,KAAK86B,YAAa/1B,EAAOurB,GAGN,WAAdvrB,EAAMjC,OACT9C,KAAKinD,mBAAoB,EAEzB3kD,WAAY,iBACHtC,MAAKinD,mBACZpjD,KAAM7D,MAAQ,QAIpBirB,EAAM6P,YAAc,SAAU/1B,EAAOurB,GACnCtwB,KAAK2rB,UAAW,eAAiB5mB,EAAOurB,KAK1C2F,EAAWixB,gBAAkB7kB,EAAW6kB,gBAIjCjxB;;CC5QL,SAAU11B,EAAQ8pB,GAGI,kBAAVC,SAAwBA,OAAOC,IAEzCD,QACE,yBACC,SAAUU,GACX,MAAOX,GAAS9pB,EAAQyqB,KAEC,gBAAVvqB,SAAsBA,OAAOC,QAE9CD,OAAOC,QAAU2pB,EACf9pB,EACAuD,QAAQ,eAIVvD,EAAO8hC,WAAahY,EAClB9pB,EACAA,EAAOyqB,YAIVzqB,OAAQ,SAAkBA,EAAQyqB,GAErC,YAEA,SAASqb,MAET,QAAShE,MAGT,GAAIpX,GAAQoX,EAAWn+B,UAAYof,OAAOkS,OAAQxK,EAAU9mB,UAE5D+mB,GAAM0X,eAAiB,SAAU79B,GAC/B9E,KAAKgmD,gBAAiBlhD,GAAM,IAG9BmmB,EAAM2X,iBAAmB,SAAU99B,GACjC9E,KAAKgmD,gBAAiBlhD,GAAM,IAO9BmmB,EAAM+6B,gBAAkB,SAAUlhD,EAAM8gD,GAEtCA,MAAkBv4C,KAAVu4C,GAA6BA,CACrC,IAAIC,GAAaD,EAAQ,mBAAqB,sBAG1CuB,EAAa,WACZ5mD,GAAO0lD,aAEVkB,EAAa,cACH,gBAAkB5mD,KAE5B4mD,EAAa,cAEfriD,EAAM+gD,GAAcsB,EAAYnnD,OAIlCirB,EAAM6B,YAAc,SAAU/nB,GAC5B,GAAIgmB,GAAS,KAAOhmB,EAAMjC,IACrB9C,MAAM+qB,IACT/qB,KAAM+qB,GAAUhmB,IAKpBkmB,EAAMm8B,SAAW,SAAUpL,GACzB,IAAM,GAAIxpC,GAAE,EAAGA,EAAIwpC,EAAQvzC,OAAQ+J,IAAM,CACvC,GAAI60C,GAAQrL,EAAQxpC,EACpB,IAAK60C,EAAMC,YAActnD,KAAKunD,kBAC5B,MAAOF,KAObp8B,EAAMu8B,YAAc,SAAUziD,GAE5B,GAAIkP,GAASlP,EAAMkP,MACdA,IAAuB,IAAXA,GAA2B,IAAXA,GAGjCjU,KAAKynD,aAAc1iD,EAAOA,IAG5BkmB,EAAMo3B,aAAe,SAAUt9C,GAC7B/E,KAAKynD,aAAc1iD,EAAOA,EAAM2iD,eAAe,KAGjDz8B,EAAM08B,cAAgB,SAAU5iD,GAC9B/E,KAAKynD,aAAc1iD,EAAOA,IAQ5BkmB,EAAMw8B,aAAe,SAAU1iD,EAAOurB,GAG/BvrB,EAAMkP,QAAUjU,KAAKg0B,gBAI1Bh0B,KAAKg0B,eAAgB,EAErBh0B,KAAKunD,sBAA0Cl6C,KAAtBijB,EAAQs3B,UAE/Bt3B,EAAQs3B,UAAYt3B,EAAQg3B,WAE9BtnD,KAAKm3B,YAAapyB,EAAOurB,KAG3BrF,EAAMkM,YAAc,SAAUpyB,EAAOurB,GACnCtwB,KAAK63B,qBAAsB9yB,GAC3B/E,KAAK2rB,UAAW,eAAiB5mB,EAAOurB,IAI1C,IAAIu3B,IACFrU,WAAa,YAAa,WAC1BG,YAAc,YAAa,WAAY,eACvCmU,aAAe,cAAe,YAAa,iBA+J7C,OA5JA78B,GAAM4M,qBAAuB,SAAU9yB,GACrC,GAAMA,EAAN,CAIA,GAAIqmB,GAASy8B,EAAiB9iD,EAAMjC,KAEpCsoB,GAAO5oB,QAAS,SAAU0oB,GACxB3qB,EAAOY,iBAAkB+pB,EAAWlrB,OACnCA,MAEHA,KAAK+nD,oBAAsB38B,IAG7BH,EAAM+8B,uBAAyB,WAEvBhoD,KAAK+nD,sBAGX/nD,KAAK+nD,oBAAoBvlD,QAAS,SAAU0oB,GAC1C3qB,EAAO2mB,oBAAqBgE,EAAWlrB,OACtCA,YAEIA,MAAK+nD,sBAKd98B,EAAMg9B,YAAc,SAAUljD,GAC5B/E,KAAKkoD,aAAcnjD,EAAOA,IAG5BkmB,EAAMk9B,cAAgB,SAAUpjD,GACzBA,EAAM6iD,WAAa5nD,KAAKunD,mBAC3BvnD,KAAKkoD,aAAcnjD,EAAOA,IAI9BkmB,EAAMm9B,YAAc,SAAUrjD,GAC5B,GAAIsiD,GAAQrnD,KAAKonD,SAAUriD,EAAM2iD,eAC5BL,IACHrnD,KAAKkoD,aAAcnjD,EAAOsiD,IAU9Bp8B,EAAMi9B,aAAe,SAAUnjD,EAAOurB,GACpCtwB,KAAKg5B,YAAaj0B,EAAOurB,IAI3BrF,EAAM+N,YAAc,SAAUj0B,EAAOurB,GACnCtwB,KAAK2rB,UAAW,eAAiB5mB,EAAOurB,KAM1CrF,EAAMo9B,UAAY,SAAUtjD,GAC1B/E,KAAKsoD,WAAYvjD,EAAOA,IAG1BkmB,EAAMs9B,YAAc,SAAUxjD,GACvBA,EAAM6iD,WAAa5nD,KAAKunD,mBAC3BvnD,KAAKsoD,WAAYvjD,EAAOA,IAI5BkmB,EAAMu9B,WAAa,SAAUzjD,GAC3B,GAAIsiD,GAAQrnD,KAAKonD,SAAUriD,EAAM2iD,eAC5BL,IACHrnD,KAAKsoD,WAAYvjD,EAAOsiD,IAU5Bp8B,EAAMq9B,WAAa,SAAUvjD,EAAOurB,GAClCtwB,KAAKs7B,eACLt7B,KAAK04B,UAAW3zB,EAAOurB,IAIzBrF,EAAMyN,UAAY,SAAU3zB,EAAOurB,GACjCtwB,KAAK2rB,UAAW,aAAe5mB,EAAOurB,KAMxCrF,EAAMqQ,aAAe,WACnBt7B,KAAK2mD,gBACL3mD,KAAKgoD,yBACLhoD,KAAK64B,eAGP5N,EAAM07B,cAAgB,WAEpB3mD,KAAKg0B,eAAgB,QACdh0B,MAAKunD,mBAGdt8B,EAAM4N,YAAcwN,EAIpBpb,EAAMw9B,gBAAkB,SAAU1jD,GAC3BA,EAAM6iD,WAAa5nD,KAAKunD,mBAC3BvnD,KAAK0oD,eAAgB3jD,EAAOA,IAIhCkmB,EAAM09B,cAAgB,SAAU5jD,GAC9B,GAAIsiD,GAAQrnD,KAAKonD,SAAUriD,EAAM2iD,eAC5BL,IACHrnD,KAAK0oD,eAAgB3jD,EAAOsiD,IAUhCp8B,EAAMy9B,eAAiB,SAAU3jD,EAAOurB,GACtCtwB,KAAKs7B,eACLt7B,KAAK4oD,cAAe7jD,EAAOurB,IAI7BrF,EAAM29B,cAAgB,SAAU7jD,EAAOurB,GACrCtwB,KAAK2rB,UAAW,iBAAmB5mB,EAAOurB,KAM5C+R,EAAW6kB,gBAAkB,SAAU52B,GACrC,OACE/hB,EAAG+hB,EAAQqH,MACXnpB,EAAG8hB,EAAQsH,QAMRyK;;;ACpSP,QAASwmB,qBAGP,IAAM,GAFFC,GAAUznD,SAASH,iBAAkB,sBAE/BsR,EAAI,EAAGA,EAAIs2C,EAAQrgD,OAAQ+J,IAAM,CACzC,GAAI7S,GAAKmpD,EAASt2C,GACd9P,EAAM9C,EAAGD,GACTiT,EAAOjT,EAAGwG,aAAc,mBAG5B,KACE,GAAI4iD,GAASjlD,QAAS,WAAa8O,GACnC,MAAQhR,GACRH,QAAQC,IAAKE,EAAEmqC,WACf,IAAIgd,IAAS,EAIf,GAAuB,kBAAXA,KAA0BrmD,EAAI4Q,KAAM,UAAa,CAC3D,GAAI01C,GAAM,GAAID,GAAQppD,EAGtBC,GAAGD,GAAK2T,KAAM,SAAU01C,KA3B9B,GAAIppD,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAgC/GC,QAAOC,QAAUmoD;;;;;AChCjB,GAAIjpD,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GqoD,kBAAoB/kD,QAAS,wBAEjClE,GAAE,WACDipD;;;;;A9EFD,QAASnpD,WAAUC,GACPC,EAAED,GAERE,KAAK,2BAA2BC,GAAG,QAAS,WAC9C,GAAIC,GAAUH,EAAEI,MAAMC,SAClBC,EAAUN,EAAEI,MAAMH,KAAK,oBAE3BE,GAAQF,KAAK,4BAA4BM,YAAY,QACrDJ,EAAQK,YAAY,2BAEhBL,EAAQM,SAAS,4BACnBH,EAAQI,KAAK,iBAAiB,GAC9BJ,EAAQI,KAAK,aAAcJ,EAAQI,KAAK,sBAExCJ,EAAQI,KAAK,iBAAiB,GAC9BJ,EAAQI,KAAK,aAAcJ,EAAQI,KAAK,uBAjB9C,GAAIV,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAsB/GC,QAAOC,QAAUhB;;;;ACtBjB,QAASiB,eAAchB,GACtB,GAAIiB,GAAIZ,KACNa,EAAc,uBAChBD,GAAEjB,GAAKA,EACPiB,EAAEE,KAAOF,EAAEjB,GAAGoB,cAAc,cAC5BH,EAAEI,OAASJ,EAAEjB,GAAGoB,cAAc,qBAC9BH,EAAEK,KAAOL,EAAEE,KAAKI,iBAAiB,mBAEjCN,EAAEI,OAAOG,iBAAiB,QAAS,WAGlC,IAFA,GAAIC,GAAWC,SAASC,cAEjBF,IAAaC,SAASE,iBAAiB,CAC7C,GAAIH,IAAazB,EAIhB,MAHAiB,GAAEjB,GAAG6B,UAAUR,OAAOH,OACtBY,SAAQC,IAAI,OAKbN,GAAWA,EAASO,cAItBN,SAASE,gBAAgBJ,iBAAiB,QAAS,SAASS,GAE3D,IADA,GAAIC,GAASD,EAAEC,OACRA,IAAWR,SAASE,iBAAiB,CAC3C,GAAIM,EAAOL,UAAUM,SAAUjB,GAC9B,MAEDgB,GAASA,EAAOF,WAEjBf,EAAEjB,GAAG6B,UAAUO,OAAQlB,KAIxBN,OAAOY,iBAAiB,OAAQ,WAC/BP,EAAEI,OAAOgB,SAAW,GAIrB,IAAIC,GAAU,EACVC,EAAY,WACfC,aAAaF,GACbrB,EAAEjB,GAAG6B,UAAUY,IAAIvB,IAGhBwB,EAAa,WAChBF,aAAavB,GACbqB,EAAUK,WAAW,WACpB1B,EAAEjB,GAAG6B,UAAUO,OAAOlB,IACpB,IAGJD,GAAEI,OAAOG,iBAAiB,QAAS,SAASS,GACvCA,EAAEW,eACLL,MAIFtB,EAAEI,OAAOG,iBAAiB,OAAQkB,GAElCzB,EAAEK,KAAKuB,QAAQ,SAASvB,GACvBA,EAAKE,iBAAiB,QAASe,GAC/BjB,EAAKE,iBAAiB,OAAQkB,KAGhC5B,OAAOC,QAAUC;;;AChEjB,QAAS8B,KAAI9C,GACZ,GAAI+C,GAAM9C,EAAED,GACXgD,EAAQ/C,EAAE,mBAEX8C,GAAI5C,GAAG,QAAS,QAAS,SAAS8B,GACjC,GAAIgB,GAAKhD,EAAEI,MAAMM,KAAK,KACdqC,GAAME,OAAO,UAAYD,EAAK,OAEjCxC,YAAY,kBAA6B,cAAVwB,EAAEkB,QAVxC,GAAIlD,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAc/GC,QAAOC,QAAU+B;;;;ACXjB,QAASM,aAAYpD,GACpB,GAAIqD,GAAgBrD,EAAGoB,cAAc,uBACpCkC,EAAsBD,EAAcjC,cAAc,oBAClDmC,EAAuBF,EAAcjC,cAAc,wBACnDoC,EAAWxD,EAAGoB,cAAc,oBAC5BqC,EAAkB,GAAIC,aAAYL,GAClCM,EAAmB,GAAIC,SAAQJ,EAEhCD,GAAqBM,UAAYP,EAAoBlC,cAAc,UAAUyC,UAC7EP,EAAoBQ,cAAgB,EACpCH,EAAiBI,cAAcT,EAAoBU,OACnDP,EAAgBQ,SAASN,EAAiBI,cAAcG,KAAKP,IAd9D,GAAID,aAAcS,QAAQ,wBACtBP,QAAUO,QAAQ,yBAetBrD,QAAOC,QAAUqC;;;;;ACdjB,QAASgB,UAASpE,GACjB,GAAIiB,GAAIZ,KACJgE,EAAQC,MAAMC,UAAUC,MAAMC,KAAMzE,EAAGuB,iBAAiB,gBAC5DN,GAAE8B,IAAM9C,EAAED,GACViB,EAAEyD,cAAgBzD,EAAE8B,IAAI7C,KAAK,uBAC7Be,EAAE0D,eAAiB1D,EAAE8B,IAAI7C,KAAK,wBAC9Be,EAAE2D,OAAS3D,EAAE8B,IAAI7C,KAAK,eAGtB,IAAI2E,GAAY5D,EAAEyD,cAAcxE,KAAK,qBACrCe,GAAEyD,cAAcI,IAAKD,EAAUC,OAC/B7D,EAAE0D,eAAeI,KAAMF,EAAUE,QAEjC9D,EAAEyD,cAAcvE,GAAG,SAAU,WAC5B,GAAI6E,GAAiB3E,KAAK2D,MACxBe,EAAO9E,EAAEI,MAAMH,KAAK,WAAa8E,EAAiB,MAAMD,MACnC,SAAnBC,GACH/D,EAAE2D,OAAOK,SAAU,qBACnBhE,EAAE0D,eAAeI,KAAK,SAEtB9D,EAAE2D,OAAOM,YAAa,qBACtBjE,EAAE2D,OAAO1B,OAAQ,wBAA0B8B,EAAiB,OAAQC,SAAU,qBAC9EhE,EAAE0D,eAAeI,KAAMA,MAKzBV,EAAMxB,QAAQ,SAASsC,GACVA,EAAK/D,cAAc,sBAEzBI,iBAAiB,aAAc,SAAU4D,GACzCC,OAAOC,MAAQ,MACnBH,EAAKtD,UAAUR,OAAO,iBACtB+D,EAAMG,sBAnCV,GAAItF,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IA0C/GC,QAAOC,QAAUqD;;;;ACxCjB,QAASoB,UAASxF,GAChB,GAAIiB,GAAIZ,IAIR,IAFAY,EAAEwE,OAASzF,EAAGoB,cAAc,gBAExBH,EAAEwE,QAAUxE,EAAEwE,OAAOC,kBAAoB,EAC3C,CAAa,GAAIC,UAAU1E,EAAEwE,QAC3BG,UAAW,SACXC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChBC,SAAU,OAfhB,GAAIP,UAAWxB,QAAQ,WAqBvBrD,QAAOC,QAAUyE;;;ACrBjB,GAAIvF,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAC/GC,QAAOC,QAAU,SAASf,GACzB,GAAI+C,GAAM9C,EAAED,GACRmG,EAAOpD,EAAIqD,QAAQ,OAEvBnG,GAAED,GAAIE,KAAK,cAAcC,GAAG,QAAS,SAAS8B,GAC7CA,EAAEsD,iBACFtF,EAAEI,MAAM+F,QAAQ,WAAWlG,KAAK,iCAAiCkC,SACjE+D,EAAKE;;;;;ACLP,QAASC,WAAUtG,GAClB,GAAIiB,GAAIZ,IAERY,GAAEjB,GAAKA,EACPiB,EAAEsF,MAAQ7E,SAASN,cAAeH,EAAEjB,GAAGwG,aAAa,qBACpDvF,EAAEwF,IAAM/E,SAASN,cAAeH,EAAEjB,GAAGwG,aAAa,mBAClDvF,EAAEyF,YAAczF,EAAEjB,GAAGoB,cAAc,uBACnCH,EAAEC,YAAc,qBAEZD,EAAEsF,OAAStF,EAAEwF,KAChBxF,EAAE0F,OAGE1F,EAAEyF,aACNzF,EAAEyF,YAAYlF,iBAAiB,QAASP,EAAE2F,WAAW1C,KAAKjD,IAG3DhB,EAAEW,QAAQiG,KAAK,WACd5G,EAAEgB,EAAEjB,IAAI8G,YAAY7G,EAAEgB,EAAEsF,OAAOrG,KAAK,oKAAoK6G,WArB1M,GAAI9G,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GmG,SAAW7C,QAAQ,kBAwBvBmC,WAAU/B,UAAUoC,KAAO,WAC1B,GAAI1F,GAAIZ,KACNkG,EAAQtF,EAAEsF,MAAMU,UAAYrG,OAAOsG,YAAc,EACjDT,EAAMxF,EAAEwF,IAAIQ,UAAYrG,OAAOsG,YAAc,CAE3CX,IAASE,GACZ7F,OAAOY,iBAAiB,SAAUwF,SAAS,WAC1C,GAAIG,GAASvG,OAAOwG,WAChBD,GAASZ,GAASY,EAASV,EAC9BxF,EAAEjB,GAAG6B,UAAUY,IAAKxB,EAAEC,aAEtBD,EAAEjB,GAAG6B,UAAUO,OAAQnB,EAAEC,cAExB,OAILoF,UAAU/B,UAAUqC,WAAa,WAChC,GAAI3F,GAAIZ,IACRY,GAAEjB,GAAG6B,UAAUO,OAAQnB,EAAEC,aACzByB,WAAW,WACV1B,EAAEjB,GAAGoC,UACJ,MAGHtB,OAAOC,QAAUuF;;;;AClDjB,QAASe,aAAYrH,GACnB,GAAIsH,GAAetH,EAAGoB,cAAc,aACpC,IAAIkG,EAAe,CACjB,GAAIC,GAASD,EAAad,aAAa,YACnCgB,EAASF,EAAad,aAAa,WACvC,IAAIe,GAAUC,EAAS,CACrB,GAAIC,KAEAC,YAAa,eACbC,YAAa,SACbC,UACIC,WAAY,UAIhBC,GACFC,OAAQ,GAAIC,QAAOC,KAAKC,OAAOX,EAAOC,GACtCW,KAAM,GACNC,gBAAgB,GAEdC,EAAM,GAAIL,QAAOC,KAAKnF,IAAIwE,EAAaQ,EAC3CO,GAAIC,YAAYb,OAAQA,GACX,IAAIO,QAAOC,KAAKM,QAC3BC,SAAU,GAAIR,QAAOC,KAAKC,OAAOX,EAAOC,GACxCa,IAAKA,MAMbvH,OAAOC,QAAUsG;;;AC5BjB,QAASzD,SAAQ5D,GAChB,GAAIiB,GAAIZ,IACRY,GAAE8B,IAAM9C,EAAED,GACViB,EAAEwH,OAASxI,EAAE,8BAA8ByI,WAC3CzH,EAAE0H,MAAQ1I,EAAE,iCAAiCyI,WAC7CzH,EAAE2H,OAAS3I,EAAE,oBAAoByI,WACjCzH,EAAE4H,kBAAoB,EAEjB5H,EAAEwH,OAAOK,SACb7H,EAAE8H,YAAc9H,EAAEwH,OAAOvF,OAAO,6BAE5BjC,EAAE0H,MAAMG,SACZ7H,EAAE+H,WAAa/H,EAAE0H,MAAMzF,OAAO,cAG1BjC,EAAE2H,OAAOE,SACb7H,EAAEgI,YAAchI,EAAE2H,OAAO1F,OAAO,wBAlBlC,GAAIjD,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAsB/G+C,SAAQW,UAAUR,cAAgB,SAASC,GAC1C,GAAI/C,GAAIZ,IAEJY,GAAEiI,cAAgBlF,IAIlB/C,EAAEwH,OAAOK,QACZ7H,EAAEkI,WAAWnF,GAGV/C,EAAE0H,MAAMG,QACX7H,EAAEmI,UAAUpF,GAGT/C,EAAE2H,OAAOE,QACZ7H,EAAEoI,WAAWrF,GAGd/C,EAAEiI,aAAelF,EAEjB/D,EAAE,QAAQqJ,QAAQ,iBACjBtF,MAAOA,EACPuF,MAAOtI,EAAE4H,sBAIXjF,QAAQW,UAAU4E,WAAa,SAASnF,GACvC,GAAI/C,GAAIZ,IACRY,GAAE8H,YAAY7D,YAAY,2BAC1BjE,EAAEwH,OAAOvD,YAAY,2BACrBjE,EAAE8H,YAAc9I,EAAE+D,EAAMwF,MAAM,KAAKnB,IAAI,SAASoB,GAC/C,GAAIC,GAAYzI,EAAEwH,OAAOvF,OAAQ,wBAA0BuG,EAAc,MACzExI,GAAE4H,kBAAoBa,EAAUZ,OAChCY,EAAUzE,SAAS,+BAIrBrB,QAAQW,UAAU6E,UAAY,SAASpF,GACtC,GAAI/C,GAAIZ,IACRY,GAAE0H,MAAMzD,YAAY,aACpBjE,EAAE+H,WAAa/I,EAAE+D,EAAMwF,MAAM,KAAKnB,IAAI,SAASoB,GAC9C,GAAIE,GAAU1I,EAAE0H,MAAMzF,OAAQ,kBAAoBuG,EAAc,KAGhE,OAFAE,GAAQ1E,SAAS,aACjBhE,EAAE4H,kBAAoBc,EAAQb,OACvBa,MAIT/F,QAAQW,UAAU8E,WAAa,SAASrF,GACvC,GAAI/C,GAAIZ,IAEK,QAAT2D,GACH/C,EAAE8B,IAAIkC,SAAS,mBACfhE,EAAE2H,OAAO3D,SAAS,wBAElBhE,EAAE8B,IAAImC,YAAY,mBAClBjE,EAAE2H,OAAO1D,YAAY,sBACrBjE,EAAE2I,SAAW3I,EAAE2H,OAAO1F,OAAQ,wBAA0Bc,EAAQ,OAChE/C,EAAEgI,YAAY/D,YAAY,sBAC1BjE,EAAE2I,SAAS3E,SAAS,sBACpBhE,EAAE4H,kBAAoB5H,EAAE2I,SAASd,OACjC7H,EAAEgI,YAAchI,EAAE2I,WAIpB9I,OAAOC,QAAU6C;;;;;AC/EjB,QAASiG,YAAWC,GACnB,MAAQA,GAAKC,WAAa,EAAK,IAAMD,EAAKE,UAAY,IAAMF,EAAKG,cAGlE,QAASC,YAAWlK,EAAImK,GACvB9J,KAAKL,GAAKA,EACVK,KAAK+J,QAAS,EACd/J,KAAKsG,KAAKwD,GACV9J,KAAKgK,eAAgB,EA+JtB,QAASL,SAAQM,GAChB,MAAO,IAAIC,MAAKC,SAASF,EAAM9D,aAAaiE,kBAG7C,QAASC,aAAYC,EAAYC,GAChC,OAAyD,IAAlDA,EAAgBC,QAAQF,EAAWG,UAG3C,QAASC,aAAYC,EAASC,GAC7B,GAAIC,GAAO5G,MAAMC,UAAUC,MAAMC,KAAKuG,EAAQhL,GAAGuB,iBAAiB4J,cAClE,IAAIF,EAAUnC,QAAUoC,EAAO,CACdA,EAAKhI,OAAO,SAASoH,GACpC,MAAOI,aAAYV,QAAQM,GAAQW,KAE1BpI,QAAQ,SAASyH,GAC1BA,EAAMzI,UAAUY,IAAI2I,UAAY,gBA/LnC,GAAIC,gBAAiBlH,QAAQ,oBACzBlE,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAE3GyK,WAAa,UAChBC,WAAa,UACbH,UAAY,SACZD,aAAe,IAAMC,UACrBX,eAAiB,WAalBP,YAAW3F,UAAUoC,KAAO,SAASwD,GACpC,GAAIlJ,GAAIZ,KACPmL,GACCC,OAAQ,SAAU3B,GACjB,MAAOA,GAAK4B,sBAEbC,KAAM,WACNC,IAAK/B,WAAW,GAAIU,OACjBsB,MACEX,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACrCY,MAAO,GACPC,MAAO,GACPC,MAAO,IAEZC,OAAQhL,EAAEgL,OAAO/H,KAAKjD,GACtBiL,aAAcjL,EAAEiC,OAAOgB,KAAKjD,GAC5BkL,cAAelL,EAAEiC,OAAOgB,KAAKjD,GAC7BmL,YACAC,MAAO,SAASC,GACf,IAAMA,EACL,MAAO,IAAI/B,KAEZ,IAAIT,GAAO,GAAIS,MAAK+B,EAAIC,QAAQ,IAAK,KACrC,OAAOC,OAAM1C,GAAQ,GAAIS,MAAST,GAI/BK,KACLA,MAGGA,EAAS8B,SACZ9B,EAASsC,eAAiBtC,EAAS8B,OACnC9B,EAAS8B,OAAST,EAAgBS,QAGnChL,EAAEkJ,SAAWlK,EAAEyM,UAAWlB,EAAiBrB,GAE3ClJ,EAAE0L,WAAa,GAAItB,gBAAepK,EAAEjB,GAAIiB,EAAEkJ,UAE1ClJ,EAAE0L,WAAWxM,GAAG,QAAS,WACtBc,EAAEmJ,QAAS,EACXnJ,EAAEjB,GAAG4M,UAGR3L,EAAE0L,WAAWxM,GAAG,OAAQ,SAAS6K,GAC9BtJ,SAASN,cAAc,eAAewL,QACtClL,SAASN,cAAc,OAAOI,iBAAiB,UAAW,SAASS,GACjE,GAAI4K,GAAM5K,EAAE6K,OAAS7K,EAAE8K,OAEX,MAARF,GACF5K,EAAE+K,kBACF/K,EAAEsD,kBACe,IAARsH,IACT5K,EAAE+K,kBACF/L,EAAEjB,GAAG4M,WAIT3L,EAAEmJ,QAAS,IAGdnJ,EAAEjB,GAAGwB,iBAAiB,UAAW,SAASS,GACxC,IAAKhB,EAAEmJ,OAAQ,CAGA,MAFFnI,EAAE6K,OAAS7K,EAAE8K,UAGrB9L,EAAE0L,WAAWM,UAKpBhM,EAAEjB,GAAGwB,iBAAiB,SAAU,WAC/B,GACC0L,GAASC,CAGNzC,aAFI,GAAIH,MAAKtJ,EAAEjB,GAAGgE,OAEA/C,EAAEkJ,SAASiC,WAChCc,EAAUjM,EAAE0L,WAAW3M,GAAGoB,cAAc,eACxC+L,EAAWlM,EAAE0L,WAAW3M,GAAGoB,cAAc,gBACrC8L,GACHA,EAAQrL,UAAUO,OAAO,cAEtB+K,GACHA,EAAStL,UAAUO,OAAO,eAE3BnB,EAAEjB,GAAGgE,MAAQ,GACb/C,EAAEiC,OAAOjC,EAAE0L,aAEX1L,EAAE+K,WAML9B,WAAW3F,UAAUrB,OAAS,SAAS8H,GACtCD,YAAYC,EAAS3K,KAAK8J,SAASiC,WAGpClC,WAAW3F,UAAUlD,OAAS,WACzBhB,KAAKsM,WAAW3M,GACnBK,KAAK2L,QAEL3L,KAAKsM,WAAWM,OAEEvL,SAASN,cAAc,uBAC7BS,UAAUR,OAAO,+BAG/B,IAAI+L,mBAAoB,SAASpN,EAAIgE,GACpC/D,EAAED,GAAIiF,SAAS,WACf,IACIoI,GAAgBpN,EAAED,GAAIsN,KAAK,mCAC3BD,GAAcvE,OACjBuE,EAActI,KAAKf,GAEnB/D,EAAED,GAAIuN,MAAM,iDAA+CvJ,EAAQ,WAIrEkG,YAAW3F,UAAUyH,MAAQ,WAC5BoB,kBAAkB/M,KAAKL,GAAIK,KAAKL,GAAGgE,MACnC,IAAIhE,GAAKK,KAAKsM,WAAW3M,EACzBA,IAAMA,EAAGwN,cAAcC,YAAYzN,GACnCK,KAAKsM,WAAW3M,OAAK0N,GACjBrN,KAAK8J,SAASwD,SACjBtN,KAAK8J,SAASwD,WAIhBzD,WAAW3F,UAAU0H,OAAS,SAASjB,GACtC,GAAI/J,GAAIZ,IACR0K,aAAYC,EAAS/J,EAAEkJ,SAASiC,UAE5BnL,EAAEoJ,gBAINW,EAAQhL,GAAGwB,iBAAiB,QAAS,SAASS,IACzCA,EAAEC,OAAOL,UAAUM,SAASmJ,aAC/BrJ,EAAEC,OAAOL,UAAUM,SAASoJ,cAC5BR,YAAYC,EAAS/J,EAAEkJ,SAASiC,YAIlCpB,EAAQhL,GAAGwB,iBAAiB,UAAW,SAASS,GAC/C5B,KAAK6C,OAAO8H,IACX9G,KAAKjD,IAEPA,EAAE2M,aAAc,IAGjB1D,WAAW3F,UAAUsJ,gBAAkB,WACtC,MAAOxN,MAAKsM,WAAWmB,cAwBxBhN,OAAOC,QAAUmJ;;;;ACjMjB,QAAS6D,WAAU/N,GAClB,GAAIiB,GAAIZ,KACPgD,EAAgBrD,EAAGoB,cAAc,0BACjCkC,EAAsBD,EAAcjC,cAAc,uBAElDqC,GADuBJ,EAAcjC,cAAc,wBACjC,GAAIsC,aAAYL,IAClCM,EAAmB,GAAIC,SAAQ5D,EAMhC,IAJAiB,EAAEjB,GAAKA,EACPiB,EAAEoH,IAAMpH,EAAEjB,GAAGoB,cAAc,iCAC3BH,EAAE+M,QAAU,KAER/M,EAAEoH,IAAM,CACX,GAAI4F,IACHC,aAAa,EACbrI,SAAS,EACTsI,KAAK,EACLC,qBAAqB,EACrBC,QAAS,EACTC,QAAS,GACTC,UAAW,SAAUC,EAAQC,GAC5B,GAAIC,GAAczN,EAAE+M,QAAQW,SAC5B,IAAID,GAAe,QAClB,OAAQE,EAAG,EAAGC,EAAE,EAGjB,IAAIC,GAAQzO,KAAK0O,WAEhBC,GAAeF,EAAMxJ,OAASoJ,EAAc,GAE5CO,GAAgBH,EAAMI,QAAUR,EAAc,EAE/C,QACCE,EAAGO,KAAKvD,IANI,EAMWuD,KAAKC,IAAIJ,EAAYP,EAAOG,IACnDC,EAAGM,KAAKvD,IALG,EAKWuD,KAAKC,IAAIH,EAAaR,EAAOI,OAItDK,EAASjO,EAAEoH,IAAIgH,wBAAwBH,MAEnCA,KACHjO,EAAEoH,IAAIrG,WAAWsN,MAAMJ,OAASA,EAAS,MAE1CjO,EAAE+M,QAAUuB,WAAWtO,EAAEoH,IAAK4F,GAC9BhN,EAAEuO,aAAevO,EAAEjB,GAAGoB,cAAc,kBACpCH,EAAEwO,cAAgBxO,EAAEjB,GAAGoB,cAAc,mBAEjCH,EAAEuO,cACLvO,EAAEuO,aAAahO,iBAAiB,QAAS,SAAS4D,GACjDA,EAAMG,iBACNtE,EAAE+M,QAAQ0B,WAIRzO,EAAEwO,eACLxO,EAAEwO,cAAcjO,iBAAiB,QAAS,SAAS4D,GAClDA,EAAMG,iBACNtE,EAAE+M,QAAQ2B,YAKZ1O,EAAE2O,SAAW,SAAShB,EAAGC,GACxB,GAAIgB,GAAK5O,EAAEoH,IAAIyH,gBAIf,OAHAD,GAAGjB,EAAIA,EACPiB,EAAGhB,EAAIA,EAEAgB,EAAGE,gBAAgB9O,EAAEoH,IAAI2H,eAAeC,YAGhDhP,EAAEiP,iBAAmB,SAASjO,GAC7B,GAAI4K,GAAM5K,EAAE6K,OAAS7K,EAAE8K,OAOvB,QAJIF,GAAO,IAAMA,GAAO,IACvB5K,EAAEsD,iBAGKsH,GACP,IAAK,IACJ5L,EAAE+M,QAAQmC,OAAOvB,EARX,GAQoBC,EAAG,GAE7B,MACD,KAAK,IACJ5N,EAAE+M,QAAQmC,OAAOvB,EAAG,EAAGC,EAZjB,IAcN,MACD,KAAK,IACJ5N,EAAE+M,QAAQmC,OAAOvB,GAhBX,GAgBqBC,EAAG,GAE9B,MACD,KAAK,IACJ5N,EAAE+M,QAAQmC,OAAOvB,EAAG,EAAGC,GApBjB,OA0BT5N,EAAEuO,aAAahO,iBAAiB,UAAWP,EAAEiP,kBAC7CjP,EAAEwO,cAAcjO,iBAAiB,UAAWP,EAAEiP,kBAG/CtP,OAAOwP,GAAKnP,EAAE+M,QAKV1K,IACHrC,EAAEE,KAAOmD,MAAMC,UAAUC,MAAMC,KAAMnB,EAAoBoF,UACzDzH,EAAEoP,UACFpP,EAAEE,KAAK0B,QAAS,SAASyN,GACxB,GAAItM,GAAQsM,EAAK9J,aAAa,QAC1BxC,IACHA,EAAMwF,MAAM,KAAKnB,IAAI,SAASoB,GAC7BxI,EAAEoP,OAAOE,KAAK9G,QAOdxI,EAAEoP,QAAUpP,EAAEoH,MACjBpH,EAAEuP,UAAYlM,MAAMC,UAAUC,MAAMC,KAAMxD,EAAEoH,IAAI9G,iBAAiB,MAC7DN,EAAEuP,WACLvP,EAAEuP,UAAU3N,QAAS,SAAS4N,GAC7B,GAAIxN,GAAKwN,EAAMjK,aAAa,OACC,GAAzBvF,EAAEoP,OAAOxF,QAAQ5H,IACpBwN,EAAMC,aAAa,cAAezN,MAMtCU,EAAiBI,cAAcT,EAAoBU,OACnDP,EAAgBQ,SAASN,EAAiBI,cAAcG,KAAKP,IA1I9D,GAAID,aAAcS,QAAQ,wBACtBP,QAAUO,QAAQ,0BAClBoL,WAAapL,QAAQ,eA0IzBrD,QAAOC,QAAUgN;;;ACzIjB,QAAS4C,cAAa7G,GAErB,OADkB,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAC9GA,EAAKC,YAGxB,QAASF,YAAWC,GACnB,MAAO6G,cAAa7G,GAAQ,IAAMA,EAAKE,UAAY,KAAOF,EAAKG,cAGhE,QAAS2G,aAAY5Q,GACpBK,KAAKL,GAAKA,EACVK,KAAKgB,OAAShB,KAAKL,GAAGoB,cAAc,uBACpCf,KAAK+E,MAAQd,MAAMC,UAAUC,MAAMC,KAAKpE,KAAKL,GAAGuB,iBAAiB,sBACjElB,KAAKyN,aAAezN,KAAKL,GAAGoB,cAAc,qBAC1Cf,KAAKwQ,UAAYxQ,KAAKL,GAAGoB,cAAc,kBACvCf,KAAKyQ,YAAc,EAEnBzQ,KAAK0Q,kBApBN,GAAI7G,YAAa/F,QAAQ,uBACrBlE,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAuB/G+P,aAAYrM,UAAUwM,gBAAkB,WACvC,GAAI9P,GAAIZ,IACHY,GAAEI,QACNJ,EAAE+P,kBAIJJ,YAAYrM,UAAUyM,eAAiB,WACtC,GAAI/P,GAAIZ,IAERY,GAAEgQ,SAAW,GAAI/G,YAAWjJ,EAAE6M,cAC7BrC,OAAQ,SAASqC,GAChB,MAAOjE,YAAWiE,MAIpB7M,EAAE6M,aAAatM,iBAAiB,SAAU,WACzC,GAAIsI,GAAO,GAAIS,MAAKtJ,EAAE6M,aAAa9J,OAClCkN,EAAQpH,EAAKqH,cAAgB,EAC7BC,EAAMtH,EAAKE,SAERoH,GAAM,KACTA,EAAM,IAAMA,GAGTF,EAAQ,KACXA,EAAQ,IAAMA,EAEf,IAAIG,GAAaH,EAAQ,IAAME,EAAM,IAAMtH,EAAKG,aAChDqH,UAASC,KAAO,SAAWF,IAG5BpQ,EAAEI,OAAOG,iBAAiB,QAASP,EAAEgQ,SAAS5P,OAAO6C,KAAKjD,EAAEgQ,YAG7DL,YAAYrM,UAAUiN,gBAAkB,WACvC,GACCC,GAAM7Q,OAAO0Q,SAASC,IACvB,QAAwC,IAApCE,EAAI5G,QAAQ,YAE+B,IAApC4G,EAAI5G,QAAQ,WAOxB+F,YAAYrM,UAAUmN,aAAe,WACpC,GAAIzQ,GAAIZ,IACRqB,UAASF,iBAAiB,QAAS,SAAUS,GACvCA,EAAEC,SAAWjB,EAAEI,OAAOW,WAAWZ,cAAc,cAAgBa,EAAEC,QAAUjB,EAAEgQ,WACjFhQ,EAAEgQ,SAASjF,QACX/K,EAAEI,OAAOQ,UAAUO,OAAO,mCAI7BtB,OAAOC,QAAU6P;;;;AChFjB,QAASe,KAAI3R,GACZA,EAAGwB,iBAAiB,QAAS,SAASS,GACnB,IAAdA,EAAE8K,SAA+B,KAAd9K,EAAE8K,UAA6C,IAA3B/M,EAAGgE,MAAM6G,QAAQ,MAAmC,IAApB7K,EAAGgE,MAAM8E,SACnF9I,EAAGgE,OAAS,OAKflD,OAAOC,QAAU4Q;;ACNjB,QAASC,aAAY5R,GACpB,GAAIiB,GAAIZ,IAGR,IADAY,EAAEwE,OAASzF,EAAGoB,cAAc,0BACvBH,EAAEwE,QAAUxE,EAAEwE,OAAOC,kBAAoB,EAC7C,CAAa,GAAIC,UAAU1E,EAAEwE,QAC5BG,UAAW,SACXC,SAAS,EACTE,iBAAiB,EACjBC,UAAU,EACV6L,YAAY,EACZC,YACCC,GAAI,GACJC,GAAI,GAAIC,GAAI,GACZC,GAAI,GAAIC,GAAI,GACZC,GAAI,OAjBR,GAAIzM,UAAWxB,QAAQ,WAuBvBrD,QAAOC,QAAU6Q;;ACvBjB,QAASS,QAAOrS,GACf,GAAIsS,GAAchO,MAAMC,UAAUC,MAAMC,KAAKzE,EAAGuB,iBAAiB,4BAC5D+Q,IAEJA,EAAYzP,QAAQ,SAASsC,GAC5B,GAGCoN,GACAC,EAJGC,EAAmBtN,EAAK/D,cAAc,UACzCsR,EAAoBD,EAAiBlR,iBAAiB,UACtDoR,EAAkBF,EAAiBjM,aAAa,oBAGhDoM,EAAmB,EACpBH,GAAiB/B,aAAa,oBAAqB,IACnD6B,EAAiB,gHACjB,KAAK,GAAIM,GAAI,EAAGA,EAAIH,EAAkB5J,OAAQ+J,IAC7CN,GAAkB,uDACjBG,EAAkBG,GAAGrM,aAAa,SAAW,KAC7CkM,EAAkBG,GAAGhP,UAAY,OAEnC0O,IAAkB,uDACdI,IACHC,EAAmB,2CAA6CD,EAAkB,WAEnFH,EAAe,8EAAgFI,EAAmB,2CACjHH,EAAiBK,UAAY,SAAWP,EACzCpN,EAAKtB,UAAY2O,CAGjB,IAAItF,GAAUlN,EAAGoB,cAAc,wBAC7B2R,EAAS/S,EAAGoB,cAAc,sBAChBpB,GAAGoB,cAAc,uBAE7B8L,GAAQrJ,UAAYkP,EAAO3R,cAAc,UAAUyC,UACnDkP,EAAOjP,cAAgB,IAK1BhD,OAAOC,QAAUsR;;;ACnCjB,QAASW,iBAAgBC,GACxBA,EAAOA,EAAK1G,QAAQ,OAAQ,OAAOA,QAAQ,OAAQ,MACnD,IAAI2G,GAAQ,GAAIC,QAAO,SAAWF,EAAO,aACrCG,EAAUF,EAAMG,KAAKzS,OAAO0Q,SAASC,KACzC,OAAmB,QAAZ6B,EAAmB,GAAKE,mBAAmBF,EAAQ,GAAG7G,QAAQ,MAAO,MAG7E,QAAS3I,SAAQ5D,GAChB,GAAIiB,GAAIZ,KACNkT,EAAWP,gBAAgB,WAC7B/R,GAAE8B,IAAM9C,EAAED,GACViB,EAAEuS,SAAWvS,EAAE8B,IAAI7C,KAAK,iBACxBe,EAAEwS,QAAUxS,EAAEuS,SAAStQ,OAAO,0BAC9BjC,EAAEiI,aAAe,KACjBjI,EAAEyS,aAAezS,EAAE8B,IAAI4Q,KAAK,iBAC5B1S,EAAE2D,QAAS,EAEP3D,EAAEyS,eACLzS,EAAE2D,OAAS3E,EAAEgB,EAAE8B,IAAI4Q,KAAK,kBACxB1S,EAAE2S,YAAc3S,EAAE2D,OAAO1E,KAAK,kBAG1BqT,GACJtS,EAAE4S,UAAY5S,EAAE8B,IAAI7C,KAAK,iBAAkBqT,EAAW,MACtDtS,EAAE6S,aAAa7S,EAAE4S,YAEjB5S,EAAE6S,aAAa7S,EAAEuS,SAASO,GAAG,IAG9B9S,EAAEuS,SAASrT,GAAG,QAAS,SAAS8B,GAC/B,GAAI+R,GAAU/T,EAAEgC,EAAEC,OAEd8R,GAAQtT,SAAS,uBACnBsT,EAAUA,EAAQ5N,QAAQ,qBAG5BnF,EAAE6S,aAAaE,KAGhB/S,EAAE2S,YAAYzT,GAAG,QAAS,SAAS8B,GAClC,GAAI+R,GAAU/T,EAAEgC,EAAEC,OAEZ8R,GAAQtT,SAAS,oBACnBsT,EAAUA,EAAQ5N,QAAQ,kBAG9BnF,EAAE6S,aAAaE,KAhDjB,GAAI/T,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAqD/G+C,SAAQW,UAAUuP,aAAe,SAAUE,GAC1C,GAAI/S,GAAIZ,KACP2E,EAAiBgP,EAAQL,KAAK,SAE/B,IAAI3O,GAAkB/D,EAAEiI,aAAxB,CAIAjI,EAAEwS,QAAQvO,YAAY,wBAEtB,IAAI+O,GAAchU,EAAE,iBAAmB+E,EAAiB,KACpDiP,GAAYnL,QACfmL,EAAYhP,SAAS,yBAGjBhE,EAAE2D,SACN3D,EAAE2D,OAAOM,YAAa,qBACtBjE,EAAE2D,OAAO1B,OAAQ,wBAA0B8B,EAAiB,OAAQC,SAAU,sBAG/EhE,EAAEiI,aAAelE,EACjB/D,EAAEwS,QAAUQ,EAEZhT,EAAE8B,IAAIuG,QAAQ,YAKfxI,OAAOC,QAAU6C;;;;AC9EjB,QAASiG,YAAWC,GACnB,GAAIoH,GAAQpH,EAAKC,WAAa,CAI9B,OAHImH,GAAQ,KACXA,EAAQ,IAAMA,GAERpH,EAAKG,cAAgB,IAAMiH,EAAQ,KAAOpH,EAAKE,UAAY,GAAK,IAAM,IAAMF,EAAKE,UAGzF,QAASkK,YAAWpK,GACnB,MAAOD,YAAWC,GAAMyC,QAAQ,KAAM,KAGvC,QAAS4H,WAAUC,EAAU9T,GAC5B,MAAOgE,OAAMC,UAAUC,MAAMC,KAAKnE,EAAOiB,iBAAiB6S,IAG3D,QAASC,eAAcC,GACtBA,EAAOlI,UAAW,EAClBkI,EAAOzS,UAAUY,IAAI8R,eAGtB,QAASC,cAAaF,GACrBA,EAAOlI,UAAW,EAClBkI,EAAOzS,UAAUO,OAAOmS,eAGzB,QAASE,MAAKzU,GACb,GAAIiB,GAAIZ,KACJqU,EAAcP,UAAU,kBAAmBnU,GAC3C2U,EAAQR,UAAU,OAAQnU,GAC1B4U,EAAUT,UAAU,qDAAsDnU,GAC1E6U,GAAkB,EAElBC,EAAwBX,UAAU,8BAA+BnU,GACjE+U,EAAoBZ,UAAU,0BAA2BnU,EACzD+U,IACHA,EAAkB1M,IAAIgM,eAGnBS,GACHA,EAAsBzM,IAAI,SAAU2M,GACnCA,EAASxT,iBAAiB,SAAU,SAASS,GACxCA,EAAEC,OAAO+S,QACZF,EAAkB1M,IAAImM,cAEtBO,EAAkB1M,IAAIgM,mBAM1BM,EAAMtM,IAAI,SAASlC,GAClBA,EAAK3E,iBAAiB,SAAU,SAASS,GACxC,IAAK4S,EAEJ,MADA5S,GAAEsD,kBACK,CAGRsP,IAAkB,EAClBD,EAAQvM,IAAIgM,mBAKVK,GACHA,EAAY7R,QAAS,SAASsC,GAC7B,GAAI+P,IACHzJ,OAAQ5B,YAEL+B,EAAMzG,EAAKqB,aAAa,WAE5B,IAAOoF,EAMNA,EAAMA,EAAIW,QAAQ,IAAK,SANX,CACZX,EAAM,GAAIrB,KACV,IAAIpD,GAAShC,EAAKqB,aAAa,gBAAkB,CACjDoF,GAAIuJ,WAAWvJ,EAAIwJ,aAAyC,GAA1BxJ,EAAIyJ,oBAA2B7K,SAASrD,IAC1EyE,EAAM/B,WAAW+B,GAIlBsJ,EAAKtJ,IAAMA,EACXsJ,EAAK9F,IAAMjK,EAAKqB,aAAa,YACzB0O,EAAK9F,MACR8F,EAAK9F,IAAM8F,EAAK9F,IAAI7C,QAAQ,IAAK,KAGlC,IAAI+I,GAAcnQ,EAAKqB,aAAa,mBAEhC8O,KACHA,EAAcA,EAAY9L,MAAM,KAChC0L,EAAKK,QAAU,SAASC,GACvB,OAAgD,IAAzCF,EAAYzK,QAAQqJ,WAAWsB,MAIxCvU,EAAEgQ,SAAW,GAAI/G,YAAW/E,EAAM+P,KAjGrC,GAAIhL,YAAa/F,QAAQ,uBACrBoQ,cAAgB,kBAqGpBzT,QAAOC,QAAU0T;;;ACpGjB,QAASgB,aAAYzV,GACpB,GAAI+C,GAAM9C,EAAED,EACZ,IAAI+C,EAAK,CACR,GAAI2S,GAAuB3S,EAAI7C,KAAK,6BACpC,IAAIwV,EAAsB,CACzB,GAAIC,GAAmBD,EAAqBxV,KAAK,0BAC7C0V,EAAkBF,EAAqBxV,KAAK,8BAC5C0V,IAAmBD,GAAgD,KAA5BA,EAAiB5Q,SAC3D4Q,EAAiBE,OACjBD,EAAgBE,OAAOH,EAAiB5Q,WAX5C,GAAI9E,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAiB/GC,QAAOC,QAAU0U;;;;;ACdjB,QAASM,QAAO/V,GACf,GAAIiB,GAAIZ,IA+FR,IA7FAY,EAAE8B,IAAM9C,EAAED,GACViB,EAAE+U,aAAe,GACjB/U,EAAEgV,UAAYhW,EAAEyB,UAChBT,EAAEiV,MAAQjW,EAAE,QACZgB,EAAEkV,MAAQlW,EAAE,QACZgB,EAAEmV,MAAQnW,EAAE,SACZgB,EAAEoV,MAAQpV,EAAE8B,IAAI7C,KAAK,iBACrBe,EAAEqV,QAAUrV,EAAE8B,IAAI7C,KAAK,mBACvBe,EAAEsV,WAAatV,EAAE8B,IAAI7C,KAAK,+BAC1Be,EAAEuV,cAAgBvV,EAAE8B,IAAI7C,KAAK,kBAC7Be,EAAEwV,iBAAmBxV,EAAE8B,IAAI7C,KAAK,sBAChCe,EAAEyV,YAAczV,EAAE8B,IAAI7C,KAAK,qBAC3Be,EAAE0V,iBAAmB1W,EAAE,sBACvBgB,EAAE2V,QAAU3W,EAAEW,QAGdK,EAAE4V,QACF5V,EAAEgV,UAAU9V,GAAG,SAAU6G,SAAS/F,EAAE4V,MAAM3S,KAAKjD,GAAI,MAG/CA,EAAEqV,QAAQxN,QACb7H,EAAEqV,QAAQnW,GAAG,QAAS,WACrBc,EAAEkV,MAAM1V,YAAY,oBAKlBQ,EAAEsV,WAAWzN,SAChB7H,EAAEsV,WAAWpW,GAAG,QAAS,SAAS8B,GACjC,GAAI6U,GAAQ7W,EAAEI,KAEVY,GAAE2V,QAAQtR,SAAW,MACxBrD,EAAEsD,iBACFuR,EAAMxW,SAASG,YAAY,mBAAmBsW,WAAW7R,YAAY,sBAIvEjE,EAAE8B,IAAI7C,KAAK,mCAAmCC,GAAG,QAAS,WACzDF,EAAEI,MAAM+F,QAAQ,2BAA2B3F,YAAY,kBACvD,IAAIuW,GAAQ/W,EAAEI,MACdkR,EAAOyF,EAAMrW,KAAK,QAClBsW,EAAO1F,EAAK2F,UAAU3F,EAAK1G,QAAQ,KAAK,EAC5B5J,GAAEmV,MAAMlW,KAAK,UAAY+W,EAAO,MACtC,GAAGrK,UAIR3L,EAAEkW,YAAc,SAAS/W,GACvB,GAAI0W,GAAQ1W,EAAQF,KAAK,MAErBE,GAAQM,SAAS,4BACnBoW,EAAMnW,KAAK,gBAAiB,QAC5BP,EAAQ6E,SAAS,qBAIrBhE,EAAEmW,aAAe,SAAShX,GACxBA,EAAQiX,KAAK,SAASC,EAAQC,GAC5B,GAAIT,GAAQ7W,EAAEsX,GAAOrX,KAAK,MACtBD,GAAEsX,GAAO7W,SAAS,4BACpBoW,EAAMnW,KAAK,gBAAiB,SAC5BV,EAAEsX,GAAOrS,YAAY,uBAK3BjE,EAAEuW,cAAgB,SAASpX,GACrBA,EAAQM,SAAS,mBACnBO,EAAEmW,aAAahX,GAEfa,EAAEkW,YAAY/W,IAIlBa,EAAEuV,cAAcrW,GAAG,QAAS,SAAS8B,GACnC,GAAI6U,GAAQ7W,EAAEI,KAEdY,GAAEkW,YAAYL,EAAMxW,UACpBW,EAAEmW,aAAaN,EAAMxW,SAASyW,cAGhC9V,EAAEuV,cAAciB,OAAOtX,GAAG,OAAQ,SAAS8B,GAC5ChB,EAAEmW,aAAanW,EAAE8B,IAAI7C,KAAK,iBAGzBD,EAAEyB,UAAUvB,GAAG,QAAS,SAAS8B,GAC1BhB,EAAEoV,MAAMqB,GAAGzV,EAAEC,SAAYjB,EAAEoV,MAAMsB,IAAI1V,EAAEC,QAAQ4G,QAClD7H,EAAEmW,aAAanW,EAAE8B,IAAI7C,KAAK,+BAM7Be,EAAEwV,iBAAmB,CACxB,GAAInV,GAAOL,EAAEwV,iBAAiBvW,KAAK,OAAOS,KAAK,QAC9C+H,EAAWzH,EAAEwV,iBAAiBvW,KAAK,oBAExBwN,IAARpM,GAAqBoH,EAASI,QACjCJ,EAAS2O,KAAM,WACd,GAAIL,GAAQ/W,EAAEI,MACbkR,EAAOyF,EAAMrW,KAAK,QAClBsW,EAAO1F,EAAK2F,UAAU3F,EAAK1G,QAAQ,KAAK,EAGrCoM,GAAKnO,QACRkO,EAAM7W,GAAG,QAAS,SAASiF,GAC1B,GAAIwS,GAAQ3W,EAAEmV,MAAMlW,KAAK,UAAY+W,EAAO,KACxCW,GAAM9O,SACT1D,EAAMG,iBACNtE,EAAE4W,aAAaD,QAoBrB,GAXI3W,EAAEyV,YAAY5N,QACjB7H,EAAEyV,YAAYvW,GAAG,QAAU,WAC1Bc,EAAEkV,MAAMlR,SAAS,oBAAoBqE,QAAQ,kBAI/CrI,EAAEkV,MAAMhW,GAAG,iBAAkB,WAC1Bc,EAAEyV,YAAY9J,UAIbhM,OAAO0Q,SAAS2F,KAAO,CAE1B,GAAIjD,GAAU/S,EAAEmV,MAAMlW,KAAK,UAAYU,OAAO0Q,SAAS2F,KAAKzS,MAAM,GAAK,KACnEwP,GAAQlL,QACX7I,EAAEW,QAAQiG,KAAK,WACd5F,EAAE4W,aAAa7D,KAKlB/T,EAAEW,QAAQT,GAAG,OAAQ,WACpB,GAAI8W,GAAOrW,OAAO0Q,SAAS2F,IACd,MAATA,GACHtU,WAAW,WACV,GAAIM,GAAKgU,EAAK1K,QAAQ,IAAK,IACvBuL,EAAUpW,SAASqW,eAAe9U,EAClC6U,IAAWA,EAAQE,gBACtBF,EAAQE,kBAEP,KA1JN,GAAI/X,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GmG,SAAW7C,QAAQ,kBA8JvB4R,QAAOxR,UAAUsT,aAAe,SAAS3V,GACxC,GAAIjB,GAAIZ,KACJ8G,EAASjF,EAAOiF,SAAS8Q,IAAMC,WAAWjX,EAAE8B,IAAIoV,IAAI,eAAiBlX,EAAEoV,MAAMnH,SAAW,CAI5F,OAHAjP,GAAE,cAAcmY,SACfC,UAAWlR,GACT,MACI,GAGR4O,OAAOxR,UAAU+T,kBAAoB,SAASC,GAC7ClY,KAAK6V,MAAMzV,YAAY,eAAgB8X,IAGxCxC,OAAOxR,UAAUsS,MAAQ,WACxB,GAAI5V,GAAIZ,IACRY,GAAEqX,kBAAkBrX,EAAEgV,UAAUoC,YAAcpX,EAAE8B,IAAImM,WAGrDpO,OAAOC,QAAUgV;;;;AC/KjB,QAASyC,WAAUxY,GACjB,GAAIiB,GAAIZ,IAIR,IAFAY,EAAEwE,OAASzF,EAAGoB,cAAc,cAExBH,EAAEwE,QAAUxE,EAAEwE,OAAOC,kBAAoB,EAC3C,CAAa,GAAIC,UAAU1E,EAAEwE,QAC3BG,UAAW,SACXC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChBC,SAAU,OAfhB,GAAIP,UAAWxB,QAAQ,WAqBvBrD,QAAOC,QAAUyX;;AClBjB,QAASC,YAAWzY,GAClB,GAAIiB,GAAIZ,IAERY,GAAEwE,OAASzF,EAAGoB,cAAc,iBAC5BH,EAAEyX,OAASpU,MAAMC,UAAUC,MAAMC,KAAKzE,EAAGuB,iBAAiB,uBAC1DN,EAAE0X,OAASrU,MAAMC,UAAUC,MAAMC,KAAKzE,EAAGuB,iBAAiB,cAErDN,EAAEwE,QAAUxE,EAAEwE,OAAOC,kBAAoB,IAC5CzE,EAAE2X,SAAW,GAAIjT,UAAU1E,EAAEwE,QAC3BG,UAAW,SACXC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,UAAU,EACb6S,QAAQ,EAER1Y,IACC2Y,MAAO,WACN,KAAMC,GAAY1Y,KAAK2Y,SAASzX,iBAAiB,wBAC3C0X,EAAmB5Y,KAAK2Y,SAAS5X,cAAc,mCACjD2X,GAAUjQ,OAAS,GACtBiQ,EAAUlW,QAAQ,SAASyN,GAC1BA,EAAKI,aAAa,YAAa,KAG7BuI,GACHA,EAAiBvI,aAAa,WAAY,GAG3CrQ,KAAK2F,SAASkT,KAAKrW,QAAQ,SAASsW,GACnC,GAAI7E,GAAS5S,SAAS0X,cAAc,UAChCC,EAAaF,EAAI3S,aAAa,cAAc8S,WAAW,OAAQ,QACnEhF,GAAO5D,aAAa,aAAc2I,GAClC/E,EAAOiF,UAAY,aACnBJ,EAAIK,gBAAgB,cAEpBL,EAAIM,YAAYnF,GAEhB6E,EAAI3X,iBAAiB,QAAS,SAASS,GACtCkX,EAAIO,aAIPC,OAAQ,SAASC,GAChBvZ,KAAK2Y,SAASzX,iBAAiB,wBAAwBsB,QAAQ,SAASyN,GACvEA,EAAKI,aAAa,YAAa,KAEhCrQ,KAAK2Y,SAAS5X,cAAc,oCAAoCsP,aAAa,WAAY,OAK1FzP,EAAE4Y,aACA5Y,EAAE0X,OAAO7P,QACZ7H,EAAE6Y,YAGDlZ,OAAOY,iBAAkB,SAAUwF,SAAS,WAC1C/F,EAAE4Y,YAAW,GACb5Y,EAAE2X,SAASC,SACX5X,EAAE4Y,aACF5Y,EAAEwE,OAAOsU,WAAW,aACrB,MAEHnZ,OAAOY,iBAAkB,OAAQ,WAChCP,EAAEwE,OAAO+T,gBAAgB,eApE5B,GAAI7T,UAAWxB,QAAQ,YACnB6C,SAAW7C,QAAQ,kBAwEvBsU,YAAWlU,UAAUsV,WAAa,SAASG,GAC1C,GAAI/Y,GAAIZ,IACRY,GAAEyX,OAAOrQ,IAAK,SAAU4R,GAEtBA,EAAK3K,MAAMJ,OADR8K,EACiB,GAEA/Y,EAAE2X,SAASsB,cAAgB,QAKlDzB,WAAWlU,UAAUuV,UAAY,WAChC,GAAI7Y,GAAIZ,IACJY,GAAE0X,OAAO7P,QAAUlI,OAAOuZ,YAAc,UACf,KAAhBlZ,EAAE0X,OAAO,IACjB1X,EAAE0X,OAAO,GAAGyB,OAGhBnZ,EAAE2X,SAASzY,GAAI,SAAU,WACxBc,EAAE0X,OAAO9V,QAAS,SAASwX,GAC1BA,EAAMC,UAEFrZ,EAAE0X,OAAO1X,EAAE2X,SAAS9U,gBACxB7C,EAAE0X,OAAO1X,EAAE2X,SAAS9U,eAAesW,WAMvCtZ,OAAOC,QAAU0X;;;ACnGjB,QAAS8B,eAAeva,GACvB,GAAIiB,GAAIZ,IACRY,GAAE8B,IAAM9C,EAAED,GACViB,EAAEuZ,WAAa,EAEfvZ,EAAEwZ,gBAAkBxZ,EAAE8B,IAAI7C,KAAK,wBAC/Be,EAAEyZ,aAAezZ,EAAE8B,IAAI4Q,KAAK,gBAC5B1S,EAAE0Z,MAAQ1Z,EAAE8B,IAAI7C,KAAK,iBACjBe,EAAEwZ,iBACLxZ,EAAEwZ,gBAAgBta,GAAG,QAAS,SAAU8B,GACvCA,EAAEsD,iBACFtE,EAAEwZ,gBAAgB9Z,KAAM,YAAY,GACpCM,EAAE2Z,cAfL,GAAI3a,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC9Gga,GAAwB,mBAAXja,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAmB7G0Z,eAAchW,UAAUqW,UAAY,WACnC,GAAI3Z,GAAIZ,IA0BR,OAzBAY,GAAEuZ,aACFva,EAAE6a,MACD3X,KAAM,OACN4X,SAAU,OACVtJ,IAAKoJ,GAAGG,QACRrH,MACC6G,WAAYvZ,EAAEuZ,WACdS,YAAaha,EAAEyZ,aACfQ,OAAQ,kBAETC,QAAS,SAAUxH,GAClB,IAAMA,EAAKyH,KAEV,WADAtZ,SAAQC,IAAK,8FAGdd,GAAEwZ,gBAAgB9Z,KAAM,YAAY,GACpCM,EAAE0Z,MAAM7E,OAAQnC,EAAKyH,MAAOC,OAAQ,KAC9B1H,EAAK2H,aACVra,EAAEwZ,gBAAgB5E,QAGpB0F,MAAQ,WACPzZ,QAAQC,IAAK,mGAGR,GAGRjB,OAAOC,QAAUwZ;;;;;AC9CjB,QAASiB,UAASxb,GACjB,GAAI0T,GACHzS,EAAIZ,IAELY,GAAE8B,IAAM9C,EAAED,GACViB,EAAE6P,YAAc,EAEhB7P,EAAEwa,YAAcxa,EAAE8B,IAAI4Q,KAAK,gBAC3BD,EAAezS,EAAE8B,IAAI4Q,KAAK,iBAC1B1S,EAAEya,UAAYzb,EAAEyT,GAEhBzS,EAAE0a,SAEF1a,EAAEuS,SAAWvT,EAAEgB,EAAE8B,IAAI4Q,KAAK,qBAE1B1S,EAAE8B,IAAI5C,GAAG,QAASc,EAAE2a,UAAU1X,KAAKjD,IAEnCA,EAAEuS,SAASrT,GAAG,SAAUc,EAAE0a,OAAOzX,KAAKjD,IArBvC,GAAIhB,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAE3Ggb,SAAW,CAsBfL,UAASjX,UAAUqX,UAAY,SAAU3Z,GACxC,GAAIsH,GACHtI,EAAIZ,IACLY,GAAE6P,cACFvH,EAAQtI,EAAE6P,YAAc+K,QACxB,IAAIC,GAAe7a,EAAE2D,OAAOJ,MAAM,EAAG+E,GAAOwS,WAAWC,IAAI,yBAAyBjV,OAgBpF,OAfA9F,GAAE2D,OAAOJ,MAAM,EAAG+E,GAAOtE,SAAS,wBAC9BsE,EAAQtI,EAAE2D,OAAOkE,OACpB7H,EAAE8B,IAAIsY,OAAO,KAEbpa,EAAE8B,IAAIkZ,QAAQ,KAGXha,GAAKA,EAAEkB,MACL2Y,EAAahT,QACjBnG,WAAW,WACTmZ,EAAa5b,KAAK,KAAK,GAAG0M,SACzB,KAIErD,GAGRiS,SAASjX,UAAUoX,OAAS,WAC3B,GAAI1a,GAAIZ,IACJY,GAAE2D,QACL3D,EAAE2D,OAAOM,YAAY,wBAGtBjE,EAAE2D,OAAS3D,EAAEya,UAAUxY,OAAO,IAAMjC,EAAEwa,aACtCxa,EAAE6P,YAAc,EAChB7P,EAAE2a,aAGH9a,OAAOC,QAAUya;;;;AC3DjB,QAASU,OAAMlc,GACd,GAAIsJ,GACH6S,EAAkBnc,EAAGwG,aAAa,qBAEnCxG,GAAGwB,iBAAiB,QAAS,SAASS,GACjCA,EAAEC,SAAWlC,GAChBA,EAAG6B,UAAUO,OAAO,eAIhB+Z,IAIN7S,EAAU5H,SAASN,cAAc+a,GACjC7S,EAAQ9H,iBAAiB,QAAS,WACjCxB,EAAG6B,UAAUY,IAAI,gBAInB3B,OAAOC,QAAUmb;;;ACjBjB,QAASE,WAAUpc,GAClB,GAAIiB,GAAIZ,KACP0C,EAAM9C,EAAED,GACRqc,EAAQtZ,EAAI7C,KAAK,oCAAoCoc,OACrDC,EAAS,EACTC,EAAYzZ,EAAI7C,KAAK,iBACrBuc,EAAetN,KAAKuN,KAAK3Z,EAAI7C,KAAK,oBAAoB0Z,QAAU,GAAK,CAEtE3Y,GAAEwE,OAASzF,EAAGoB,cAAc,iBAC5BH,EAAE0b,gBAAkB,IAEP,GAAIhX,UAAS1E,EAAEwE,QAC3BG,UAAW,OACXC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChB2W,WAAY3c,EAAEW,QAAQ0E,QAAUrE,EAAE0b,gBAAkB,EAAI,EAExDxc,IACC2Y,MAAO,WACN7Y,EAAEI,KAAKwc,WAAW/E,SAASgF,aAAazc,KAAK2Y,UAC7C/Y,EAAEI,KAAK2Y,UAAU9Y,KAAK,2BAA2BS,KAAK,WAAY,MAClEV,EAAEI,KAAK2Y,UAAU9Y,KAAK,uCAAuCS,KAAK,WAAY,MAE/EgZ,OAAQ,SAASC,GAChB3Z,EAAEI,KAAK2Y,UAAU9Y,KAAK,2BAA2BS,KAAK,WAAY,MAClEV,EAAEI,KAAK2Y,UAAU9Y,KAAK,uCAAuCS,KAAK,WAAY,SAK1Eoc,OAAON,GAEd1Z,EAAI7C,KAAK,uCAAyCqc,EAAS,KAAKtX,SAAS,oBACzEuX,EAAUrc,GAAG,QAAS,WACjBoc,EAAS,EAAIF,EAChBE,GAAkB,EAElBA,EAASF,EAEVtZ,EAAI7C,KAAK,uCAAyCqc,EAAS,KAAKtX,SAAS,oBACpEsX,GAAUF,GACdG,EAAU3G,SA/Cb,GAAIlQ,UAAWxB,QAAQ,YACtBlE,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAqD5GC,QAAOC,QAAUqb;;;;;ACPjB,QAASY,iBAAkBhd,GAC1B,GAAIiB,GAAIZ,IACPY,GAAEjB,GAAKA,EACPiB,EAAEgc,iBAAmB,GACrBhc,EAAEic,aAAejd,EAAE,wBAEfgB,EAAEic,aAAapU,QACnB7H,EAAEic,aAAa7F,KAAK,WACnBpX,EAAEI,MAAMF,GAAG,QAAS,SAAS8B,GAC5B,GAAI+R,GAAU/T,EAAEA,EAAEI,MAAMM,KAAK,QAC7B,IAAGqT,EAAS,CACX/R,EAAEsD,gBACF,IAAI4B,GAAS6M,EAAQ7M,SAAS8Q,IAAMC,WAAWlE,EAAQmE,IAAI,cAC3DlY,GAAE,cAAcmY,SACfC,UAAWlR,GACT,UAMPgW,OAAOxW,KAAK3G,EAAIiB,EAAEgc,kBA/DnB,GAAIhd,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3Gsc,OAAS,WACZ,YAqCA,QAhCCrF,QAAS,KACTtP,SAAU,EACVrB,OAAQ,EACRiW,UAAW,WACVxc,OAAOY,iBAAiB,SAAUnB,KAAKgd,SAASnZ,KAAK7D,QAEtDsG,KAAM,SAASmR,EAAS3Q,GACvBA,MAA2B,KAAXA,EAAyBA,EAAS,EAClD9G,KAAKyX,QAAUA,EACfzX,KAAK8G,OAASA,EACd9G,KAAK+c,YACL/c,KAAKmI,SAAWsP,EAAQ7Q,UAAY5G,KAAK8G,OACzC9G,KAAKgd,YAENC,YAAa,WACZ,MAAOjd,MAAKmI,SAAW5H,OAAO2c,SAE/BF,SAAU,SAASjY,GACd/E,KAAKid,cACRjd,KAAKmd,WAELnd,KAAKod,aAGPD,SAAU,WACTnd,KAAKyX,QAAQjW,UAAUY,IA5BF,aA8BtBgb,UAAW,WACVpd,KAAKyX,QAAQjW,UAAUO,OA/BF,gBA8DxBtB,QAAOC,QAAUic;;;;;AChEjB,QAASU,mBAAoB1d,GAC5B,GAAIiB,GAAIZ,IAMR,IALCY,EAAEjB,GAAKA,EACPiB,EAAE0c,WAAa3d,EAAGoB,cAAc,0BACjCH,EAAE2c,cAAgB5d,EAAGoB,cAAc,8BACnCH,EAAE4c,eAAiB7d,EAAGoB,cAAc,iCACpCH,EAAEiY,KAAOjZ,EAAED,GAAIE,KAAK,8BAChBe,EAAE0c,YAAc1c,EAAE0c,WAAWjY,kBAAoB,EAAI,CACxD,GAAID,GAAS,GAAIE,UAAU1E,EAAE0c,YAC5B/X,UAAW,SACXiM,YAAY,EACZhM,SAAS,EACTC,gBAAgB,EAChBgY,cAAc,EACd/X,iBAAiB,EACjBC,UAAU,GAEX/F,GAAEgB,EAAE4c,gBAAgBnE,MAAM,WACzBjU,EAAO6H,SAER7H,EAAOtF,GAAG,SAAU,SAASyZ,GAC5B3Y,EAAEiY,KAAKhU,YAAY,eACnBjE,EAAE2Y,MAAQnU,EAAO3B,cACjB7C,EAAEiY,KAAK7B,KAAK,WACPpX,EAAEI,MAAMM,KAAK,eAAiBM,EAAE2Y,OACnC3Z,EAAEI,MAAM4E,SAAS,mBAMrB,GAAIhE,EAAE2c,eAAiB3c,EAAE2c,cAAclY,kBAAoB,EAAI,CAC9C,GAAIC,UAAU1E,EAAE2c,eAC/BhY,UAAW,SACXiM,YAAY,EACZhM,SAAS,EACTC,gBAAgB,EAChBiY,SAAU9c,EAAE0c,WACZK,WAAW,EACXjY,iBAAiB,EACjBC,UAAU,GAEX/E,GAAEiY,KAAK7B,KAAK,WACXpX,EAAEI,MAAMF,GAAG,QAAS,SAAU8B,GAC7BA,EAAEsD,iBACFtE,EAAEiY,KAAKhU,YAAY,eACnBjF,EAAEI,MAAM4E,SAAS,cACjB,IAAI2U,GAAQ3Z,EAAEI,MAAMM,KAAK,aACzB8E,GAAOsX,OAAOnD,QAlDlB,GAAIjU,UAAWxB,QAAQ,uBACnBlE,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAuD/GC,QAAOC,QAAU2c;;;;ACxDjB,QAASO,eAAgBje,GACvBK,KAAKL,GAAKA,EAGZc,OAAOC,QAAUkd;;;ACHjB,QAASC,eAAgBle,GACxB,GAAIiB,GAAIZ,IACPY,GAAEkd,SAAWne,EAAGoB,cAAc,6BAE3BH,EAAEkd,UACLld,EAAEkd,SAAS3c,iBAAiB,QAAS,SAAUS,GAC9CA,EAAEsD,gBACF,IAAI6Y,GAAene,EAAED,GAAIsN,KAAK,UAC9B,IAAI8Q,EAAc,CACjB,GAAIjX,GAASiX,EAAajX,SAAS8Q,IAAMC,WAAWjY,EAAED,GAAImY,IAAI,eAAiBlY,EAAE,WAAWiP,SAAWgJ,WAAWjY,EAAE,WAAWkY,IAAI,cACnIlY,GAAE,cAAcmY,SACfC,UAAWlR,GACT,QAbP,GAAIlH,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAmB/GC,QAAOC,QAAUmd;;;;;AClBjB,QAASG,gBAAiBre,GACzB,GAAIiB,GAAIZ,IACPY,GAAEjB,GAAKA,EACRiB,EAAEqd,aAAete,EAAGoB,cAAc,oBAClCH,EAAEsd,OAASve,EAAGoB,cAAc,mBAC5BH,EAAEud,aAAexe,EAAGoB,cAAc,yBAClCH,EAAEwd,cAAgBze,EAAGoB,cAAc,2BAE/BH,EAAEqd,cACLrd,EAAEqd,aAAa9c,iBAAiB,QAAS,WACxCP,EAAEyd,cAIAzd,EAAEud,cACLvd,EAAEud,aAAahd,iBAAiB,QAAS,WACxCP,EAAE2F,eAIA3F,EAAEwd,eACLxd,EAAEwd,cAAcjd,iBAAiB,QAAS,WACzCP,EAAE2F,eAvBL,GAAI3G,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IA4B/Gwd,gBAAe9Z,UAAUma,UAAY,WAEpCze,EADQI,KACHke,QAAStZ,SAAS,wBAGxBoZ,eAAe9Z,UAAUqC,WAAa,WAErC3G,EADQI,KACHke,QAASrZ,YAAY,wBAG3BpE,OAAOC,QAAUsd;;;;;ACpCjB,QAASM,gBAAiB3e,GACzB,GAAIiB,GAAIZ,IACRY,GAAEjB,GAAKA,EACPiB,EAAE2d,WAAa5e,EAAGoB,cAAc,2BAChCH,EAAE4d,mBAAqBva,MAAMC,UAAUC,MAAMC,KAAKzE,EAAGuB,iBAAiB,sCACtEN,EAAE6d,aAAe7e,EAAE,8BACnBgB,EAAE8d,gBAAkB/e,EAAGoB,cAAc,mCACrCH,EAAE+d,gBAAkBhf,EAAGoB,cAAc,mCACrCH,EAAEge,oBAAsB,+BAEpBhe,EAAE4d,mBAAmB/V,QACxB7H,EAAE4d,mBAAmBxW,IAAI,SAAU4R,GAClC,GAAIA,GAAQA,EAAKvU,kBAAoB,EACpC,CAAa,GAAIC,UAASsU,GACzBrU,UAAW,SACXiM,YAAY,EACZhM,SAAS,EACTC,gBAAgB,EAChBgY,cAAc,EACd/X,iBAAiB,EACjBC,UAAU,MAMd,IAAIuD,GAAQtI,EAAE2d,WAAWlZ,iBACzB,IAAIzE,EAAE2d,YAAc3d,EAAE2d,WAAWlZ,kBAAoB,EAAI,CACxD,GAAIwZ,GAAY,GAAIvZ,UAAU1E,EAAE2d,YAC/BhZ,UAAW,SACXiM,YAAY,EACZhM,SAAS,EACTC,gBAAgB,EAChBkY,WAAW,EACXjY,iBAAiB,EACjBC,UAAU,GAGXkZ,GAAU/e,GAAG,SAAU,SAASyZ,GAC/B,GAAIuF,GAAkC,yCAA2CvF,CACjF3Z,GAAE,mCAAmCiF,YAAYjE,EAAEge,qBACnDhf,EAAEkf,GAAiCla,SAAShE,EAAEge,qBAClCtZ,SAASgO,KAAM1T,EAAEkf,GAAiCjf,KAAK,qCAAqC,IAClG2Y,SAEQ,IAAVe,GACH3Y,EAAE6d,aAAa5Z,YAAY,YAC3BjF,EAAEgB,EAAE8d,iBAAiB9Z,SAAS,aACpB2U,IAAUrQ,EAAM,GAC1BtI,EAAE6d,aAAa5Z,YAAY,YAC3BjF,EAAEgB,EAAE+d,iBAAiB/Z,SAAS,aAE9BhE,EAAE6d,aAAa5Z,YAAY,cAI7BjF,EAAEgB,EAAE8d,iBAAiBrF,MAAM,WAC1BwF,EAAUE,aAGXnf,EAAEgB,EAAE+d,iBAAiBtF,MAAM,WAC1BwF,EAAU5R,UA/Db,GAAI3H,UAAWxB,QAAQ,uBACnBlE,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAmE/GC,QAAOC,QAAU4d;;;;ACzEjB,QAASU,YAAWrf,GAClB,GAGIsf,IAAa,EACbC,EAAkB,KAElBC,EAAmBC,aAAaC,QAAQ,cAExCF,IACFxf,EAAG6B,UAAUY,IATI,uBAanBE,WAAW,WACV2c,EAAkC,OAArBE,EACbD,EAAkB,GAAIhV,OACpB,IAEH,IAAIoV,GAAkB,WACrB,IAAKL,EAAc,OAAO,CACzBtf,GAAG6B,UAAUY,IApBI,uBAqBjBgd,aAAaG,QAAQ,eAAe,EACpC,IAAIC,GAAM,GAAItV,MACVuV,GAAeD,EAAMN,GAAmB,GACxCD,IAAcQ,IACjBlf,OAAOmf,UAAYnf,OAAOmf,cAC1Bnf,OAAOmf,UAAUxP,MAAMyP,yBAA4BF,MAIlDG,EAAkBve,SAASN,cA7BF,0BA+BzB6e,IACFA,EAAgBze,iBAAiB,QAAS,WACxCme,KAIJ,IAAIO,GAAmBxe,SAASN,cApCE,wBAqC9B8e,IACFA,EAAiB1e,iBAAiB,QAAS,WACzCme,MAMN7e,OAAOC,QAAUse;;AChDjBve,OAAOC,QAAU,SAASf,GACzB,GAAIsR,SAAS2F,KAAM,CAClB,GAAIkJ,GAAQ7O,SAAS2F,KAAK1K,QAAQ,IAAK,GACvC,OAAOtM,GAAE6a,MACR3X,KAAM,MACNsO,IAAK,yBAA2B0O,EAChChF,QAAS,SAAUiF,GACdA,GAAOA,EAAIC,SACdpgB,EAAE,QAAQgF,SAAS,YACnBhF,EAAE,aAAa8E,KAAKob,GAChBC,EAAIC,OAAOC,YACdrgB,EAAE,kBAAkB8E,KAAKqb,EAAIC,OAAOC,YAEjCF,EAAIC,OAAOE,WACdtgB,EAAE,iBAAiB8E,KAAKqb,EAAIC,OAAOE,WAEhCH,EAAIC,OAAOG,WACdvgB,EAAE,YAAY8E,KAAKqb,EAAIC,OAAOG,aAIjCjF,MAAO,SAASkF,GACf,IACC,GAAIL,GAAMM,KAAKrU,MAAMoU,EAAIE,cACxBC,EAAc3gB,EAAE,mBAChBmb,EAAOwF,EAAYxF,OAAO7O,QAAQ,KAAM6T,EAAIS,QAE7CD,GAAYxF,KAAKA,GAAMnW,SAAS,aAC/B,MAAOhD,MAIV8Y,SAAU,OACV+F,OAAO;;AC9BV,QAASC,SAAQ/gB,GACf,GACCyD,GADGxC,EAAIZ,IAGRY,GAAEjB,GAAKA,EACPiB,EAAEgK,UAAYyV,KAAKrU,MAAOpL,EAAEjB,GAAGwG,aAAa,eAC5CvF,EAAE+f,SAAWN,KAAKrU,MAAOpL,EAAEjB,GAAGwG,aAAa,cAC3CvF,EAAEggB,aAAehgB,EAAEjB,GAAGwG,aAAa,kBACpCvF,EAAEigB,MAAQxf,SAASN,cAAc,sBACjCH,EAAE2M,aAAc,EAChB3M,EAAEkgB,aAAe,GAEZlgB,EAAEggB,aAGNhgB,EAAEggB,aAAehgB,EAAEggB,aAFnBhgB,EAAEggB,aAAe,GAKdhgB,EAAE+f,UACL/f,EAAEmgB,kBAIH,IAAIC,GAAY/c,MAAMC,UAAUC,MAAMC,KAAMzE,EAAGuB,iBAAiB,qBAC5D8f,IACHA,EAAUxe,QAAS,SAASye,GAC3B7d,EAAkB,GAAIC,aAAa4d,GAC/BA,EAASzf,UAAUM,SAAS,mBAC/BlB,EAAEsgB,oBAAsB9d,KAKvBxC,EAAEigB,QACLjgB,EAAEugB,mBACFvgB,EAAEigB,MAAM1f,iBAAiB,SAAUnB,KAAKmhB,iBAAiBtd,KAAK7D,OAE9DY,EAAEwgB,WAAa,GAAIvX,YAAWjJ,EAAEigB,OAC9B9U,SAAYnL,EAAEgK,UAAYhK,EAAEgK,gBAzChC,GAAIf,YAAa/F,QAAQ,uBACrBT,YAAcS,QAAQ,uBA6C1B4c,SAAQxc,UAAUid,iBAAmB,WACpC,GAAIvgB,GAAIZ,KACJyJ,EAAO,GAAIS,MAAKtJ,EAAEigB,MAAMld,MACvB8F,IACJ7I,EAAEygB,gBAAiB5X,EAAKgB,WAI1BiW,QAAQxc,UAAU6c,iBAAmB,WAEpC,IAAK,GADDngB,GAAIZ,KACCwS,EAAI,EAAGA,EAAI5R,EAAE+f,SAASlY,OAAQ+J,IAAM,CAC5C,GAAI8O,GAAO1gB,EAAE+f,SAASnO,GAAG8O,IACzB,IAAIA,GAAQA,EAAKpb,OAASob,EAAKlb,IAAM,CACpC,GAAImb,GAAY3gB,EAAE4gB,YAAaF,EAAKpb,OACnCub,EAAU7gB,EAAE4gB,YAAaF,EAAKlb,KAC9Bsb,EAAY7J,WAAWjX,EAAEggB,cAAgBhgB,EAAEkgB,aAExCa,EAAY/gB,EAAEghB,aAAaL,EAAWE,EAASC,EACnD9gB,GAAE+f,SAASnO,GAAGqP,MAAQF,KAKzBjB,QAAQxc,UAAUsd,YAAc,SAASM,GACxC,GAAIlhB,GAAIZ,KACN+hB,EAAMD,EAAO3Y,MAAM,IAGrB,OAFSgB,UAAS4X,EAAI,IAAMnhB,EAAEkgB,aACnB3W,SAAS4X,EAAI,KAIzBrB,QAAQxc,UAAU8d,UAAY,SAASC,GACtC,GAAIC,GAAOpT,KAAKqT,MAAMF,EAAS,IAC7Bnb,EAAS,KACTsb,EAASH,EAAS,EAkBpB,OAhBIC,GAAO,IAAO,GACjBpb,EAASob,EAAO,IAAO,EAAI,KAAO,KAClCA,EAAO,IACGA,EAAO,KACjBA,GAAc,GACdpb,EAAS,MAGNob,EAAO,KACVA,EAAO,IAAMA,GAGVE,EAAS,KACZA,EAAS,IAAMA,GAGTF,EAAO,IAAME,EAAStb,GAG9B4Z,QAAQxc,UAAU0d,aAAe,SAAS1b,EAAOE,EAAKic,GAGrD,IAFA,GAAIzhB,GAAIZ,KACNsiB,KACKpc,GAASE,GACfkc,EAAMpS,KAAMtP,EAAEohB,UAAU9b,IACxBA,GAASmc,CAEV,OAAOC,IAGR5B,QAAQxc,UAAUqe,qBAAuB,SAASC,GAEjD,IAAK,GADD5hB,GAAIZ,KACCwS,EAAI,EAAGA,EAAI5R,EAAE+f,SAASlY,OAAQ+J,IACtC,GAAIgQ,IAAa5hB,EAAE+f,SAASnO,GAAGzB,IAC9B,MAAOnQ,GAAE+f,SAASnO,GAAGqP,OAKxBnB,QAAQxc,UAAUue,4BAA8B,SAASV,GAExD,IAAK,GADDjhB,GAAO,GACF0R,EAAI,EAAGA,EAAIuP,EAAItZ,OAAQ+J,IAC/B1R,GAAQ,uDAAyDihB,EAAIvP,GAAK,KAAOuP,EAAIvP,GAAK,OAE3F,OAAO1R,IAGR4f,QAAQxc,UAAUwe,0BAA4B,SAASX,GAEtD,IAAK,GADDnU,GAAU,GACL4E,EAAI,EAAGA,EAAIuP,EAAItZ,OAAQ+J,IAC/B5E,GAAW,+CAAiDmU,EAAIvP,GAAK,KAAOuP,EAAIvP,GAAK,WAEtF,OAAO5E,IAGR8S,QAAQxc,UAAUmd,gBAAkB,SAASmB,GAC5C,GAAI5hB,GAAIZ,KACP2hB,EAAY/gB,EAAE2hB,qBAAsBC,GACpCG,EAAc/hB,EAAE6hB,4BAA4Bd,GAC5CiB,EAAahiB,EAAE8hB,0BAA0Bf,GACzCkB,EAAYjiB,EAAEjB,GAAGoB,cAAc,iBAE5B8hB,IAAalB,IAEhBkB,EAAU9hB,cAAc,wBAAwByC,UAAYmf,EAC5DE,EAAU9hB,cAAc,uBAAuByC,UAAYof,EAE3DhiB,EAAEsgB,oBAAoB4B,oBAIxBriB,OAAOC,QAAUggB;;ACxJjB,QAASqC,oBAAmBpjB,GAG3BC,EAAE,QAAQE,GAAG,gBAAiB,SAAU8B,EAAG0R,GADf,aAEvBA,EAAK3P,OAAmC2P,EAAKpK,MAAQ,EACxDtJ,EAAED,GAAIkF,YAJY,gCAMlBjF,EAAED,GAAIiF,SANY,kCAUrBnE,OAAOC,QAAUqiB;;ACRjB,QAASC,iBAAgBrjB,GACxB,GAAIiB,GAAIZ,IACRY,GAAEjB,GAAKA,EACPiB,EAAEqiB,UAAYriB,EAAEjB,GAAGoB,cAAc,YACjCH,EAAEsiB,WAAa,KAETtiB,EAAEqiB,YAGRriB,EAAEiiB,UAAYjiB,EAAEjB,GAAGoB,cAAc,YAE3BH,EAAEiiB,YAIRjiB,EAAEuiB,gBAAkBviB,EAAEiiB,UAAU9hB,cAAc,uBAC9CH,EAAEwiB,cAAgBxiB,EAAEiiB,UAAU9hB,cAAc,uBAAuB6R,KAEnEhS,EAAEyiB,oBAEFziB,EAAEqiB,UAAU9hB,iBAAiB,SAAUP,EAAEyiB,kBAAkBxf,KAAKjD,MAvBjE,GAAIyC,aAAcS,QAAQ,wBACtBkH,eAAiBlH,QAAQ,mBAyB7Bkf,iBAAgB9e,UAAUmf,kBAAoB,WAC7C,GAAIziB,GAAIZ,KACJyJ,EAAO7I,EAAEqiB,UAAUtf,KAEvB/D,GAAE6a,MACD3X,KAAM,MACNsO,IAAK,yBAA2B3H,EAChCqR,QAAS,SAASxH,GAGjB,GAFA1S,EAAEiiB,UAAUrf,UAAY,GAEpB8P,EAAM,CACT,GAAIxS,KACJwiB,QAAOC,KAAKjQ,EAAKkQ,OAAOxb,IAAI,SAASsZ,GACpC,GAAImC,GAAOnQ,EAAKkQ,MAAMlC,EACtBxgB,GAAKoP,MACJvM,MAAO2d,EACP5c,KAAM+e,MAGR7iB,EAAE8iB,kBAAmB5iB,EAAMwS,EAAKxG,YAGlC4N,SAAU,UAIZsI,gBAAgB9e,UAAUyf,oBAAsB,WAC/C,GAAI/iB,GAAIZ,KACJ4jB,EAASviB,SAAS0X,cAAc,MACpC6K,GAAO1K,UAAY,eACnB0K,EAAOpgB,UAAY,6QACnB5C,EAAEiiB,UAAUzJ,YAAYwK,IAGzBZ,gBAAgB9e,UAAUwf,kBAAoB,SAAU3B,EAAKjV,GAC5D,GAAIlM,GAAIZ,IAERY,GAAE+iB,sBACF/iB,EAAEijB,qBAAsB9B,EAAKnhB,EAAEiiB,UAAU9hB,cAAc,0BACvDH,EAAEkjB,sBAAuB/B,EAAKnhB,EAAEiiB,UAAU9hB,cAAc,0BAExD,IAAIiC,GAAgBpC,EAAEiiB,UAAU9hB,cAAc,gBAE1CH,GAAEsiB,YACLtiB,EAAEsiB,WAAWa,UAGdnjB,EAAEsiB,WAAa,GAAI7f,aAAYL,GAC3B8J,IACHlM,EAAEsiB,WAAWc,YAAYrgB,MAAQmJ,GAG9BiV,EAAItZ,QACP7H,EAAEsiB,WAAWJ,mBAIfE,gBAAgB9e,UAAU4f,sBAAwB,SAAU/B,EAAKlgB,GAChE,GACIf,GAAOO,SAAS0X,cAAc,KAClCjY,GAAKoY,UAAY,mDACjBpY,EAAKuP,aAAa,qBAAsB,IACxC0R,EAAI/Z,IAAK,SAAUiI,GAClB,GAAIgU,GAAM5iB,SAAS0X,cAAc,KACjCkL,GAAI5T,aAAa,aAAcJ,EAAKtM,OACpCsgB,EAAIC,YAAcjU,EAAKvL,KACvBuf,EAAI/K,UAAY,8BAChBpY,EAAKsY,YAAY6K,KAElBpiB,EAAOuX,YAAYtY,IAGpBkiB,gBAAgB9e,UAAU2f,qBAAuB,SAAU9B,EAAKlgB,GAC/D,GAAIjB,GAAIZ,KACJ0c,EAASrb,SAAS0X,cAAc,SACpC2D,GAAOxD,UAAY,4CACnBwD,EAAOrM,aAAa,oBAAqB,IACzCqM,EAAO9J,KAAOhS,EAAEwiB,cAChB1G,EAAOyH,UAAW,EAClBpC,EAAI/Z,IAAK,SAAUiI,GAClB,GAAIgU,GAAM5iB,SAAS0X,cAAc,SACjCkL,GAAItgB,MAAQsM,EAAKtM,MACjBsgB,EAAIC,YAAcjU,EAAKvL,KACvBgY,EAAOtD,YAAY6K,KAGpBpiB,EAAOuX,YAAasD,IAGrBjc,OAAOC,QAAUsiB;;ACnHjB,QAASoB,MAAKzkB,GACb,GAAIiB,GAAIZ,IACRY,GAAEjB,GAAKA,EACPiB,EAAEyjB,KAAOhjB,SAASgjB,KAClBzjB,EAAE0jB,QAAU3kB,EAAGoB,cAAc,oBAC7BH,EAAE2jB,aAAeljB,SAASN,cAAc,iBACxCH,EAAE4jB,QAAUnjB,SAASN,cAAc,oBAE/BH,EAAE2jB,cACL3jB,EAAE2jB,aAAapjB,iBAAiB,QAAS,WACxCP,EAAEyjB,KAAK7iB,UAAUY,IAAI,oBAIvBxB,EAAE4jB,QAAQrjB,iBAAiB,QAAS,WACnCP,EAAEyjB,KAAK7iB,UAAUO,OAAO,oBAI1BtB,OAAOC,QAAU0jB;;;AChBjB,QAASK,YAAW9kB,GAClB,GAAIiB,GAAIZ,IAERY,GAAE8B,IAAM9C,EAAED,GACViB,EAAEgV,UAAYhW,EAAEyB,UAChBT,EAAEkV,MAAQlW,EAAE,QACZgB,EAAE8jB,WAAa9jB,EAAE8B,IAAI7C,KAAK,sBAC1Be,EAAE+jB,OAAS/jB,EAAE8B,IAAI7C,KAAK,yBAGtBe,EAAEkV,MAAMhW,GAAG,eAAgB,WACzBc,EAAE+jB,OAAOpY,UAIX3L,EAAE8jB,WAAW5kB,GAAG,QAAS,WACvBc,EAAE+K,UAGJ/K,EAAEgV,UAAU9V,GAAG,QAAS,SAAS8B,GAGnB,MAFFA,EAAE6K,OAAS7K,EAAE8K,UAGjB9L,EAAEmJ,WACJnJ,EAAE+K,QACF/J,EAAE+K,sBAKY/M,EAAE,sBAEH6I,QAAU7I,EAAE,mBAAmB,IAClDA,EAAE,mBAAmB,GAAG2M,QApC1B,GAAI3M,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GmG,SAAW7C,QAAQ,kBAuCvB2gB,YAAWvgB,UAAU6F,OAAS,WAC5B,MAAO/J,MAAK8V,MAAMzV,SAAS,qBAG7BokB,WAAWvgB,UAAU0I,KAAO,WAC1B5M,KAAK8V,MAAMlR,SAAS,oBAAoBqE,QAAQ,iBAGlDwb,WAAWvgB,UAAUyH,MAAQ,WAC3B3L,KAAK8V,MAAMjR,YAAY,oBAAoBoE,QAAQ,mBAGrDxI,OAAOC,QAAU+jB;;;;;AClDjB,QAASG,eAAcjlB,GACnB,GAAI+C,GAAM9C,EAAED,GAERklB,EAAeniB,EAAI7C,KAAK,4BACxBilB,EAAcpiB,EAAI7C,KAAK,2BACvBklB,EAAmBriB,EAAI7C,KAAK,oBAC5BmlB,EAAetiB,EAAI7C,KAAK,qBAExBolB,EAAeH,EAAYjlB,KAAK,qBAChCqlB,EAAsBJ,EAAYjlB,KAAK,mCACvCslB,EAAaL,EAAYjlB,KAAK,gBAC9BulB,EAAiBxlB,EAAE,oBAEnBwlB,GAAe3c,QAAU2c,EAAe,IACxCA,EAAe,GAAG7Y,QAGlBuY,GACAD,EAAarP,OAGbuP,EAAiBtc,OAAS,IAC1Bwc,EAAazP,OACbwP,EAAaxP,OACb0P,EAAoB1P,OACpB2P,EAAW3P,OACXqP,EAAaQ,QA5BrB,GAAIzlB,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAgC/GC,QAAOC,QAAUkkB;;;;;AC7BjB,QAASvhB,aAAY1D,GACpB,GAAIiB,GAAIZ,IACRY,GAAEjB,GAAKA,EACPiB,EAAE8B,IAAM9C,EAAED,GACViB,EAAEojB,YAAcpjB,EAAEjB,GAAGoB,cAAc,uBACnCH,EAAE0kB,aAAe1kB,EAAEjB,GAAGoB,cAAc,wBACpCH,EAAE2kB,aAAe3kB,EAAEjB,GAAGoB,cAAc,wBACpCH,EAAE4kB,WAAa5kB,EAAEjB,GAAGwG,aAAa,8BAEjCvF,EAAE6kB,cAAgB,WACjB,IAAK7kB,EAAE8kB,WAAY,CAClB,GAAIpS,GAAO1S,EAAEojB,YAAYrgB,MACrBgiB,EAAa/lB,EAAEgB,EAAE0kB,cAAczlB,KAAK,gBAAkByT,EAAO,KACjE1T,GAAEgB,EAAE0kB,cAAczlB,KAAK,gCAAgCgF,YAAY,UAAU6U,WAAW,MACxFiM,EAAW/gB,SAAS,UAAUtE,KAAK,KAAM,mBAG1CM,EAAEjB,GAAG6B,UAAUR,OAAO,yBAGvBJ,EAAEglB,gBAAkB,SAAUhkB,GAC7B,GAAkB,KAAdA,EAAE8K,UAAmB9K,EAAE8K,QAAS,CACnC,GAAI4G,GAAOtT,KAAKmG,aAAa,aAC7BvF,GAAEilB,qBACF7lB,KAAKwB,UAAUY,IAAI,UACnBpC,KAAKqQ,aAAa,KAAK,mBACvBzP,EAAE2kB,aAAa/hB,UAAYxD,KAAKwD,UAChC5C,EAAEojB,YAAYrgB,MAAQ2P,EAClB1S,EAAEklB,UACLllB,EAAEklB,SAASllB,EAAEojB,YAAYrgB,OAE1B/C,EAAEjB,GAAG6B,UAAUO,OAAO,0BAIxBnB,EAAEmlB,eAAiB,WAClB,GAAIzS,GAAOtT,KAAK2D,MACfqiB,EAAcplB,EAAEojB,YAAYjjB,cAAc,WAAauS,EAAO,KAC/D1S,GAAE2kB,aAAa/hB,UAAYwiB,EAAYxiB,UACvC5C,EAAEilB,qBACFjlB,EAAE0kB,aAAavkB,cAAc,gBAAkBuS,EAAO,MAAM9R,UAAUY,IAAI,UACtExB,EAAEklB,UACLllB,EAAEklB,SAASllB,EAAEojB,YAAYrgB,OAGtB/C,EAAE4kB,aACLvU,SAASC,KAAOoC,IAIlB1S,EAAEqlB,eAAiB,SAAUrkB,KACvBA,EAAEC,OAAOqkB,aAAa,uBAAyBtkB,EAAEC,QAAUjB,EAAEojB,aAAepiB,EAAEC,QAAUjB,EAAE2kB,cAAgB3jB,EAAEC,QAAUjB,EAAEojB,cAC5HpjB,EAAEjB,GAAG6B,UAAUO,OAAO,yBAIxBnB,EAAEiP,iBAAmB,SAAUjO,GAC9B,GACC+jB,GAAYQ,EAAaC,EAAWC,EAAWC,EAAW/M,EAAOnX,EAD9DoK,EAAM5K,EAAE6K,OAAS7K,EAAE8K,OAGvB,QAAQF,GACP,IAAM,IACA5L,EAAE8kB,YAGNC,EAAa/kB,EAAE0kB,aAAavkB,cAAc,uCAC1CH,EAAEglB,gBAAgBW,MAAMZ,IAHxB/kB,EAAE6kB,gBAMH7jB,EAAEsD,gBAEF,MACD,KAAK,IACAtE,EAAE8kB,aACL9kB,EAAE6kB,gBACF7jB,EAAEsD,iBAGH,MACD,KAAK,IACCtE,EAAE8kB,YAGNS,EAAcvlB,EAAE8B,IAAI7C,KAAK,uCACzBumB,EAAYD,EAAYK,OAEpBJ,EAAU3d,SACb0d,EAAYthB,YAAY,UAAU6U,WAAW,MAC7C0M,EAAUxhB,SAAS,UAAUtE,KAAK,KAAM,mBAEvCgmB,EAAY1lB,EAAE8B,IAAI7C,KAAK,2BACxB0Z,EAAQ3Y,EAAE8B,IAAI7C,KAAK,gCAAgC0Z,MAAM6M,GACzDhkB,GAAOgkB,EAAUK,aAAY,GAAQL,EAAUK,eAAiB,EAAIlN,EAEhE+M,EAAUtO,YAAcoO,EAAUje,WAAWyP,IAAMxV,GACtDkkB,EAAUtO,UAAUoO,EAAUje,WAAWyP,IAAMxV,KAdjDxB,EAAE6kB,gBAmBH7jB,EAAEsD,gBACF,MACD,KAAK,IACCtE,EAAE8kB,YAGNS,EAAcvlB,EAAE8B,IAAI7C,KAAK,uCACzBwmB,EAAYF,EAAYlZ,OAEpBoZ,EAAU5d,SACb0d,EAAYthB,YAAY,UAAU6U,WAAW,MAC7C2M,EAAUzhB,SAAS,UAAUtE,KAAK,KAAM,mBAExCgmB,EAAY1lB,EAAE8B,IAAI7C,KAAK,2BACvB0Z,EAAQ3Y,EAAE8B,IAAI7C,KAAK,gCAAgC0Z,MAAM8M,GACzDjkB,GAAOikB,EAAUI,aAAY,GAAQJ,EAAUI,eAAiBlN,EAE5D+M,EAAUzX,SAAWwX,EAAUle,WAAWyP,IAAMyO,EAAUI,aAAY,GAAQrkB,GACjFkkB,EAAUtO,UAAUqO,EAAUle,WAAWyP,IAAMyO,EAAUI,aAAY,GAAQrkB,EAAMkkB,EAAUG,aAAY,MAd3G7lB,EAAE6kB,gBAmBH7jB,EAAEsD,gBACF,MACD,KAAK,IACAtE,EAAE8kB,aACLC,EAAa/kB,EAAE0kB,aAAavkB,cAAc,uCAC1CH,EAAEglB,gBAAgBW,MAAMZ,GACxB/jB,EAAEsD,oBAOFtE,EAAEojB,aAAepjB,EAAE0kB,cAAgB1kB,EAAE2kB,eACxC3kB,EAAE8lB,cAAgBziB,MAAMC,UAAUC,MAAMC,KAAKxD,EAAE0kB,aAAapkB,iBAAiB,OAE5C,KAA7BN,EAAE2kB,aAAa/hB,WAClB5C,EAAEkiB,kBAIHliB,EAAE+lB,cAGF/lB,EAAEyQ,eAGFzQ,EAAEgmB,gBAGFhmB,EAAEimB,eAGFjmB,EAAEkmB,sBA/JJ,GAAIlnB,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GwK,eAAiBlH,QAAQ,mBAkK7BT,aAAYa,UAAU6iB,QAAU,WAC/B,MAAO/mB,MAAKgkB,YAAYpR,MAGzBvP,YAAYa,UAAU4e,gBAAkB,WACvC,GAAIliB,GAAIZ,KACPgnB,EAAepmB,EAAE0kB,aAAavkB,cAAc,iBAEzCH,GAAEojB,YAAYrgB,MACjBqjB,EAAepmB,EAAE0kB,aAAavkB,cAAc,kBAAoBH,EAAEojB,YAAYrgB,MAAQ,MAC5EqjB,IACVpmB,EAAEojB,YAAYrgB,MAAQqjB,EAAa7gB,aAAa,eAG7C6gB,IACHpmB,EAAE2kB,aAAa/hB,UAAYwjB,EAAaxjB,YAI1CH,YAAYa,UAAUyiB,YAAc,WACnC,GAAI/lB,GAAIZ,IACRY,GAAE2kB,aAAapkB,iBAAiB,QAASP,EAAE6kB,gBAG5CpiB,YAAYa,UAAU0iB,cAAgB,WACrC,GAAIhmB,GAAIZ,IACRY,GAAE8B,IAAI5C,GAAG,gBAAiB,+BAAgCc,EAAEglB,kBAG7DviB,YAAYa,UAAU2iB,aAAe,WACpC,GAAIjmB,GAAIZ,IACRY,GAAEojB,YAAY7iB,iBAAiB,SAAUP,EAAEmlB,iBAG5C1iB,YAAYa,UAAU2hB,mBAAqB,WAClC7lB,KACN0mB,cAAclkB,QAAQ,SAAUykB,GACjCA,EAAUzlB,UAAUO,OAAO,UAC3BklB,EAAU9N,gBAAgB,SAI5B9V,YAAYa,UAAUmN,aAAe,WACpC,GAAIzQ,GAAIZ,IACRqB,UAASF,iBAAiB,QAASP,EAAEqlB,iBAGtC5iB,YAAYa,UAAUN,SAAW,SAASkiB,GACzC9lB,KAAK8lB,SAAWA,GAGjBziB,YAAYa,UAAUwhB,SAAW,WAChC,MAAO1lB,MAAK0C,IAAIrC,SAAS,yBAG1BgD,YAAYa,UAAU4iB,mBAAqB,WAC1C9mB,KAAKulB,aAAapkB,iBAAiB,UAAWnB,KAAK6P,mBAGpDxM,YAAYa,UAAU6f,QAAU,WAC/B,GAAInjB,GAAIZ,IACRY,GAAE2kB,aAAa2B,oBAAoB,QAAStmB,EAAE6kB,eAC9C7kB,EAAE8B,IAAIykB,IAAI,QAAS,+BAAgCvmB,EAAEglB,iBACrDhlB,EAAEojB,YAAYkD,oBAAoB,SAAUtmB,EAAEmlB,gBAC9C1kB,SAAS6lB,oBAAoB,QAAStmB,EAAEqlB,gBAExCrlB,EAAEjB,GAAK,KACPiB,EAAE8B,IAAM,KACR9B,EAAEojB,YAAc,KAChBpjB,EAAE0kB,aAAe,KACjB1kB,EAAE2kB,aAAe,KACjB3kB,EAAEklB,SAAW,KACbllB,EAAE8lB,cAAgB,MAGnBjmB,OAAOC,QAAU2C;;;;AC9OjB,QAAS+jB,SAAQznB,GACf,GAAIsR,GAAW1Q,OAAO0Q,SAASC,IAI/B,IAAY,YAHF,GAAImW,KAAIpW,GACJqW,aAAaC,IAAI,OAER,CACrB,GAAIC,GAAOnmB,SAASN,cAAc,sBAE9BymB,IACFA,EAAK7P,kBAKXlX,OAAOC,QAAU0mB;;;ACZjB,QAASK,WAAW9nB,GACnB,GAAI+nB,GAAS9nB,EAAE,sBACX+nB,EAAQ/nB,EAAE,0BACVgoB,EAAajoB,EAAGoB,cAAc,uBAC9B8mB,EAAiBloB,EAAGoB,cAAc,4BAClC+mB,EAAgBnoB,EAAGoB,cAAc,2BACjCgnB,EAAepoB,EAAGqoB,QAAQD,YAE9BL,GAAO5nB,GAAG,SAAU,SAAU8B,GAC7BA,EAAEsD,kBAEE0iB,EAAWK,SAASC,cAAgBN,EAAWK,SAASE,eAC3DP,EAAWQ,kBAGRP,EAAeI,SAASC,cAAgBL,EAAeI,SAASE,eACnEN,EAAeO,kBAGZN,EAAcG,SAASC,cAAgBJ,EAAcG,SAASE,eACjEL,EAAcM,iBAGfT,EAAM9iB,YAAY,YAClB8iB,EAAM9iB,YAAY,aAElB,IAAI8V,GAAU+M,EAAOpnB,KAAK,SAE1B,IAAIsnB,EA2BH,MA1BAhoB,GAAE6a,MACD3X,KAAM,OACNulB,SAAUC,eAAgB,qCAC1BC,YAAa,mDACb7N,SAAU,OACVtJ,IAAKuJ,EACLrH,KAAMoU,EAAOc,YACb1N,QAAS,SAAUiF,GACF,MAAZA,EAAI0I,MAA4B,MAAZ1I,EAAI0I,MAA4B,MAAZ1I,EAAI0I,OAC/Cd,EAAM/iB,SAAS,YACf+iB,EAAM5M,KAAKgF,EAAIS,UAGZT,EAAIjF,QACHiN,EACH9W,SAASC,KAAO6W,GAEhBJ,EAAM/iB,SAAS,cACf+iB,EAAM5M,KAAK,wBAGZ4M,EAAM/iB,SAAS,YACf+iB,EAAM5M,KAAKgF,EAAIS,cAIX,IAzDV,GAAI5gB,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IA8D/GC,QAAOC,QAAU+mB;;;;;AC3DjB,QAASiB,OAAM/oB,GACd,GAAI+C,GAAM9C,EAAED,GACRgpB,EAASjmB,EAAI7C,KAAK+oB,gBAClBC,EAASnmB,EAAI4Q,KAAK,SAClB+O,EAAW,IAEXwG,KACHxG,EAAWyG,YAAY,WACtB,GAAItJ,GAAM1Q,KAAKuN,KAAKnS,KAAKsV,MAAQ,KAC7BuJ,EAAYF,EAASrJ,EACrBwJ,EAAUD,EAAY,GACtBE,EAAUna,KAAKqT,MAAM4G,EAAY,GAEjCC,GAAU,KACbA,EAAU,IAAMA,GAGZC,EAAU,KACdA,EAAU,IAAMA,GAGjBN,EAAOjkB,KAAKukB,EAAU,IAAMD,GAExBD,GAAa,IAChBG,cAAc7G,GACdA,EAAW,KACX9hB,OAAO0Q,SAAW1Q,OAAO0Q,SAASC,OAEjC,MA/BL,GAAI0X,gBAAiB,YACjBhpB,EAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IAkC/GC,QAAOC,QAAUgoB;;;;ACjCjB,QAASS,UAAUxpB,GAClB,GAAIypB,GAAYzpB,EAAGwG,aAAa,kBAEhCkjB,OAAO1pB,EADe,GAA4B,IAJnD,GAAI0pB,OAAQvlB,QAAQ,QAQpBrD,QAAOC,QAAUyoB;;ACRjB,QAASG,WAAU3pB,GACjB,QAAS4pB,KACP,GAAIC,GAAO7pB,EAAGqP,uBACd,OAASwa,GAAK5R,IAAM/Q,YAAc,GAAW2iB,EAAK5R,IAAM4R,EAAK3a,OAAW,EAE1EtO,OAAOY,iBAAiB,SAAU,WAC5BooB,KACF5pB,EAAG6B,UAAUY,IAAI,0BAKvB3B,OAAOC,QAAU4oB;;;ACRjB,QAASG,iBAAgB9pB,GACxB,GAAIiB,GAAIZ,IACRY,GAAE8B,IAAM9C,EAAED,EACV,IAAI2Y,GAAS1Y,EAAE,2BAEX0Y,GAAO7P,QACV7H,EAAE8oB,aAAapR,GAGZ1Y,EAAED,GAAI8I,QACT7H,EAAE6Y,UAAU9Z,GAGbY,OAAOY,iBAAkB,SAAUwF,SAAS,WAC3C/F,EAAE8oB,aAAapR,GACf1X,EAAE6Y,UAAU9Z,IACV,MApBJ,GAAIC,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,KAC3GmG,SAAW7C,QAAQ,mBACnB6lB,YAAc,IAqBlBF,iBAAgBvlB,UAAUuV,UAAY,SAASnB,GAC1C1Y,EAAE0Y,GAAQ7P,QAAUlI,OAAOuZ,YAAc6P,YAC5C/pB,EAAE0Y,GAAQtB,KAAM,WACfpX,EAAEI,MAAMunB,IAAI,GAAGxN,OACfna,EAAEI,MAAMqlB,SAGTzlB,EAAE0Y,GAAQtB,KAAM,WACfpX,EAAEI,MAAMunB,IAAI,GAAGtN,QACfra,EAAEI,MAAMwV,UAKXiU,gBAAgBvlB,UAAUwlB,aAAe,SAASpR,GAC7CA,EAAO7P,QAAUlI,OAAOuZ,YAAc6P,YACzCrR,EAAOtB,KAAM,WACZpX,EAAEI,MAAM,GAAG4pB,cAAcC,YAAY,mDAA8D,KACnGjqB,EAAEI,MAAMC,SAASolB,SAGlB/M,EAAOtB,KAAM,WACZpX,EAAEI,MAAM,GAAG4pB,cAAcC,YAAY,mDAA8D,KACnGjqB,EAAEI,MAAMC,SAASuV,UAKpB/U,OAAOC,QAAU+oB;;;;;ACjDjB,QAASK,OAAMnqB,GACd,GAAIiB,GAAIZ,IACRY,GAAE8B,IAAM9C,EAAED,GACViB,EAAEmpB,OAASnpB,EAAE8B,IAAI7C,KAAK,gCAClBe,EAAE8B,IAAIrC,SAAS,kBAClBO,EAAEopB,OAASppB,EAAE8B,IAEb9B,EAAEopB,OAASppB,EAAE8B,IAAI7C,KAAK,mBAEvBe,EAAE2Y,MAAQ3Y,EAAEopB,OAAO1W,KAAK,SACxB1S,EAAEqpB,WAAarqB,EAAE,sBAAwBgB,EAAE2Y,MAAQ,MACnD3Y,EAAEspB,cAAgBtpB,EAAE8B,IAAI7C,KAAK,2BAC7Be,EAAEupB,YAAcvqB,EAAE,uBAAyBgB,EAAE2Y,MAAQ,MAErD3Y,EAAEupB,YAAYrqB,GAAG,QAAS,SAAU8B,GACnCA,EAAEsD,iBACFtE,EAAEyd,cAGHzd,EAAEqpB,WAAWnqB,GAAG,QAAS,SAAU8B,GAClCA,EAAEsD,iBACFtE,EAAE2F,eAvBJ,GAAI3G,GAAuB,mBAAXW,QAAyBA,OAAe,OAAsB,mBAAXC,QAAyBA,OAAe,OAAI,IA4B/GspB,OAAM5lB,UAAUma,UAAY,WACnBre,KACNgqB,OAAOplB,SAAS,wBAGnBklB,MAAM5lB,UAAUqC,WAAa,WAC5B,GAAI3F,GAAIZ,IACRY,GAAEopB,OAAOnlB,YAAY,uBACrBjE,EAAEmpB,OAAOzpB,KAAK,MAAOM,EAAEmpB,OAAOzpB,KAAK,QAEnCV,EAAEyB,UAAUoX,MAAM,WACjB7Y,EAAE,iBAAiBoX,KAAK,WACvBpX,EAAEI,MAAMunB,IAAI,GAAGtN,aAKlBxZ,OAAOC,QAAUopB;;;;AC3CjB,QAASM,eAAczqB,GACrB,GAAIiB,GAAIZ,IAIR,IAFAY,EAAEwE,OAASzF,EAAGoB,cAAc,sBAExBH,EAAEwE,QAAUxE,EAAEwE,OAAOC,kBAAoB,EAC3C,CAAa,GAAIC,UAAU1E,EAAEwE,QAC3BG,UAAW,SACXC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChBC,SAAU,OAfhB,GAAIP,UAAWxB,QAAQ,WAqBvBrD,QAAOC,QAAU0pB","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 1 ) {\n var slider = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: true,\n prevNextButtons: true,\n pageDots: true,\n setGallerySize: true,\n autoPlay: 5000\n } );\n }\n\n}\n\nmodule.exports = Carousel;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nmodule.exports = function(el) {\n\tvar $el = $(el);\n\tvar form = $el.closest('form');\n\n\t$(el).find('.js-delete').on('click', function(e) {\n\t\te.preventDefault();\n\t\t$(this).closest('.js-row').find('.js-quantity .js-field-mobile').remove();\n\t\tform.submit();\n\t});\n};\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction Concierge(el) {\n\tvar t = this;\n\n\tt.el = el;\n\tt.start = document.querySelector( t.el.getAttribute('data-modal-start') );\n\tt.end = document.querySelector( t.el.getAttribute('data-modal-end') );\n\tt.closeButton = t.el.querySelector('.js-concierge-close');\n\tt.activeClass = 'concierge--visible';\n\n\tif( t.start && t.end ) {\n\t\tt.init();\n\t}\n\n\tif ( t.closeButton ) {\n\t\tt.closeButton.addEventListener('click', t.closeModal.bind(t));\n\t}\n\n\t$(window).load(function() {\n\t\t$(t.el).insertAfter($(t.start).find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, [tabindex], [contentEditable=true]').first());\n\t});\n}\n\nConcierge.prototype.init = function() {\n\tvar t = this,\n\t\t\tstart = t.start.offsetTop - window.innerHeight / 2,\n\t\t\tend = t.end.offsetTop - window.innerHeight / 2;\n\n\tif( start && end ) {\n\t\twindow.addEventListener('scroll', throttle(function () {\n\t\t\tvar offset = window.pageYOffset;\n\t\t\tif (offset > start && offset < end) {\n\t\t\t\tt.el.classList.add( t.activeClass );\n\t\t\t} else {\n\t\t\t\tt.el.classList.remove( t.activeClass );\n\t\t\t}\n\t\t}, 300));\n\t}\n};\n\nConcierge.prototype.closeModal = function() {\n\tvar t = this;\n\tt.el.classList.remove( t.activeClass );\n\tsetTimeout(function () {\n\t\tt.el.remove();\n\t},300);\n};\n\nmodule.exports = Concierge;\n","function ContactInfo(el) {\n var mapContainer = el.querySelector('[data-map]');\n if( mapContainer ) {\n var mapLat = mapContainer.getAttribute('data-lat'),\n mapLng = mapContainer.getAttribute('data-lng');\n if( mapLat && mapLng ) {\n var styles = [\n {\n featureType: \"poi.business\",\n elementType: \"labels\",\n stylers: [\n { visibility: \"off\" }\n ]\n }\n ];\n var mapProp = {\n center: new google.maps.LatLng(mapLat,mapLng),\n zoom: 15,\n mapTypeControl: false\n };\n var map = new google.maps.Map(mapContainer,mapProp);\n map.setOptions({styles: styles});\n var marker = new google.maps.Marker({\n position: new google.maps.LatLng(mapLat,mapLng),\n map: map,\n });\n }\n }\n}\n\nmodule.exports = ContactInfo;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Filters(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$posts = $('.js-directory-post-filters').children();\n\tt.$maps = $('.js-directory-map-filters svg').children();\n\tt.$cards = $('.js-card-filters').children();\n\tt.$activeItemsCount = 0;\n\n\tif ( t.$posts.length ) {\n\t\tt.$activePost = t.$posts.filter('.directory__item--active');\n\t}\n\tif ( t.$maps.length ) {\n\t\tt.$activeMap = t.$maps.filter('js-active');\n\t}\n\n\tif ( t.$cards.length ) {\n\t\tt.$activeCard = t.$cards.filter('.small-card--active');\n\t}\n}\n\nFilters.prototype.filterByValue = function(value) {\n\tvar t = this;\n\n\tif( t.activeFilter == value ) {\n\t\treturn;\n\t}\n\n\tif( t.$posts.length ) {\n\t\tt.filterPost(value);\n\t}\n\n\tif( t.$maps.length ) {\n\t\tt.filterMap(value);\n\t}\n\n\tif( t.$cards.length ) {\n\t\tt.filterCard(value);\n\t}\n\n\tt.activeFilter = value;\n\n\t$('body').trigger('custom-filter', {\n\t\tvalue: value,\n\t\tcount: t.$activeItemsCount\n\t});\n};\n\nFilters.prototype.filterPost = function(value) {\n\tvar t = this;\n\tt.$activePost.removeClass('directory__item--active');\n\tt.$posts.removeClass('directory__item--active')\n\tt.$activePost = $(value.split('|').map(function(singleValue) {\n\t\tvar $newPosts = t.$posts.filter( '[data-filter-type*=\"|' + singleValue + '|\"]' );\n\t\tt.$activeItemsCount = $newPosts.length;\n\t\t$newPosts.addClass('directory__item--active');\n\t}));\n};\n\nFilters.prototype.filterMap = function(value) {\n\tvar t = this;\n\tt.$maps.removeClass('js-active');\n\tt.$activeMap = $(value.split('|').map(function(singleValue) {\n\t\tvar $newMap = t.$maps.filter( '[data-filter*=\"' + singleValue + '\"]' );\n\t\t$newMap.addClass('js-active');\n\t\tt.$activeItemsCount = $newMap.length;\n\t\treturn $newMap;\n\t}));\n};\n\nFilters.prototype.filterCard = function(value) {\n\tvar t = this;\n\n\tif( value == 'all' ) {\n\t\tt.$el.addClass('card-filter-all');\n\t\tt.$cards.addClass('small-card--active');\n\t} else {\n\t\tt.$el.removeClass('card-filter-all');\n\t\tt.$cards.removeClass('small-card--active');\n\t\tt.$newCard = t.$cards.filter( '[data-filter-type*=\"|' + value + '|\"]' );\n\t\tt.$activeCard.removeClass('small-card--active');\n\t\tt.$newCard.addClass('small-card--active');\n\t\tt.$activeItemsCount = t.$newCard.length;\n\t\tt.$activeCard = t.$newCard;\n\t}\n};\n\nmodule.exports = Filters;\n","var TinyDatePicker = require('tiny-date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar NEXT_CLASS = 'dp-next',\n\tPREV_CLASS = 'dp-prev',\n\tDAY_CLASS = 'dp-day',\n\tDAY_SELECTOR = '.' + DAY_CLASS,\n\tTIMESTAMP_DATA = 'data-date';\n\nfunction formatDate(date) {\n\treturn (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();\n}\n\nfunction DatePicker(el, settings) {\n\tthis.el = el;\n\tthis.isOpen = false;\n\tthis.init(settings);\n\tthis.isEventsBound = false;\n}\n\nDatePicker.prototype.init = function(settings) {\n\tvar t = this,\n\t\tdefaultSettings = {\n\t\t\tformat: function (date) {\n\t\t\t\treturn date.toLocaleDateString();\n\t\t\t},\n\t\t\tmode: 'dp-below',\n\t\t\tmin: formatDate(new Date()),\n lang: {\n days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n today: '',\n clear: '',\n close: ''\n },\n\t\t\tonOpen: t.onOpen.bind(t),\n\t\t\tonSelectYear: t.filter.bind(t),\n\t\t\tonSelectMonth: t.filter.bind(t),\n\t\t\tdisabled: [],\n\t\t\tparse: function(str) {\n\t\t\t\tif (! str) {\n\t\t\t\t\treturn new Date();\n\t\t\t\t}\n\t\t\t\tvar date = new Date(str.replace('-', '/'));\n\t\t\t\treturn isNaN(date) ? new Date() : date;\n\t\t\t}\n\t\t};\n\n\tif (! settings) {\n\t\tsettings = {};\n\t}\n\n\tif (settings.onOpen) {\n\t\tsettings.onOpenCallback = settings.onOpen;\n\t\tsettings.onOpen = defaultSettings.onOpen;\n\t}\n\n\tt.settings = $.extend({}, defaultSettings, settings);\n\n\tt.datepicker = new TinyDatePicker(t.el, t.settings);\n\n\tt.datepicker.on('close', function() {\n t.isOpen = false;\n t.el.focus();\n });\n\n\tt.datepicker.on('open', function(context) {\n document.querySelector('.dp-current').focus();\n document.querySelector('.dp').addEventListener('keydown', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 13) {\n e.stopPropagation();\n e.preventDefault();\n } else if (key === 9) {\n e.stopPropagation();\n t.el.focus();\n }\n });\n\n t.isOpen = true;\n });\n\n\tt.el.addEventListener('keydown', function(e) {\n\t if (!t.isOpen) {\n var key = e.which || e.keyCode;\n\n if (key === 32) {\n t.datepicker.open();\n }\n }\n });\n\n\tt.el.addEventListener('change', function() {\n\t\tvar\n\t\t\tcurrent, selected,\n\t\t\tdate = new Date(t.el.value);\n\n\t\tif (isDayOfWeek(date, t.settings.disabled)) {\n\t\t\tcurrent = t.datepicker.el.querySelector('.dp-current');\n\t\t\tselected = t.datepicker.el.querySelector('.dp-selected');\n\t\t\tif (current) {\n\t\t\t\tcurrent.classList.remove('dp-current');\n\t\t\t}\n\t\t\tif (selected) {\n\t\t\t\tselected.classList.remove('dp-selected');\n\t\t\t}\n\t\t\tt.el.value = '';\n\t\t\tt.filter(t.datepicker);\n\t\t} else {\n\t\t\tt.close();\n\t\t}\n\n\t});\n};\n\nDatePicker.prototype.filter = function(context) {\n\tfilterDates(context, this.settings.disabled);\n};\n\nDatePicker.prototype.toggle = function () {\n\tif (this.datepicker.el) {\n\t\tthis.close();\n\t} else {\n\t\tthis.datepicker.open();\n\t}\n\tvar iconCalendar = document.querySelector('.js-calendar-toggle');\n\ticonCalendar.classList.toggle('card-tabs__calendar--active');\n};\n\nvar customPlaceHolder = function(el, value) {\n\t$(el).addClass('selected');\n\tvar placeholderSelector = 'rewards-form__input-placeholder';\n\tvar placeholderEl = $(el).next('.' + placeholderSelector);\n\tif (placeholderEl.length) {\n\t\tplaceholderEl.text(value);\n\t} else {\n\t\t$(el).after('' + value + '');\n\t}\n}\n\nDatePicker.prototype.close = function () {\n\tcustomPlaceHolder(this.el, this.el.value);\n\tvar el = this.datepicker.el;\n\tel && el.parentElement.removeChild(el);\n\tthis.datepicker.el = undefined;\n\tif (this.settings.onClose) {\n\t\tthis.settings.onClose();\n\t}\n};\n\nDatePicker.prototype.onOpen = function(context) {\n\tvar t = this;\n\tfilterDates(context, t.settings.disabled);\n\n\tif (t.isEventsBound) {\n\t\treturn;\n\t}\n\n\tcontext.el.addEventListener('click', function(e) {\n\t\tif (e.target.classList.contains(NEXT_CLASS) ||\n\t\t\te.target.classList.contains(PREV_CLASS)) {\n\t\t\tfilterDates(context, t.settings.disabled);\n\t\t}\n\t});\n\n\tcontext.el.addEventListener('keydown', function(e) {\n\t\tthis.filter(context);\n\t}.bind(t));\n\n\tt.alreadyInit = true;\n};\n\nDatePicker.prototype.getSelectedDate = function () {\n\treturn this.datepicker.selectedDate;\n};\n\nfunction getDate(dayEl) {\n\treturn new Date(parseInt(dayEl.getAttribute(TIMESTAMP_DATA)));\n}\n\nfunction isDayOfWeek(dateObject, arrayOfWeekdays) {\n\treturn arrayOfWeekdays.indexOf(dateObject.getDay()) !== -1;\n}\n\nfunction filterDates(context, dateClose) {\n\tvar days = Array.prototype.slice.call(context.el.querySelectorAll(DAY_SELECTOR));\n\tif( dateClose.length && days ) {\n\t\tvar closeDays = days.filter(function(dayEl) {\n\t\t\treturn isDayOfWeek(getDate(dayEl), dateClose);\n\t\t});\n\t\tcloseDays.forEach(function(dayEl) {\n\t\t\tdayEl.classList.add(DAY_CLASS + '-disabled');\n\t\t});\n\t}\n}\n\n\nmodule.exports = DatePicker;\n","var SelectField = require('modules/select-field');\nvar Filters = require('modules/custom-filters');\nvar svgPanZoom = require('svg-pan-zoom');\n\nfunction Directory(el) {\n\tvar t = this,\n\t\tselectFieldEl = el.querySelector('.js-directory-dropdown'),\n\t\tselectFieldElMobile = selectFieldEl.querySelector('[data-field-mobile]'),\n\t\tselectFieldElCurrent = selectFieldEl.querySelector('[data-field-current]'),\n\t\tselectComponent = new SelectField(selectFieldEl),\n\t\tfiltersComponent = new Filters(el);\n\n\tt.el = el;\n\tt.map = t.el.querySelector('.js-directory-map-filters svg');\n\tt.panzoom = null;\n\n\tif( t.map ) {\n\t\tvar options = {\n\t\t\tzoomEnabled: true,\n\t\t\tcontain: true,\n\t\t\tfit: true,\n\t\t\tcontrolIconsEnabled: false,\n\t\t\tminZoom: 1,\n\t\t\tmaxZoom: 10,\n\t\t\tbeforePan: function( oldPan, newPan ){\n\t\t\t\tvar currentZoom = t.panzoom.getZoom();\n\t\t\t\tif (currentZoom <= 1.00001) {\n\t\t\t\t\treturn {x: 0, y:0};\n\t\t\t\t}\n\n\t\t\t\tvar sizes = this.getSizes(),\n\t\t\t\t\tleftLimit = 0,\n\t\t\t\t\trightLimit = -(sizes.width * (currentZoom - 1)),\n\t\t\t\t\ttopLimit = 0,\n\t\t\t\t\tbottomLimit = -(sizes.height * (currentZoom - 1));\n\n\t\t\t\treturn {\n\t\t\t\t\tx: Math.min(leftLimit, Math.max(rightLimit, newPan.x)),\n\t\t\t\t\ty: Math.min(topLimit, Math.max(bottomLimit, newPan.y))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\theight = t.map.getBoundingClientRect().height;\n\n\t\tif( height ) {\n\t\t\tt.map.parentNode.style.height = height + 'px';\n\t\t}\n\t\tt.panzoom = svgPanZoom(t.map, options);\n\t\tt.zoomInButton = t.el.querySelector('[data-zoom-in]');\n\t\tt.zoomOutButton = t.el.querySelector('[data-zoom-out]');\n\n\t\tif( t.zoomInButton ) {\n\t\t\tt.zoomInButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomIn();\n\t\t\t});\n\t\t}\n\n\t\tif( t.zoomOutButton ) {\n\t\t\tt.zoomOutButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomOut();\n\t\t\t});\n\t\t}\n\n\t\t// move svg using arrow key.\n\t\tt.getPoint = function(x, y) {\n\t\t\tvar pt = t.map.createSVGPoint();\n\t\t\tpt.x = x;\n\t\t\tpt.y = y;\n\n\t\t\treturn pt.matrixTransform(t.map.getScreenCTM().inverse());\n\t\t};\n\n\t\tt.keyboardHandlers = function(e) {\n\t\t\tvar key = e.which || e.keyCode,\n\t\t\t\tstep = 15;\n\n\t\t\tif (key >= 37 && key <= 40) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tswitch (key) {\n\t\t\t\tcase 37:\t// left\n\t\t\t\t\tt.panzoom.panBy({x: step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38:\t// up\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: step});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39:\t// right\n\t\t\t\t\tt.panzoom.panBy({x: -step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 40:\t// down\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: -step});\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tt.zoomInButton.addEventListener('keydown', t.keyboardHandlers);\n\t\tt.zoomOutButton.addEventListener('keydown', t.keyboardHandlers);\n\t}\n\n\twindow.pz = t.panzoom;\n\n\n\n\t// Generate array list for SVG groups\n\tif( selectFieldElMobile ) {\n\t\tt.list = Array.prototype.slice.call( selectFieldElMobile.children );\n\t\tt.svgIDs = [];\n\t\tt.list.forEach( function(item) {\n\t\t\tvar value = item.getAttribute('value');\n\t\t\tif( value ) {\n\t\t\t\tvalue.split('|').map(function(singleValue) {\n\t\t\t\t\tt.svgIDs.push(singleValue);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t// Check and append data filter to matching filter group\n\tif( t.svgIDs && t.map ) {\n\t\tt.svgGroups = Array.prototype.slice.call( t.map.querySelectorAll('g'));\n\t\tif( t.svgGroups ) {\n\t\t\tt.svgGroups.forEach( function(group) {\n\t\t\t\tvar id = group.getAttribute('id');\n\t\t\t\tif( t.svgIDs.indexOf(id) != -1) {\n\t\t\t\t\tgroup.setAttribute('data-filter', id);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tfiltersComponent.filterByValue(selectFieldElMobile.value);\n\tselectComponent.onChange(filtersComponent.filterByValue.bind(filtersComponent));\n}\nmodule.exports = Directory;\n","var DatePicker = require('modules/date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getMonthName(date) {\n\tvar monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\treturn monthNames[date.getMonth()];\n}\n\nfunction formatDate(date) {\n\treturn getMonthName(date) + ' ' + date.getDate() + ', ' + date.getFullYear();\n}\n\nfunction EventFilter(el) {\n\tthis.el = el;\n\tthis.toggle = this.el.querySelector('.js-calendar-toggle');\n\tthis.event = Array.prototype.slice.call(this.el.querySelectorAll('[data-date-start]'));\n\tthis.selectedDate = this.el.querySelector('.js-selected-date');\n\tthis.dateLabel = this.el.querySelector('.js-today-date');\n\tthis.currentPage = 0;\n\n\tthis.calendarTrigger();\n\t// this.clickOutside();\n}\n\nEventFilter.prototype.calendarTrigger = function() {\n\tvar t = this;\n\tif ( t.toggle ) {\n\t\tt.calendarToggle();\n\t}\n};\n\nEventFilter.prototype.calendarToggle = function() {\n\tvar t = this;\n\n\tt.calendar = new DatePicker(t.selectedDate, {\n\t\tformat: function(selectedDate) {\n\t\t\treturn formatDate(selectedDate);\n\t\t}\n\t});\n\n\tt.selectedDate.addEventListener('change', function() {\n\t\tvar date = new Date(t.selectedDate.value),\n\t\t\tmonth = date.getUTCMonth() + 1,\n\t\t\tday = date.getDate();\n\n\t\tif (day < 10) {\n\t\t\tday = '0' + day;\n\t\t}\n\n\t\tif (month < 10) {\n\t\t\tmonth = '0' + month;\n\t\t}\n\t\tvar returnDate = month + '/' + day + '/' + date.getFullYear();\n\t\tlocation.href = '?date=' + returnDate;\n\t});\n\n\tt.toggle.addEventListener('click', t.calendar.toggle.bind(t.calendar));\n};\n\nEventFilter.prototype.checkFilterDate = function() {\n\tvar field = 'date',\n\t\turl = window.location.href;\n\tif( url.indexOf('?' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else if( url.indexOf('&' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nEventFilter.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', function (e) {\n\t\tif ( e.target !== t.toggle.parentNode.querySelector('.dp-below') && e.target != t.calendar ) {\n\t\t\tt.calendar.close();\n\t\t\tt.toggle.classList.remove('card-tabs__calendar--active');\n\t\t}\n\t});\n};\nmodule.exports = EventFilter;\n","function Exp(el) {\n\tel.addEventListener('keyup', function(e) {\n\t\tif (e.keyCode !== 8 && e.keyCode !== 46 && el.value.indexOf('/') === -1 && el.value.length === 2) {\n\t\t\tel.value += '/';\n\t\t}\n\t})\n}\n\nmodule.exports = Exp;\n","var Flickity = require('flickity');\n\nfunction FavoriteRow(el) {\n\tvar t = this;\n\n\tt.slider = el.querySelector('[data-favorite-slider]');\n\tif ( t.slider && t.slider.childElementCount > 3 ) {\n\t\tvar slider = new Flickity( t.slider, {\n\t\t\tcellAlign: 'center',\n\t\t\tcontain: true,\n\t\t\tprevNextButtons: true,\n\t\t\tpageDots: false,\n\t\t\twrapAround: true,\n\t\t\tarrowShape: {\n\t\t\t\tx0: 10,\n\t\t\t\tx1: 55, y1: 50,\n\t\t\t\tx2: 55, y2: 45,\n\t\t\t\tx3: 15\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = FavoriteRow;\n","function Fields(el) {\n\tvar formSelects = Array.prototype.slice.call(el.querySelectorAll('.ginput_container_select'));\n\tif ( formSelects ) {\n\t\t// Create markup for select\n\t\tformSelects.forEach(function(elem) {\n\t\t\tvar formNativeSelect = elem.querySelector('select'),\n\t\t\t\tformOptionsSelect = formNativeSelect.querySelectorAll('option'),\n\t\t\t\tformPlaceholder = formNativeSelect.getAttribute('data-placeholder'),\n\t\t\t\tformListSelect,\n\t\t\t\tmarkupSelect,\n\t\t\t\tplaceholderField = '';\n\t\t\tformNativeSelect.setAttribute('data-field-mobile', '');\n\t\t\tformListSelect = '
';\n\t\t\tif( formPlaceholder ) {\n\t\t\t\tplaceholderField = '' + formPlaceholder + '';\n\t\t\t}\n\t\t\tmarkupSelect = '
' + placeholderField + '
' +\n\t\t\t\tformNativeSelect.outerHTML + '
' + formListSelect;\n\t\t\telem.innerHTML = markupSelect;\n\n\t\t\t// Select first item\n\t\t\tvar current = el.querySelector('[data-field-current]'),\n\t\t\t\t\tmobile = el.querySelector('[data-field-mobile]'),\n\t\t\t\t\tdesktop = el.querySelector('[data-field-desktop]');\n\n\t\t\tcurrent.innerHTML = mobile.querySelector('option').innerHTML;\n\t\t\tmobile.selectedIndex = 0;\n\t\t});\n\t}\n}\n\nmodule.exports = Fields;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getUrlParameter(name) {\n\tname = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\tvar regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n\tvar results = regex.exec(window.location.href);\n\treturn results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n}\n\nfunction Filters(el) {\n\tvar t = this,\n\t\t\tcategory = getUrlParameter('category');\n\tt.$el = $(el);\n\tt.$filters = t.$el.find('[data-filter]');\n\tt.$active = t.$filters.filter('.filters__item--active');\n\tt.activeFilter = null;\n\tt.itemSelector = t.$el.data('item-selector');\n\tt.$items = false;\n\n\tif (t.itemSelector) {\n\t\tt.$items = $(t.$el.data('item-selector'));\n\t\tt.$subFilters = t.$items.find('[data-filter]');\n\t}\n\n\tif ( category ) {\n\t\tt.$category = t.$el.find('[data-filter=\"'+ category + '\"]');\n\t\tt.selectFilter(t.$category);\n\t} else {\n\t\tt.selectFilter(t.$filters.eq(0));\n\t}\n\n\tt.$filters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n\t\tif ($target.hasClass('js-filters-button')) {\n\t\t $target = $target.closest('.js-filters-item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n\tt.$subFilters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n if ($target.hasClass('filters_button')) {\n $target = $target.closest('.filters_item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n}\n\nFilters.prototype.selectFilter = function ($target) {\n\tvar t = this,\n\t\tselectedFilter = $target.data('filter');\n\n\tif (selectedFilter == t.activeFilter) {\n\t\treturn;\n\t}\n\n\tt.$active.removeClass('filters__item--active');\n\t// Find other targets, if possible\n\tvar $newTargets = $('[data-filter=\"' + selectedFilter + '\"]');\n\tif( $newTargets.length ) {\n\t\t$newTargets.addClass('filters__item--active');\n\t}\n\n\tif ( t.$items ) {\n\t\tt.$items.removeClass( 'js-filter-visible' );\n\t\tt.$items.filter( '[data-filter-type*=\"|' + selectedFilter + '|\"]' ).addClass( 'js-filter-visible' );\n\t}\n\n\tt.activeFilter = selectedFilter;\n\tt.$active = $newTargets;\n\n\tt.$el.trigger('change');\n\n\n};\n\nmodule.exports = Filters;\n","var DatePicker = require('modules/date-picker');\nvar DISABLE_CLASS = 'button--disabled';\n\nfunction formatDate(date) {\n\tvar month = date.getMonth() + 1;\n\tif (month < 10) {\n\t\tmonth = '0' + month;\n\t}\n\treturn date.getFullYear() + '-' + month + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate();\n}\n\nfunction revertDate(date) {\n\treturn formatDate(date).replace(/-/g, '/');\n}\n\nfunction selectAll(selector, parent) {\n\treturn Array.prototype.slice.call(parent.querySelectorAll(selector));\n}\n\nfunction disableButton(button) {\n\tbutton.disabled = true;\n\tbutton.classList.add(DISABLE_CLASS);\n}\n\nfunction enableButton(button) {\n\tbutton.disabled = false;\n\tbutton.classList.remove(DISABLE_CLASS);\n}\n\nfunction Form(el) {\n\tvar t = this;\n\tvar datePickers = selectAll('.js-date-picker', el);\n\tvar forms = selectAll('form', el);\n\tvar buttons = selectAll('button, input[type=\"submit\"], a.button, .js-button', el);\n\tvar areFormsEnabled = true;\n\n\tvar reserveChangeCheckbox = selectAll('.js-reserve-change-checkbox', el);\n\tvar rewardsFormSubmit = selectAll('.js-rewards-form-submit', el);\n\tif (rewardsFormSubmit) {\n\t\trewardsFormSubmit.map(disableButton);\n\t}\n\n\tif (reserveChangeCheckbox) {\n\t\treserveChangeCheckbox.map(function (checkbox) {\n\t\t\tcheckbox.addEventListener('change', function(e) {\n\t\t\t\tif (e.target.checked) {\n\t\t\t\t\trewardsFormSubmit.map(enableButton);\n\t\t\t\t} else {\n\t\t\t\t\trewardsFormSubmit.map(disableButton);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tforms.map(function(form) {\n\t\tform.addEventListener('submit', function(e) {\n\t\t\tif (!areFormsEnabled) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tareFormsEnabled = false;\n\t\t\tbuttons.map(disableButton);\n\t\t});\n\t});\n\n\t// Enable Date Picker\n\tif( datePickers ) {\n\t\tdatePickers.forEach( function(elem) {\n\t\t\tvar args = {\n\t\t\t\tformat: formatDate\n\t\t\t};\n\t\t\tvar min = elem.getAttribute('data-min');\n\n\t\t\tif ( ! min ) {\n\t\t\t\tmin = new Date();\n\t\t\t\tvar offset = elem.getAttribute('data-offset') || 0;\n\t\t\t\tmin.setSeconds(min.getSeconds() + min.getTimezoneOffset() * 60 + parseInt(offset));\n\t\t\t\tmin = formatDate(min);\n\t\t\t} else {\n\t\t\t\tmin = min.replace('-', '/');\n\t\t\t}\n\t\t\targs.min = min;\n\t\t\targs.max = elem.getAttribute('data-max');\n\t\t\tif (args.max) {\n\t\t\t\targs.max = args.max.replace('-', '/');\n\t\t\t}\n\n\t\t\tvar unavailable = elem.getAttribute('data-unavailable');\n\n\t\t\tif (unavailable) {\n\t\t\t\tunavailable = unavailable.split(',');\n\t\t\t\targs.inRange = function(dt) {\n\t\t\t\t\treturn unavailable.indexOf(revertDate(dt)) === -1;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tt.calendar = new DatePicker(elem, args);\n });\n }\n}\n\nmodule.exports = Form;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction GravityForm(el) {\n\tvar $el = $(el);\n\tif ($el) {\n\t\tvar $gform_upload_custom = $el.find('.gform_upload_custom_rules');\n\t\tif ($gform_upload_custom) {\n\t\t\tvar $description_elm = $gform_upload_custom.find('div.gfield_description');\n\t\t\tvar $rules_text_elm = $gform_upload_custom.find('span.gform_fileupload_rules');\n\t\t\tif ($rules_text_elm && $description_elm && $description_elm.text() !== '') {\n\t\t\t\t$description_elm.hide();\n\t\t\t\t$rules_text_elm.append($description_elm.text());\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = GravityForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction Header(el) {\n\tvar t = this;\n\n\tt.$el = $(el);\n\tt.headerHeight = 60;\n\tt.$document = $(document);\n\tt.$body = $('body');\n\tt.$html = $('html');\n\tt.$main = $('.main');\n\tt.$menu = t.$el.find('.header__menu');\n\tt.$toggle = t.$el.find('.js-nav-trigger');\n\tt.$menuItems = t.$el.find('.menu-item-has-children > a');\n\tt.$allMenuItems = t.$el.find('.menu-item > a');\n\tt.$activeMenuItems = t.$el.find('.current-menu-item');\n\tt.$searchIcon = t.$el.find('.js-search-enable');\n\tt.$searchCloseIcon = $('.js-search-disable');\n\tt.$window = $(window);\n\n\t// Update fixed header\n\tt.onTop();\n\tt.$document.on('scroll', throttle(t.onTop.bind(t), 200));\n\n\t// Toggle menu active in mobile\n\tif( t.$toggle.length ) {\n\t\tt.$toggle.on('click', function() {\n\t\t\tt.$html.toggleClass('js-menu-active');\n\t\t});\n\t}\n\n\t// Enable dropdown menu\n\tif( t.$menuItems.length ) {\n\t\tt.$menuItems.on('click', function(e) {\n\t\t\tvar $link = $(this);\n\n\t\t\tif (t.$window.width() <= 768) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$link.parent().toggleClass('menu-item--open').siblings().removeClass('menu-item--open');\n\t\t\t}\n\t\t});\n\n\t\tt.$el.find('.menu-item-has-children ul li a').on('click', function() {\n\t\t\t$(this).closest('.menu-item-has-children').toggleClass('menu-item--open');\n\t\t\tvar $this = $(this),\n\t\t\thref = $this.attr('href'),\n\t\t\thash = href.substring(href.indexOf('#')+1);\n\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t$page[0].focus();\n\t\t});\n\n\t\t// Enable press space key to open submenu\n t.openSubmenu = function($parent) {\n var $link = $parent.find('> a');\n\n if ($parent.hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'true');\n $parent.addClass('menu-item--open');\n }\n };\n\n t.closeSubmenu = function($parent) {\n $parent.each(function($index, $item) {\n var $link = $($item).find('> a');\n if ($($item).hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'false');\n $($item).removeClass('menu-item--open');\n }\n });\n };\n\n t.toggleSubmenu = function($parent) {\n if ($parent.hasClass('menu-item--open')) {\n t.closeSubmenu($parent);\n } else {\n t.openSubmenu($parent);\n }\n };\n\n t.$allMenuItems.on('focus', function(e) {\n var $link = $(this);\n\n t.openSubmenu($link.parent());\n t.closeSubmenu($link.parent().siblings());\n });\n\n t.$allMenuItems.last().on('blur', function(e) {\n\t\t\tt.closeSubmenu(t.$el.find('.menu-item'));\n\t\t});\n\n $(document).on('click', function(e) {\n if (!t.$menu.is(e.target) && !t.$menu.has(e.target).length) {\n t.closeSubmenu(t.$el.find('.menu-item-has-children'));\n }\n });\n\t}\n\n\t// Remove active on same link if matching hash\n\tif( t.$activeMenuItems ) {\n\t\tvar link = t.$activeMenuItems.find('> a').attr('href'),\n\t\t\tchildren = t.$activeMenuItems.find('.menu-item a');\n\n\t\tif( link != undefined && children.length ) {\n\t\t\tchildren.each( function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\thref = $this.attr('href'),\n\t\t\t\t\thash = href.substring(href.indexOf('#')+1);\n\n\t\t\t\t// Add smooth scroll in current active page\n\t\t\t\tif( hash.length ) {\n\t\t\t\t\t$this.on('click', function(event) {\n\t\t\t\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t\t\t\tif( $page.length ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tt.smoothScroll($page);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Enable search\n\tif( t.$searchIcon.length ) {\n\t\tt.$searchIcon.on('click', function() {\n\t\t\tt.$html.addClass('js-search-active').trigger('searchActive');\n\t\t});\n\t}\n\n\tt.$html.on('searchInactive', function() {\n t.$searchIcon.focus();\n });\n\n\t// Find location hash and smooth scroll\n\tif( window.location.hash ) {\n\t\t// Fragment exists\n\t\tvar $target = t.$main.find('[name=\"' + window.location.hash.slice(1) + '\"]');\n\t\tif( $target.length ) {\n\t\t\t$(window).load(function() {\n\t\t\t\tt.smoothScroll($target);\n\t\t\t});\n\t\t}\n\t}\n\n\t$(window).on('load', function () {\n\t\tvar hash = window.location.hash;\n\t\tif (hash !== '') {\n\t\t\tsetTimeout(function () {\n\t\t\t\tvar id = hash.replace('#', '');\n\t\t\t\tvar element = document.getElementById(id);\n\t\t\t\tif (element && element.scrollIntoView) {\n\t\t\t\t\telement.scrollIntoView();\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t}\n\t});\n}\n\nHeader.prototype.smoothScroll = function(target) {\n\tvar t = this;\n\tvar offset = target.offset().top - parseFloat(t.$el.css('paddingTop')) - t.$menu.height() - 1;\n\t$('html, body').animate({\n\t\tscrollTop: offset\n\t}, 1000);\n\treturn false;\n};\n\nHeader.prototype.toggleFixedHeader = function(condition) {\n\tthis.$body.toggleClass('fixed-header', condition);\n};\n\nHeader.prototype.onTop = function() {\n\tvar t = this;\n\tt.toggleFixedHeader(t.$document.scrollTop() > t.$el.height());\n};\n\nmodule.exports = Header;\n","var Flickity = require('flickity');\n\nfunction HeroImage(el) {\n var t = this;\n\n t.slider = el.querySelector('.js-slider');\n\n if( t.slider && t.slider.childElementCount > 1 ) {\n var slider = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: true,\n autoPlay: 5000\n } );\n }\n\n}\n\nmodule.exports = HeroImage;","var Flickity = require('flickity');\nvar throttle = require('lodash.throttle');\n\nfunction HeroSlider(el) {\n var t = this;\n\n t.slider = el.querySelector('[data-slider]');\n t.slides = Array.prototype.slice.call(el.querySelectorAll('.hero-slider__item'));\n t.videos = Array.prototype.slice.call(el.querySelectorAll('.js-video'));\n\n if ( t.slider && t.slider.childElementCount > 1 ) {\n t.flickity = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: false,\n prevNextButtons: false,\n pageDots: true,\n\t\t\tresize: false,\n\t\t\t// Improve accessibility for slider\n\t\t\ton: {\n\t\t\t\tready: function() {\n\t\t\t\t\tconst sideLinks = this.viewport.querySelectorAll('.hero-slider__item a');\n\t\t\t\t\tconst sideSelectedLink = this.viewport.querySelector('.hero-slider__item.is-selected a');\n\t\t\t\t\tif (sideLinks.length > 0) {\n\t\t\t\t\t\tsideLinks.forEach(function(item) {\n\t\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (sideSelectedLink) {\n\t\t\t\t\t\tsideSelectedLink.setAttribute('tabindex', 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.pageDots.dots.forEach(function(dot) {\n\t\t\t\t\t\tvar button = document.createElement('button');\n\t\t\t\t\t\tvar buttonText = dot.getAttribute('aria-label').replaceAll('Page', 'Slide');\n\t\t\t\t\t\tbutton.setAttribute('aria-label', buttonText);\n\t\t\t\t\t\tbutton.className = 'dot-button';\n\t\t\t\t\t\tdot.removeAttribute('aria-label');\n\n\t\t\t\t\t\tdot.appendChild(button);\n\n\t\t\t\t\t\tdot.addEventListener('click', function(e) {\n\t\t\t\t\t\t\tdot.click();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tchange: function(index) {\n\t\t\t\t\tthis.viewport.querySelectorAll('.hero-slider__item a').forEach(function(item) {\n\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t});\n\t\t\t\t\tthis.viewport.querySelector('.hero-slider__item.is-selected a').setAttribute('tabindex', 0);\n\t\t\t\t}\n\t\t\t}\n });\n\n t.setHeights();\n\t\tif (t.videos.length) {\n\t\t\tt.playVideo();\n\t\t}\n\n window.addEventListener( 'resize', throttle(function() {\n \t\tt.setHeights(true);\n \t\tt.flickity.resize();\n \t\tt.setHeights();\n \t\tt.slider.removeAttr('tabindex');\n\t\t}, 100));\n\n\t\twindow.addEventListener( 'load', function () {\n\t\t\tt.slider.removeAttribute('tabindex');\n\t\t});\n }\n}\n\nHeroSlider.prototype.setHeights = function(reset) {\n\tvar t = this;\n\tt.slides.map( function( cell ) {\n\t\tif (reset) {\n\t\t\tcell.style.height = '';\n\t\t} else {\n\t\t\tcell.style.height = t.flickity.maxCellHeight + 'px';\n\t\t}\n\t} );\n};\n\nHeroSlider.prototype.playVideo = function() {\n\tvar t = this;\n\tif (t.videos.length && window.innerWidth >= 799) {\n\t if (typeof t.videos[0] !== 'undefined') {\n t.videos[0].play();\n }\n\n\t\tt.flickity.on( 'change', function() {\n\t\t\tt.videos.forEach( function(video) {\n\t\t\t\tvideo.pause();\n\t\t\t});\n\t\t\tif ( t.videos[t.flickity.selectedIndex] ) {\n\t\t\t\tt.videos[t.flickity.selectedIndex].play();\n\t\t\t}\n\t\t});\n\t}\n};\n\nmodule.exports = HeroSlider;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null),\n\twp = (typeof window !== \"undefined\" ? window['wpVars'] : typeof global !== \"undefined\" ? global['wpVars'] : null);\n\nfunction LoadMorePosts( el ) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.pageNumber = 1;\n\t// Collect data\n\tt.$loadMoreButton = t.$el.find('.js-load-more-toggle');\n\tt.$excludePost = t.$el.data('exclude-post');\n\tt.$list = t.$el.find('.js-load-post');\n\tif( t.$loadMoreButton ) {\n\t\tt.$loadMoreButton.on(\"click\", function( e ) {\n\t\t\te.preventDefault();\n\t\t\tt.$loadMoreButton.attr( \"disabled\", true );\n\t\t\tt.loadPosts();\n\t\t});\n\t}\n}\n\nLoadMorePosts.prototype.loadPosts = function() {\n\tvar t = this;\n\tt.pageNumber++;\n\t$.ajax({\n\t\ttype: \"POST\",\n\t\tdataType: \"json\",\n\t\turl: wp.ajaxUrl,\n\t\tdata: {\n\t\t\tpageNumber: t.pageNumber,\n\t\t\texcludePost: t.$excludePost,\n\t\t\taction: 'load_post_ajax'\n\t\t},\n\t\tsuccess: function( data ) {\n\t\t\tif (! data.html) {\n\t\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tt.$loadMoreButton.attr( \"disabled\", false );\n\t\t\tt.$list.append( data.html ).fadeIn( 300 );\n\t\t\tif (! data.hasNextPage) {\n\t\t\t\tt.$loadMoreButton.hide();\n\t\t\t}\n\t\t},\n\t\terror : function() {\n\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t}\n\t});\n\treturn false;\n};\n\nmodule.exports = LoadMorePosts;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar PER_PAGE = 5;\n\nfunction LoadMore(el) {\n\tvar itemSelector, filterClass, filterSelector,\n\t\tt = this;\n\n\tt.$el = $(el);\n\tt.currentPage = 0;\n\n\tt.filterClass = t.$el.data('filter-class');\n\titemSelector = t.$el.data('item-selector');\n\tt.$allItems = $(itemSelector);\n\n\tt.update();\n\n\tt.$filters = $(t.$el.data('filters-selector'));\n\n\tt.$el.on('click', t.showItems.bind(t));\n\n\tt.$filters.on('change', t.update.bind(t));\n}\n\nLoadMore.prototype.showItems = function (e) {\n\tvar count,\n\t\tt = this;\n\tt.currentPage ++;\n\tcount = t.currentPage * PER_PAGE;\n\tvar $nextElement = t.$items.slice(0, count).prevObject.not('.js-load-more-visible').first();\n\tt.$items.slice(0, count).addClass('js-load-more-visible');\n\tif (count < t.$items.length) {\n\t\tt.$el.fadeIn(300);\n\t} else {\n\t\tt.$el.fadeOut(300);\n\t}\n\n\tif (e && e.type) {\n\t if ($nextElement.length) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t\t$nextElement.find('a')[0].focus();\n\t\t\t}, 400);\n\t }\n\t}\n\n\treturn count;\n};\n\nLoadMore.prototype.update = function () {\n\tvar t = this;\n\tif (t.$items) {\n\t\tt.$items.removeClass('js-load-more-visible');\n\t}\n\n\tt.$items = t.$allItems.filter('.' + t.filterClass);\n\tt.currentPage = 0;\n\tt.showItems();\n};\n\nmodule.exports = LoadMore;\n","function Modal(el) {\n\tvar trigger,\n\t\ttriggerSelector = el.getAttribute('data-modal-trigger');\n\n\tel.addEventListener('click', function(e) {\n\t\tif (e.target === el) {\n\t\t\tel.classList.remove('js-active');\n\t\t}\n\t});\n\n\tif (! triggerSelector) {\n\t\treturn;\n\t}\n\n\ttrigger = document.querySelector(triggerSelector);\n\ttrigger.addEventListener('click', function() {\n\t\tel.classList.add('js-active');\n\t});\n}\n\nmodule.exports = Modal;\n","var Flickity = require('flickity'),\n\t$ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction MovieList(el) {\n\tvar t = this,\n\t\t$el = $(el),\n\t\t$size = $el.find(\".movie-list__list .js-movie-item\").size(),\n\t\t$start = 5,\n\t\t$loadMore = $el.find('.js-load-more'),\n\t\tcurrentSlide = Math.ceil($el.find('.js-current-date').index() / 5) - 1;\n\n\tt.slider = el.querySelector('[data-slider]');\n\tt.slideBreakpoint = 768;\n\n\tvar slider = new Flickity(t.slider, {\n\t\tcellAlign: 'left',\n\t\tcontain: true,\n\t\tadaptiveHeight: true,\n\t\tprevNextButtons: true,\n\t\tpageDots: false,\n\t\tsetGallerySize: true,\n\t\tgroupCells: $(window).width() > t.slideBreakpoint ? 5 : 2,\n\t\t// Improve accessibility for slider\n\t\ton: {\n\t\t\tready: function() {\n\t\t\t\t$(this.prevButton.element).insertBefore(this.viewport);\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t},\n\t\t\tchange: function(index) {\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t}\n\t\t}\n\t});\n\n\tslider.select(currentSlide);\n\n\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t$loadMore.on('click', function () {\n\t\tif ($start + 5 < $size) {\n\t\t\t$start = $start + 5;\n\t\t} else {\n\t\t\t$start = $size;\n\t\t}\n\t\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t\tif ( $start == $size ) {\n\t\t\t$loadMore.hide();\n\t\t}\n\t});\n\n\n}\n\nmodule.exports = MovieList;\n","/**\n* Initializes the site's PalisadesAnchor module.\n* @constructor\n* @param {Object} el - The site's PalisadesAnchor container element.\n*/\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar Sticky = (function() {\n\t'use strict';\n\n\tvar CSS_CLASS_ACTIVE = 'is-fixed';\n\n\tvar Sticky = {\n\t\telement: null,\n\t\tposition: 0,\n\t\toffset: 0,\n\t\taddEvents: function() {\n\t\t\twindow.addEventListener('scroll', this.onScroll.bind(this));\n\t\t},\n\t\tinit: function(element, offset) {\n\t\t\toffset = typeof offset !== 'undefined' ? offset : 0;\n\t\t\tthis.element = element;\n\t\t\tthis.offset = offset;\n\t\t\tthis.addEvents();\n\t\t\tthis.position = element.offsetTop - this.offset;\n\t\t\tthis.onScroll();\n\t\t},\n\t\taboveScroll: function() {\n\t\t\treturn this.position < window.scrollY;\n\t\t},\n\t\tonScroll: function(event) {\n\t\t\tif (this.aboveScroll()) {\n\t\t\t\tthis.setFixed();\n\t\t\t} else {\n\t\t\t\tthis.setStatic();\n\t\t\t}\n\t\t},\n\t\tsetFixed: function() {\n\t\t\tthis.element.classList.add(CSS_CLASS_ACTIVE);\n\t\t},\n\t\tsetStatic: function() {\n\t\t\tthis.element.classList.remove(CSS_CLASS_ACTIVE);\n\t\t}\n\t};\n\n\treturn Sticky;\n\n})();\nfunction PalisadesAnchor ( el ) {\n\tvar t = this;\n t.el = el;\n t.headerMenuHeight = 56;\n t.$anchorItems = $('.js-palisades-anchor');\n\n if (t.$anchorItems.length) {\n\t\tt.$anchorItems.each(function() {\n\t\t\t$(this).on('click', function(e) {\n\t\t\t\tvar $target = $($(this).attr('href'));\n\t\t\t\tif($target) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvar offset = $target.offset().top - parseFloat($target.css('paddingTop'));\n\t\t\t\t\t$('html, body').animate({\n\t\t\t\t\t\tscrollTop: offset\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\t// Init Sticky\n\tSticky.init(el, t.headerMenuHeight);\n}\n\nmodule.exports = PalisadesAnchor;\n","/**\n* Initializes the site's PalisadesCarousel module.\n* @constructor\n* @param {Object} el - The site's PalisadesCarousel container element.\n*/\nvar Flickity = require('flickity-as-nav-for');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nfunction PalisadesCarousel ( el ) {\n\tvar t = this;\n t.el = el;\n t.carouselEl = el.querySelector('.js-palisades-carousel');\n\tt.carouselNavEl = el.querySelector('.js-palisades-carousel-nav');\n\tt.carouselButton = el.querySelector('.js-palisades-carousel-button');\n\tt.dots = $(el).find('.js-palisades-carousel-dot');\n\tif( t.carouselEl && t.carouselEl.childElementCount > 1 ) {\n\t\tvar slider = new Flickity( t.carouselEl, {\n\t\t\tcellAlign: 'center',\n\t\t\twrapAround: true,\n\t\t\tcontain: true,\n\t\t\tadaptiveHeight: true,\n\t\t\timagesLoaded: true,\n\t\t\tprevNextButtons: false,\n\t\t\tpageDots: false\n\t\t});\n\t\t$(t.carouselButton).click(function() {\n\t\t\tslider.next();\n\t\t});\n\t\tslider.on('change', function(index) {\n\t\t\tt.dots.removeClass('is-selected');\n\t\t\tt.index = slider.selectedIndex\n\t\t\tt.dots.each(function() {\n\t\t\t\tif ($(this).attr('data-index') == t.index) {\n\t\t\t\t\t$(this).addClass('is-selected');\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tif( t.carouselNavEl && t.carouselNavEl.childElementCount > 1 ) {\n\t\tvar navSlider = new Flickity( t.carouselNavEl, {\n\t\t\tcellAlign: 'center',\n\t\t\twrapAround: true,\n\t\t\tcontain: true,\n\t\t\tadaptiveHeight: true,\n\t\t\tasNavFor: t.carouselEl,\n\t\t\tdraggable: false,\n\t\t\tprevNextButtons: false,\n\t\t\tpageDots: false\n\t\t});\n\t\tt.dots.each(function () {\n\t\t\t$(this).on('click', function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\tt.dots.removeClass('is-selected');\n\t\t\t\t$(this).addClass('is-selected');\n\t\t\t\tvar index = $(this).attr('data-index');\n\t\t\t\tslider.select(index);\n\t\t\t});\n\t\t});\n\t}\n}\n\nmodule.exports = PalisadesCarousel;\n","/**\n* Initializes the site's PalisadesForm module.\n* @constructor\n* @param {Object} el - The site's PalisadesForm container element.\n*/\nfunction PalisadesForm ( el ) {\n this.el = el;\n}\n\nmodule.exports = PalisadesForm;\n","/**\n* Initializes the site's PalisadesHero module.\n* @constructor\n* @param {Object} el - The site's PalisadesHero container element.\n*/\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nfunction PalisadesHero ( el ) {\n\tvar t = this;\n t.scrollEl = el.querySelector('.js-palisades-hero-scroll');\n\n\tif( t.scrollEl ) {\n\t\tt.scrollEl.addEventListener('click', function (e) {\n\t\t\te.preventDefault();\n\t\t\tvar $nextSection = $(el).next('section');\n\t\t\tif ($nextSection) {\n\t\t\t\tvar offset = $nextSection.offset().top - parseFloat($(el).css('paddingTop')) - $('.header').height() - parseFloat($('.header').css('paddingTop'));\n\t\t\t\t$('html, body').animate({\n\t\t\t\t\tscrollTop: offset\n\t\t\t\t}, 1000);\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = PalisadesHero;\n","/**\n* Initializes the site's PalisadesIntro module.\n* @constructor\n* @param {Object} el - The site's PalisadesIntro container element.\n*/\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nfunction PalisadesIntro ( el ) {\n\tvar t = this;\n t.el = el;\n\tt.videoButtons = el.querySelector('.js-video-button');\n\tt.modals = el.querySelector('.js-video-modal');\n\tt.buttonsClose = el.querySelector('.js-video-modal-close');\n\tt.overlaysClose = el.querySelector('.js-video-modal-overlay');\n\n\tif( t.videoButtons ) {\n\t\tt.videoButtons.addEventListener('click', function () {\n\t\t\tt.openModal();\n\t\t});\n\t}\n\n\tif( t.buttonsClose ) {\n\t\tt.buttonsClose.addEventListener('click', function () {\n\t\t\tt.closeModal();\n\t\t});\n\t}\n\n\tif( t.overlaysClose ) {\n\t\tt.overlaysClose.addEventListener('click', function () {\n\t\t\tt.closeModal();\n\t\t});\n\t}\n}\n\nPalisadesIntro.prototype.openModal = function () {\n\tvar t = this;\n\t$( t.modals ).addClass(\"video-modal--active\");\n};\n\nPalisadesIntro.prototype.closeModal = function () {\n\tvar t = this;\n\t$( t.modals ).removeClass('video-modal--active');\n};\n\nmodule.exports = PalisadesIntro;\n","/**\n* Initializes the site's PalisadesUnits module.\n* @constructor\n* @param {Object} el - The site's PalisadesUnits container element.\n*/\nvar Flickity = require('flickity-as-nav-for');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nfunction PalisadesUnits ( el ) {\n\tvar t = this;\n\tt.el = el;\n\tt.unitsNavEl = el.querySelector('.js-palisades-units-nav');\n\tt.unitItemCarouselEl = Array.prototype.slice.call(el.querySelectorAll(('.js-palisades-units-item-carousel')));\n\tt.unitsButtons = $('.js-palisades-units-button');\n\tt.unitsPrevButton = el.querySelector('.js-palisades-units-button-prev');\n\tt.unitsNextButton = el.querySelector('.js-palisades-units-button-next');\n\tt.unitItemActiveClass = 'palisades-units-item--active';\n\n\tif (t.unitItemCarouselEl.length) {\n\t\tt.unitItemCarouselEl.map(function (cell) {\n\t\t\tif (cell && cell.childElementCount > 1) {\n\t\t\t\tvar slider = new Flickity(cell, {\n\t\t\t\t\tcellAlign: 'center',\n\t\t\t\t\twrapAround: true,\n\t\t\t\t\tcontain: true,\n\t\t\t\t\tadaptiveHeight: true,\n\t\t\t\t\timagesLoaded: true,\n\t\t\t\t\tprevNextButtons: false,\n\t\t\t\t\tpageDots: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tvar count = t.unitsNavEl.childElementCount;\n\tif( t.unitsNavEl && t.unitsNavEl.childElementCount > 1 ) {\n\t\tvar navSlider = new Flickity( t.unitsNavEl, {\n\t\t\tcellAlign: 'center',\n\t\t\twrapAround: true,\n\t\t\tcontain: true,\n\t\t\tadaptiveHeight: true,\n\t\t\tdraggable: false,\n\t\t\tprevNextButtons: false,\n\t\t\tpageDots: false\n\t\t});\n\n\t\tnavSlider.on('change', function(index) {\n\t\t\tvar currentSelectedCarouselSelector = '.js-palisades-units-item-images-index-' + index;\n\t\t\t$('.js-palisades-units-item-images').removeClass(t.unitItemActiveClass);\n\t\t\t$(currentSelectedCarouselSelector).addClass(t.unitItemActiveClass);\n\t\t\tvar flkty = Flickity.data( $(currentSelectedCarouselSelector).find('.js-palisades-units-item-carousel')[0] );\n\t\t\tflkty.resize();\n\n\t\t\tif (index === 0) {\n\t\t\t\tt.unitsButtons.removeClass('disabled');\n\t\t\t\t$(t.unitsPrevButton).addClass('disabled');\n\t\t\t} else if (index === count-1) {\n\t\t\t\tt.unitsButtons.removeClass('disabled');\n\t\t\t\t$(t.unitsNextButton).addClass('disabled');\n\t\t\t} else {\n\t\t\t\tt.unitsButtons.removeClass('disabled');\n\t\t\t}\n\t\t});\n\n\t\t$(t.unitsPrevButton).click(function() {\n\t\t\tnavSlider.previous();\n\t\t});\n\n\t\t$(t.unitsNextButton).click(function() {\n\t\t\tnavSlider.next();\n\t\t});\n\t}\n}\n\nmodule.exports = PalisadesUnits;\n","function PromoPopup(el) {\n\t\tvar HIDDEN_CLASS = 'promo-popup__hidden';\n\t\tvar POPUP_OVERLAY_SELECTOR = '.js-promo-popup-overlay';\n\t\tvar BUTTON_CLOSE_POPUP_SELECTOR = '.js-promo-popup-close';\n\t\tvar SHOW_POPUP = false;\n\t\tvar POPUP_OPEN_TIME = null;\n\n\t\tvar checkPopupClosed = localStorage.getItem('closedPopup');\n\n\t\tif (checkPopupClosed) {\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t}\n\n\t\t// Delay 3 seconds because it's delayed in CSS\n\t\tsetTimeout(function () {\n\t\t\tSHOW_POPUP = checkPopupClosed === null;\n\t\t\tPOPUP_OPEN_TIME = new Date();\n\t\t}, 3000);\n\n\t\tvar closePromoPopup = function () {\n\t\t\tif (!SHOW_POPUP) { return false; }\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t\t\tlocalStorage.setItem('closedPopup', true);\n\t\t\t\tvar now = new Date();\n\t\t\t\tvar visibleTime = (now - POPUP_OPEN_TIME) / 1000;\n\t\t\t\tif (SHOW_POPUP && visibleTime) {\n\t\t\t\t\twindow.dataLayer = window.dataLayer || [];\n\t\t\t\t\twindow.dataLayer.push({'promo_popup_visible_time': visibleTime});\n\t\t\t\t}\n\t\t};\n\n\t\tvar popupOverlayElm = document.querySelector(POPUP_OVERLAY_SELECTOR);\n\n\t\tif (popupOverlayElm) {\n\t\t\t\tpopupOverlayElm.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n\t\tvar buttonClosePopup = document.querySelector(BUTTON_CLOSE_POPUP_SELECTOR);\n\t\tif (buttonClosePopup) {\n\t\t\t\tbuttonClosePopup.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n}\n\nmodule.exports = PromoPopup;\n","module.exports = function(el) {\n\tif (location.hash) {\n\t\tvar email = location.hash.replace('#', '');\n\t\treturn $.ajax({\n\t\t\ttype: 'GET',\n\t\t\turl: '/wp-json/crr/v1/queue/' + email,\n\t\t\tsuccess: function (res) {\n\t\t\t\tif (res && res.result) {\n\t\t\t\t\t$('body').addClass('is-queue');\n\t\t\t\t\t$('.js-email').text(email);\n\t\t\t\t\tif (res.result.first_name) {\n\t\t\t\t\t\t$('.js-first-name').text(res.result.first_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.last_name) {\n\t\t\t\t\t\t$('.js-last-name').text(res.result.last_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.wait_time){\n\t\t\t\t\t\t$('.js-wait').text(res.result.wait_time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(xhr) {\n\t\t\t\ttry {\n\t\t\t\t\tvar res = JSON.parse(xhr.responseText),\n\t\t\t\t\t\t$queueModal = $('.js-queue-modal'),\n\t\t\t\t\t\thtml = $queueModal.html().replace('%%', res.message);\n\n\t\t\t\t\t$queueModal.html(html).addClass('js-active');\n\t\t\t\t} catch (e) {\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataType: 'json',\n\t\t\tasync: true\n\t\t});\n\t}\n};\n","var DatePicker = require('modules/date-picker');\nvar SelectField = require('modules/select-field');\n\nfunction Reserve(el) {\n var t = this,\n\t\t\tselectComponent;\n\n t.el = el;\n t.dateClose = JSON.parse( t.el.getAttribute('data-close') );\n t.dateOpen = JSON.parse( t.el.getAttribute('data-open') );\n t.dataInterval = t.el.getAttribute('data-intervals');\n\tt.input = document.querySelector('[data-inputpicker]');\n\tt.alreadyInit = false;\n\tt.HOUR_IN_MINS = 60;\n\n\tif( !t.dataInterval ) {\n\t\tt.dataInterval = 0.5;\n\t} else {\n\t\tt.dataInterval = t.dataInterval;\n\t}\n\n\tif( t.dateOpen ) {\n\t\tt.generateTimeList();\n\t}\n\n\t// Update Select Field components\n\tvar selectEls = Array.prototype.slice.call( el.querySelectorAll('.js-reserve-field') );\n\tif( selectEls ) {\n\t\tselectEls.forEach( function(selectEl) {\n\t\t\tselectComponent = new SelectField( selectEl );\n\t\t\tif (selectEl.classList.contains('js-time-field')) {\n\t\t\t\tt.timeSelectComponent = selectComponent;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (t.input) {\n\t\tt.updateTimePicker();\n\t\tt.input.addEventListener('change', this.updateTimePicker.bind(this));\n\n\t\tt.datePicker = new DatePicker(t.input, {\n\t\t\t 'disabled': t.dateClose ? t.dateClose : []\n\t\t});\n\t}\n}\n\nReserve.prototype.updateTimePicker = function () {\n\tvar t = this;\n\tvar date = new Date(t.input.value);\n\tif ( date ) {\n\t\tt.changeTimeRange( date.getDay() );\n\t}\n};\n\nReserve.prototype.generateTimeList = function() {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tvar time = t.dateOpen[i].time;\n\t\tif( time && time.start && time.end ) {\n\t\t\tvar timeStart = t.convertTime( time.start ),\n\t\t\t\ttimeEnd = t.convertTime( time.end ),\n\t\t\t\tintervals = parseFloat(t.dataInterval) * t.HOUR_IN_MINS;\n\n\t\t\tvar timeRange = t.getTimeRange(timeStart, timeEnd, intervals);\n\t\t\tt.dateOpen[i].items = timeRange;\n\t\t}\n\t}\n};\n\nReserve.prototype.convertTime = function(string) {\n\tvar t = this,\n\t\t\tarr = string.split(':'),\n\t\t\thour = parseInt(arr[0]) * t.HOUR_IN_MINS,\n\t\t\tminute = parseInt(arr[1]);\n\treturn hour + minute;\n};\n\nReserve.prototype.parseTime = function(number) {\n\tvar hour = Math.floor(number / 60),\n\t\t\toffset = 'am',\n\t\t\tminute = number % 60;\n\n\tif (hour % 12 === 0) {\n\t\toffset = hour / 12 === 1 ? 'pm' : 'am';\n\t\thour = 12;\n\t} else if (hour > 12) {\n\t\thour = hour % 12;\n\t\toffset = \"pm\";\n\t}\n\n\tif (hour < 10) {\n\t\thour = '0' + hour;\n\t}\n\n\tif (minute < 10) {\n\t\tminute = '0' + minute;\n\t}\n\n\treturn hour + ':' + minute + offset;\n};\n\nReserve.prototype.getTimeRange = function(start, end, interval) {\n\tvar t = this,\n\t\t\trange = [];\n\twhile( start <= end ) {\n\t\trange.push( t.parseTime(start) );\n\t\tstart += interval;\n\t}\n\treturn range;\n};\n\nReserve.prototype.getMatchingTimeRange = function(dayIndex) {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tif( dayIndex === t.dateOpen[i].day ) {\n\t\t\treturn t.dateOpen[i].items;\n\t\t}\n\t}\n};\n\nReserve.prototype.generateSelectFieldDropdown = function(arr) {\n\tvar list = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\tlist += '
  • ' + arr[i] + '
  • ';\n\t}\n\treturn list ;\n};\n\nReserve.prototype.generateSelectFieldNative = function(arr) {\n\tvar options = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\toptions += '';\n\t}\n\treturn options;\n};\n\nReserve.prototype.changeTimeRange = function(dayIndex) {\n\tvar t = this,\n\t\ttimeRange = t.getMatchingTimeRange( dayIndex),\n\t\tdesktopList = t.generateSelectFieldDropdown(timeRange),\n\t\tmobileList = t.generateSelectFieldNative(timeRange),\n\t\ttimeField = t.el.querySelector('.js-time-field');\n\n\tif( timeField && timeRange ) {\n\t\t// Append new time range\n\t\ttimeField.querySelector('[data-field-desktop]').innerHTML = desktopList;\n\t\ttimeField.querySelector('[data-field-mobile]').innerHTML = mobileList;\n\n\t\tt.timeSelectComponent.selectFirstItem();\n\t}\n};\n\nmodule.exports = Reserve;\n","function RestaurantCardList(el) {\n\tvar $hidden_class = 'restaurant-card-list--hidden';\n\tvar $services_filter_name = 'services';\n\t$('body').on('custom-filter', function (e, data) {\n\t\tif (data.value === $services_filter_name && data.count > 0) {\n\t\t\t$(el).removeClass($hidden_class);\n\t\t} else {\n\t\t\t$(el).addClass($hidden_class);\n\t\t}\n\t});\n}\nmodule.exports = RestaurantCardList;\n","var SelectField = require('modules/select-field');\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction RewardsRegister(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.dateField = t.el.querySelector('.js-date');\n\tt.timeSelect = null;\n\n\tif (! t.dateField) {\n\t\treturn;\n\t}\n\tt.timeField = t.el.querySelector('.js-time');\n\n\tif (! t.timeField) {\n\t\treturn;\n\t}\n\n\tt.timeFieldSelect = t.timeField.querySelector('[data-field-mobile]');\n\tt.timeFieldName = t.timeField.querySelector('[data-field-mobile]').name;\n\n\tt.populateTimeField();\n\n\tt.dateField.addEventListener('change', t.populateTimeField.bind(t));\n}\n\nRewardsRegister.prototype.populateTimeField = function () {\n\tvar t = this;\n\tvar date = t.dateField.value;\n\n\t$.ajax({\n\t\ttype: 'GET',\n\t\turl: '/wp-json/crr/v2/slots/' + date,\n\t\tsuccess: function(data) {\n\t\t\tt.timeField.innerHTML = '';\n\n\t\t\tif (data) {\n\t\t\t\tvar list = [];\n\t\t\t\tObject.keys(data.slots).map(function(time) {\n\t\t\t\t\tvar slot = data.slots[time];\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tvalue: time,\n\t\t\t\t\t\ttext: slot\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tt.generateFieldData( list, data.selected );\n\t\t\t}\n\t\t},\n\t\tdataType: 'json'\n\t});\n};\n\nRewardsRegister.prototype.generateBlankFields = function() {\n\tvar t = this;\n\tvar markup = document.createElement('div');\n\tmarkup.className = 'select-field';\n\tmarkup.innerHTML = '
    Time (Select date first)
    ';\n\tt.timeField.appendChild(markup);\n};\n\nRewardsRegister.prototype.generateFieldData = function( arr, selected ) {\n\tvar t = this;\n\n\tt.generateBlankFields();\n\tt.populateMobileFields( arr, t.timeField.querySelector('.select-field__mobile') );\n\tt.populateDesktopFields( arr, t.timeField.querySelector('.select-field__desktop') );\n\n\tvar selectFieldEl = t.timeField.querySelector('.select-field');\n\n\tif (t.timeSelect) {\n\t\tt.timeSelect.destroy();\n\t}\n\n\tt.timeSelect = new SelectField(selectFieldEl);\n\tif (selected) {\n\t\tt.timeSelect.fieldMobile.value = selected;\n\t}\n\n\tif (arr.length) {\n\t\tt.timeSelect.selectFirstItem();\n\t}\n};\n\nRewardsRegister.prototype.populateDesktopFields = function( arr, target) {\n\tvar t = this;\n\tvar list = document.createElement('ul');\n\tlist.className = 'caption c-secondary-brand select-field__dropdown';\n\tlist.setAttribute('data-field-desktop', '');\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('li');\n\t\topt.setAttribute('data-value', item.value);\n\t\topt.textContent = item.text;\n\t\topt.className = 'select-field__dropdown-item';\n\t\tlist.appendChild(opt);\n\t});\n\ttarget.appendChild(list);\n};\n\nRewardsRegister.prototype.populateMobileFields = function( arr, target ) {\n\tvar t = this;\n\tvar select = document.createElement('select');\n\tselect.className = 'caption c-secondary-brand js-field-mobile';\n\tselect.setAttribute('data-field-mobile', '');\n\tselect.name = t.timeFieldName;\n\tselect.required = true;\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('option');\n\t\topt.value = item.value;\n\t\topt.textContent = item.text;\n\t\tselect.appendChild(opt);\n\n\t});\n\ttarget.appendChild( select );\n};\n\nmodule.exports = RewardsRegister;\n","function RSVP(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.body = document.body;\n\tt.content = el.querySelector('.js-rsvp-content');\n\tt.activeButton = document.querySelector('.js-rsvp-open');\n\tt.overlay = document.querySelector('.js-rsvp-overlay');\n\n\tif( t.activeButton ) {\n\t\tt.activeButton.addEventListener('click', function() {\n\t\t\tt.body.classList.add('js-rsvp-active');\n\t\t});\n\t}\n\n\tt.overlay.addEventListener('click', function() {\n\t\tt.body.classList.remove('js-rsvp-active');\n\t});\n\n}\nmodule.exports = RSVP;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction SearchForm(el) {\n var t = this;\n\n t.$el = $(el);\n t.$document = $(document);\n t.$html = $('html');\n t.$closeIcon = t.$el.find('.js-search-disable');\n t.$input = t.$el.find('.js-search-form-input');\n\n // Focus to input if search form is active\n t.$html.on('searchActive', function() {\n t.$input.focus();\n });\n\n // Close modal on click to close icon or press escape\n t.$closeIcon.on('click', function() {\n t.close();\n });\n\n t.$document.on('keyup', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 27) {\n if (t.isOpen()) {\n t.close();\n e.stopPropagation();\n }\n }\n });\n\n\tvar search_message = $('.js-search-message');\n\n\tif (!search_message.length && $('.js-search-form')[0]) {\n\t\t$('.js-search-form')[0].focus();\n\t}\n}\n\nSearchForm.prototype.isOpen = function() {\n return this.$html.hasClass('js-search-active');\n};\n\nSearchForm.prototype.open = function() {\n this.$html.addClass('js-search-active').trigger('searchActive');\n};\n\nSearchForm.prototype.close = function() {\n this.$html.removeClass('js-search-active').trigger('searchInactive');\n};\n\nmodule.exports = SearchForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction SearchResults(el) {\n var $el = $(el);\n\n var resultsEmpty = $el.find('.js-search-results-empty');\n var resultsList = $el.find('.js-search-results-list');\n var buttonDidYouMean = $el.find('.js-did-you-mean');\n var searchBottom = $el.find('.js-search-bottom');\n\n var searchHeader = resultsList.find('.js-search-header');\n var searchFavoriteGroup = resultsList.find('.search-results__favorite-group');\n var cardSimple = resultsList.find('.card-simple');\n var search_message = $('.js-search-result');\n\n if (search_message.length && search_message[0]) {\n search_message[0].focus();\n }\n\n if (resultsList) {\n resultsEmpty.hide();\n }\n\n if (buttonDidYouMean.length > 0) {\n searchHeader.hide();\n searchBottom.hide();\n searchFavoriteGroup.hide();\n cardSimple.hide();\n resultsEmpty.show();\n }\n}\n\nmodule.exports = SearchResults;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction SelectField(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.$el = $(el);\n\tt.fieldMobile = t.el.querySelector('[data-field-mobile]');\n\tt.fieldDesktop = t.el.querySelector('[data-field-desktop]');\n\tt.fieldCurrent = t.el.querySelector('[data-field-current]');\n\tt.isRedirect = t.el.getAttribute('data-select-field-redirect');\n\n\tt.onClickActive = function () {\n\t\tif (!t.isActive()) {\n\t\t\tvar data = t.fieldMobile.value;\n\t\t\tvar activeItem = $(t.fieldDesktop).find('[data-value=\"' + data + '\"]');\n\t\t\t$(t.fieldDesktop).find('.select-field__dropdown-item').removeClass('active').removeAttr('id');\n\t\t\tactiveItem.addClass('active').attr('id', 'selected-option');\n\t\t}\n\n\t\tt.el.classList.toggle('select-field--active');\n\t};\n\n\tt.onSelectDesktop = function (e) {\n\t\tif (e.keyCode === 13 || !e.keyCode) {\n\t\t\tvar data = this.getAttribute('data-value');\n\t\t\tt.removeSelectActive();\n\t\t\tthis.classList.add('active');\n\t\t\tthis.setAttribute('id','selected-option');\n\t\t\tt.fieldCurrent.innerHTML = this.innerHTML;\n\t\t\tt.fieldMobile.value = data;\n\t\t\tif (t.callback) {\n\t\t\t\tt.callback(t.fieldMobile.value);\n\t\t\t}\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.onSelectMobile = function () {\n\t\tvar data = this.value,\n\t\t\tcurrentItem = t.fieldMobile.querySelector('[value=\"' + data + '\"]');\n\t\tt.fieldCurrent.innerHTML = currentItem.innerHTML;\n\t\tt.removeSelectActive();\n\t\tt.fieldDesktop.querySelector('[data-value=\"' + data + '\"]').classList.add('active');\n\t\tif (t.callback) {\n\t\t\tt.callback(t.fieldMobile.value);\n\t\t}\n\n\t\tif (t.isRedirect) {\n\t\t\tlocation.href = data;\n\t\t}\n\t};\n\n\tt.onClickOutside = function (e) {\n\t\tif (!e.target.hasAttribute('data-field-current') && e.target != t.fieldMobile || e.target != t.fieldCurrent && e.target != t.fieldMobile) {\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.keyboardHandlers = function (e) {\n\t\tvar key = e.which || e.keyCode,\n\t\t\tactiveItem, $activeItem, $prevItem, $nextItem, $dropdown, index, add;\n\n\t\tswitch (key) {\n\t\t\tcase (32 || 13): // space\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\n\t\t\t\tbreak;\n\t\t\tcase 27: // escape\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 38: // up\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$prevItem = $activeItem.prev();\n\n\t\t\t\t\tif ($prevItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$prevItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($prevItem);\n\t\t\t\t\t\tadd = ($prevItem.outerHeight(true) - $prevItem.outerHeight()) / 2 * index;\n\n\t\t\t\t\t\tif ($dropdown.scrollTop() > $prevItem.position().top + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($prevItem.position().top + add);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase (40): // down\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$nextItem = $activeItem.next();\n\n\t\t\t\t\tif ($nextItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$nextItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($nextItem);\n\t\t\t\t\t\tadd = ($nextItem.outerHeight(true) - $nextItem.outerHeight()) * index;\n\n\t\t\t\t\t\tif ($dropdown.height() < $nextItem.position().top + $nextItem.outerHeight(true) + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($nextItem.position().top + $nextItem.outerHeight(true) + add - $dropdown.outerHeight(true));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 13: // enter\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tif (t.fieldMobile && t.fieldDesktop && t.fieldCurrent) {\n\t\tt.dropdownItems = Array.prototype.slice.call(t.fieldDesktop.querySelectorAll('li'));\n\t\t// If not placeholder then select first item\n\t\tif (t.fieldCurrent.innerHTML === '') {\n\t\t\tt.selectFirstItem();\n\t\t}\n\n\t\t// Add active state to field group\n\t\tt.activeState();\n\n\t\t// Close Drop down when click outside\n\t\tt.clickOutside();\n\n\t\t// If select on desktop\n\t\tt.selectDesktop();\n\n\t\t// If select on mobile\n\t\tt.selectMobile();\n\n\t\t// Keyboard accessibility\n\t\tt.keyboardAccessible();\n\t}\n}\n\nSelectField.prototype.getName = function() {\n\treturn this.fieldMobile.name;\n};\n\nSelectField.prototype.selectFirstItem = function() {\n\tvar t = this,\n\t\tselectedItem = t.fieldDesktop.querySelector('li:first-child');\n\n\tif (t.fieldMobile.value) {\n\t\tselectedItem = t.fieldDesktop.querySelector('li[data-value=\"' + t.fieldMobile.value + '\"]');\n\t} else if (selectedItem) {\n\t\tt.fieldMobile.value = selectedItem.getAttribute('data-value');\n\t}\n\n\tif (selectedItem) {\n\t\tt.fieldCurrent.innerHTML = selectedItem.innerHTML;\n\t}\n};\n\nSelectField.prototype.activeState = function() {\n\tvar t = this;\n\tt.fieldCurrent.addEventListener('click', t.onClickActive);\n};\n\nSelectField.prototype.selectDesktop = function() {\n\tvar t = this;\n\tt.$el.on('click keydown', '.select-field__dropdown-item', t.onSelectDesktop);\n};\n\nSelectField.prototype.selectMobile = function() {\n\tvar t = this;\n\tt.fieldMobile.addEventListener('change', t.onSelectMobile);\n};\n\nSelectField.prototype.removeSelectActive = function() {\n\tvar t = this;\n\tt.dropdownItems.forEach(function (otherItem) {\n\t\totherItem.classList.remove('active');\n\t\totherItem.removeAttribute('id');\n\t});\n};\n\nSelectField.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', t.onClickOutside);\n};\n\nSelectField.prototype.onChange = function(callback) {\n\tthis.callback = callback;\n};\n\nSelectField.prototype.isActive = function() {\n\treturn this.$el.hasClass('select-field--active');\n};\n\nSelectField.prototype.keyboardAccessible = function() {\n\tthis.fieldCurrent.addEventListener('keydown', this.keyboardHandlers);\n};\n\nSelectField.prototype.destroy = function () {\n\tvar t = this;\n\tt.fieldCurrent.removeEventListener('click', t.onClickActive);\n\tt.$el.off('click', '.select-field__dropdown-item', t.onSelectDesktop);\n\tt.fieldMobile.removeEventListener('change', t.onSelectMobile);\n\tdocument.removeEventListener('click', t.onClickOutside);\n\n\tt.el = null;\n\tt.$el = null;\n\tt.fieldMobile = null;\n\tt.fieldDesktop = null;\n\tt.fieldCurrent = null;\n\tt.callback = null;\n\tt.dropdownItems = null;\n};\n\nmodule.exports = SelectField;\n","function Sidebar(el) {\n var location = window.location.href;\n var url = new URL(location);\n var ref = url.searchParams.get('ref');\n\n if (ref === 'sidebar') {\n var main = document.querySelector('.blog-wrapper__main');\n\n if (main) {\n main.scrollIntoView();\n }\n }\n}\n\nmodule.exports = Sidebar;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null)\n\nfunction Subscribe (el) {\n\tvar formEl = $('.js-subscribe-form')\n\tvar msgEl = $('.js-subscribe-form-msg')\n\tvar inputEmail = el.querySelector('input[type=\"email\"]')\n\tvar inputFirstName = el.querySelector('input[name=\"first_name\"]')\n\tvar inputLastName = el.querySelector('input[name=\"last_name\"]')\n\tvar thankYouPage = el.dataset.thankYouPage\n\n\tformEl.on('submit', function (e) {\n\t\te.preventDefault()\n\n\t\tif (inputEmail.validity.typeMismatch || inputEmail.validity.valueMissing) {\n\t\t\tinputEmail.reportValidity()\n\t\t}\n\n\t\tif (inputFirstName.validity.typeMismatch || inputFirstName.validity.valueMissing) {\n\t\t\tinputFirstName.reportValidity()\n\t\t}\n\n\t\tif (inputLastName.validity.typeMismatch || inputLastName.validity.valueMissing) {\n\t\t\tinputLastName.reportValidity()\n\t\t}\n\n\t\tmsgEl.removeClass('is-error')\n\t\tmsgEl.removeClass('is-success')\n\n\t\tvar ajaxUrl = formEl.attr('action')\n\n\t\tif (inputEmail) {\n\t\t\t$.ajax({\n\t\t\t\ttype: 'POST',\n\t\t\t\theaders: {'Content-Type': 'application/x-www-form-urlencoded'},\n\t\t\t\tcontentType: 'application/x-www-form-urlencoded; charset=utf-8',\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: ajaxUrl,\n\t\t\t\tdata: formEl.serialize(),\n\t\t\t\tsuccess: function (res) {\n\t\t\t\t\tif (res.code == 4001 || res.code == 4002 || res.code == 4400) {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (res.success) {\n\t\t\t\t\t\tif (thankYouPage) {\n\t\t\t\t\t\t\tlocation.href = thankYouPage\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmsgEl.addClass('is-success')\n\t\t\t\t\t\t\tmsgEl.html('Subscribe success.')\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn false\n\t\t}\n\t})\n}\n\nmodule.exports = Subscribe\n","var TIMER_SELECTOR = '.js-timer';\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Timer(el) {\n\tvar $el = $(el);\n\tvar $timer = $el.find(TIMER_SELECTOR);\n\tvar expire = $el.data('timer');\n\tvar interval = null\n\n\tif (expire) {\n\t\tinterval = setInterval(function() {\n\t\t\tvar now = Math.ceil(Date.now() / 1000);\n\t\t\tvar remaining = expire - now;\n\t\t\tvar seconds = remaining % 60;\n\t\t\tvar minutes = Math.floor(remaining / 60);\n\n\t\t\tif (seconds < 10) {\n\t\t\t\tseconds = '0' + seconds;\n\t\t\t}\n\n\t\t\tif ( minutes < 10) {\n\t\t\t\tminutes = '0' + minutes;\n\t\t\t}\n\n\t\t\t$timer.text(minutes + ':' + seconds);\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tinterval = null;\n\t\t\t\twindow.location = window.location.href;\n\t\t\t}\n\t\t}, 1000);\n\t}\n}\n\nmodule.exports = Timer;\n","var shave = require('shave');\n\nfunction Truncate( el ) {\n\tvar maxHeight = el.getAttribute('data-max-height');\n\tvar maxHeightNumber = ( maxHeight ) ? maxHeight : 60;\n\tshave( el, maxHeightNumber );\n}\n\nmodule.exports = Truncate;\n","function TwoUpRows(el) {\n function inViewPort() {\n var rect = el.getBoundingClientRect();\n return ( rect.top - innerHeight < 0 ) && ( ( rect.top + rect.height ) > 0 );\n }\n window.addEventListener('scroll', function () {\n if( inViewPort() ) {\n el.classList.add('two-up-rows--animate');\n }\n })\n}\n\nmodule.exports = TwoUpRows;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\nvar BREAK_POINT = 1024;\n\nfunction VideoBackground(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tvar videos = $('.video-background iframe');\n\n\tif (videos.length) {\n\t\tt.YoutubeVideo(videos);\n\t}\n\n\tif ($(el).length) {\n\t\tt.playVideo(el);\n\t}\n\n\twindow.addEventListener( 'resize', throttle(function() {\n\t\tt.YoutubeVideo(videos);\n\t\tt.playVideo(el);\n\t}, 100));\n}\n\nVideoBackground.prototype.playVideo = function(videos) {\n\tif ($(videos).length && window.innerWidth >= BREAK_POINT) {\n\t\t$(videos).each( function() {\n\t\t\t$(this).get(0).play();\n\t\t\t$(this).show();\n\t\t});\n\t} else {\n\t\t$(videos).each( function() {\n\t\t\t$(this).get(0).pause();\n\t\t\t$(this).hide();\n\t\t});\n\t}\n};\n\nVideoBackground.prototype.YoutubeVideo = function(videos) {\n\tif (videos.length && window.innerWidth >= BREAK_POINT) {\n\t\tvideos.each( function() {\n\t\t\t$(this)[0].contentWindow.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n\t\t\t$(this).parent().show();\n\t\t});\n\t} else {\n\t\tvideos.each( function() {\n\t\t\t$(this)[0].contentWindow.postMessage('{\"event\":\"command\",\"func\":\"' + 'stopVideo' + '\",\"args\":\"\"}', '*');\n\t\t\t$(this).parent().hide();\n\t\t});\n\t}\n};\n\nmodule.exports = VideoBackground;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Video(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$video = t.$el.find('.js-video-modal-video iframe');\n\tif (t.$el.hasClass('js-video-modal')) {\n\t\tt.$modal = t.$el;\n\t} else {\n\t\tt.$modal = t.$el.find('.js-video-modal');\n\t}\n\tt.index = t.$modal.data('modal');\n\tt.$iconClose = $('[data-modal-close=\"' + t.index + '\"]');\n\tt.$overlayClose = t.$el.find('.js-video-modal-overlay');\n\tt.$videoInner = $('[data-modal-target=\"' + t.index + '\"]');\n\n\tt.$videoInner.on('click', function (e) {\n\t\te.preventDefault();\n\t\tt.openModal();\n\t});\n\n\tt.$iconClose.on('click', function (e) {\n\t\te.preventDefault();\n\t\tt.closeModal();\n\t});\n}\n\n\nVideo.prototype.openModal = function () {\n\tvar t = this;\n\tt.$modal.addClass('video-modal--active');\n};\n\nVideo.prototype.closeModal = function () {\n\tvar t = this;\n\tt.$modal.removeClass('video-modal--active');\n\tt.$video.attr('src', t.$video.attr('src'));\n\n\t$(document).ready(function() {\n\t\t$('.js-video-mp4').each(function(){\n\t\t\t$(this).get(0).pause();\n\t\t});\n\t});\n};\n\nmodule.exports = Video;\n","var Flickity = require('flickity');\n\nfunction VisitCarousel(el) {\n var t = this;\n\n t.slider = el.querySelector('.js-visit-carousel');\n\n if( t.slider && t.slider.childElementCount > 1 ) {\n var slider = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: true,\n prevNextButtons: true,\n pageDots: true,\n setGallerySize: true,\n autoPlay: 5000\n } );\n }\n\n}\n\nmodule.exports = VisitCarousel;\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( 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 * 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( 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\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.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\nproto.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\nproto.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\nproto.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\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\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( [\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'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.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\nutils.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\nutils.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\nutils.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' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.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\nutils.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\nutils.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/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar 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 */\nutils.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\nreturn utils;\n\n}));\n","/*!\n * Flickity asNavFor v2.0.1\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( [\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'use strict';\n\n// -------------------------- asNavFor prototype -------------------------- //\n\n// Flickity.defaults.asNavFor = null;\n\nFlickity.createMethods.push('_createAsNavFor');\n\nvar proto = Flickity.prototype;\n\nproto._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\nproto.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\nproto.navCompanionSelect = function( isInstant ) {\n if ( !this.navCompanion ) {\n return;\n }\n // select slide that matches first cell of slide\n var selectedCell = this.navCompanion.selectedCells[0];\n var firstIndex = this.navCompanion.cells.indexOf( selectedCell );\n var lastIndex = firstIndex + this.navCompanion.selectedCells.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\nfunction lerp( a, b, t ) {\n return ( b - a ) * t + a;\n}\n\nproto.changeNavSelectedClass = function( method ) {\n this.navSelectedElements.forEach( function( navElem ) {\n navElem.classList[ method ]('is-nav-selected');\n });\n};\n\nproto.activateAsNavFor = function() {\n this.navCompanionSelect( true );\n};\n\nproto.removeNavSelectedElements = function() {\n if ( !this.navSelectedElements ) {\n return;\n }\n this.changeNavSelectedClass('remove');\n delete this.navSelectedElements;\n};\n\nproto.onNavStaticClick = function( event, pointer, cellElement, cellIndex ) {\n if ( typeof cellIndex == 'number' ) {\n this.navCompanion.selectCell( cellIndex );\n }\n};\n\nproto.deactivateAsNavFor = function() {\n this.removeNavSelectedElements();\n};\n\nproto.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\nreturn Flickity;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\n// append cells to a document fragment\nfunction 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\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.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\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.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 */\nproto.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 */\nproto.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\nreturn Flickity;\n\n}));\n","// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.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\nproto.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 = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.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 tranforms 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\nproto.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\nproto.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\nproto.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\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\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\nproto.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\nproto._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\nproto._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\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.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\nproto.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\nreturn proto;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.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};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.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\nproto.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\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._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 // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {});\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.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\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.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\nproto._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\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._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\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.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\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.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\nproto.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\nproto.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 = 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\nproto.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\nproto.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 */\nproto._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( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\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\n * @param {Integer} index - slide index\n */\nproto.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\nproto.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\nproto.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\nproto.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\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction 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\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction 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 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\nFlickity.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()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._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\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.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\nproto._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\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.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 or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._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\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.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 */\nproto._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\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.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\nproto._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 return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar 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\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.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\nproto._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\nproto._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\nproto._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 */\nproto.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 = 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 */\nproto.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\nproto._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\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.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\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.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 or Number} elem\n */\nproto.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\nproto.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\n * @returns {Flickity.Cell} item\n */\nproto.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\n * @returns {Array} cells - Flickity.Cells\n */\nproto.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 */\nproto.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\n * @returns {Flickit.Cell} cell\n */\nproto.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 */\nproto.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, Selector String, or Number} selector\n */\nproto.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\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.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\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\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\nproto.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\nproto.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\nFlickity.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\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#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\nproto.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\nproto.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\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.2.1\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-2019 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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 /*jshint strict: false*/\n return Flickity;\n});\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.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\nfunction 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 */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.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\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.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\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.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\nPageDots.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\nPageDots.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\nPageDots.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\nPageDots.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\nPageDots.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\nPageDots.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\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.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\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._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\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction 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\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.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\nPlayer.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\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.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\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._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\nproto.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\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.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\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\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\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.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\nPrevNextButton.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\nPrevNextButton.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\nPrevNextButton.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\nfunction 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\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.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\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.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\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.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\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._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\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 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\nfunction 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\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\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\nproto.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\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n });\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\nreturn Slide;\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( 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\nfunction 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\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar 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\nvar measurementsLength = measurements.length;\n\nfunction 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 */\nfunction 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\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction 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\nfunction 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\nreturn getSize;\n\n});\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n","/**\n shave - Shave is a javascript plugin that truncates multi-line text within a html element based on set max height\n @version v2.5.4\n @link https://github.com/dollarshaveclub/shave#readme\n @author Jeff Wainwright (jeffry.in)\n @license MIT\n**/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.shave = factory());\n}(this, function () { 'use strict';\n\n function shave(target, maxHeight) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!maxHeight) throw Error('maxHeight is required');\n var els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!els) return;\n var character = opts.character || '…';\n var classname = opts.classname || 'js-shave';\n var spaces = typeof opts.spaces === 'boolean' ? opts.spaces : true;\n var charHtml = \"\".concat(character, \"\");\n if (!('length' in els)) els = [els];\n\n for (var i = 0; i < els.length; i += 1) {\n var el = els[i];\n var styles = el.style;\n var span = el.querySelector(\".\".concat(classname));\n var textProp = el.textContent === undefined ? 'innerText' : 'textContent'; // If element text has already been shaved\n\n if (span) {\n // Remove the ellipsis to recapture the original text\n el.removeChild(el.querySelector('.js-shave-char'));\n el[textProp] = el[textProp]; // eslint-disable-line\n // nuke span, recombine text\n }\n\n var fullText = el[textProp];\n var words = spaces ? fullText.split(' ') : fullText; // If 0 or 1 words, we're done\n\n if (words.length < 2) continue; // Temporarily remove any CSS height for text height calculation\n\n var heightStyle = styles.height;\n styles.height = 'auto';\n var maxHeightStyle = styles.maxHeight;\n styles.maxHeight = 'none'; // If already short enough, we're done\n\n if (el.offsetHeight <= maxHeight) {\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n continue;\n } // Binary search for number of words which can fit in allotted height\n\n\n var max = words.length - 1;\n var min = 0;\n var pivot = void 0;\n\n while (min < max) {\n pivot = min + max + 1 >> 1; // eslint-disable-line no-bitwise\n\n el[textProp] = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);\n el.insertAdjacentHTML('beforeend', charHtml);\n if (el.offsetHeight > maxHeight) max = spaces ? pivot - 1 : pivot - 2;else min = pivot;\n }\n\n el[textProp] = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);\n el.insertAdjacentHTML('beforeend', charHtml);\n var diff = spaces ? \" \".concat(words.slice(max).join(' ')) : words.slice(max);\n var shavedText = document.createTextNode(diff);\n var elWithShavedText = document.createElement('span');\n elWithShavedText.classList.add(classname);\n elWithShavedText.style.display = 'none';\n elWithShavedText.appendChild(shavedText);\n el.insertAdjacentElement('beforeend', elWithShavedText);\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n }\n }\n\n return shave;\n\n}));\n","var SvgPanZoom = require(\"./svg-pan-zoom.js\");\n\nmodule.exports = SvgPanZoom;\n","var SvgUtils = require(\"./svg-utilities\");\n\nmodule.exports = {\n enable: function(instance) {\n // Select (and create if necessary) defs\n var defs = instance.svg.querySelector(\"defs\");\n if (!defs) {\n defs = document.createElementNS(SvgUtils.svgNS, \"defs\");\n instance.svg.appendChild(defs);\n }\n\n // Check for style element, and create it if it doesn't exist\n var styleEl = defs.querySelector(\"style#svg-pan-zoom-controls-styles\");\n if (!styleEl) {\n var style = document.createElementNS(SvgUtils.svgNS, \"style\");\n style.setAttribute(\"id\", \"svg-pan-zoom-controls-styles\");\n style.setAttribute(\"type\", \"text/css\");\n style.textContent =\n \".svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }\";\n defs.appendChild(style);\n }\n\n // Zoom Group\n var zoomGroup = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomGroup.setAttribute(\"id\", \"svg-pan-zoom-controls\");\n zoomGroup.setAttribute(\n \"transform\",\n \"translate(\" +\n (instance.width - 70) +\n \" \" +\n (instance.height - 76) +\n \") scale(0.75)\"\n );\n zoomGroup.setAttribute(\"class\", \"svg-pan-zoom-control\");\n\n // Control elements\n zoomGroup.appendChild(this._createZoomIn(instance));\n zoomGroup.appendChild(this._createZoomReset(instance));\n zoomGroup.appendChild(this._createZoomOut(instance));\n\n // Finally append created element\n instance.svg.appendChild(zoomGroup);\n\n // Cache control instance\n instance.controlIcons = zoomGroup;\n },\n\n _createZoomIn: function(instance) {\n var zoomIn = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomIn.setAttribute(\"id\", \"svg-pan-zoom-zoom-in\");\n zoomIn.setAttribute(\"transform\", \"translate(30.5 5) scale(0.015)\");\n zoomIn.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomIn.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n zoomIn.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n\n var zoomInBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomInBackground.setAttribute(\"x\", \"0\");\n zoomInBackground.setAttribute(\"y\", \"0\");\n zoomInBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomInBackground.setAttribute(\"height\", \"1400\");\n zoomInBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomIn.appendChild(zoomInBackground);\n\n var zoomInShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomInShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z\"\n );\n zoomInShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomIn.appendChild(zoomInShape);\n\n return zoomIn;\n },\n\n _createZoomReset: function(instance) {\n // reset\n var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, \"g\");\n resetPanZoomControl.setAttribute(\"id\", \"svg-pan-zoom-reset-pan-zoom\");\n resetPanZoomControl.setAttribute(\"transform\", \"translate(5 35) scale(0.4)\");\n resetPanZoomControl.setAttribute(\"class\", \"svg-pan-zoom-control\");\n resetPanZoomControl.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n resetPanZoomControl.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n\n var resetPanZoomControlBackground = document.createElementNS(\n SvgUtils.svgNS,\n \"rect\"\n ); // TODO change these background space fillers to rounded rectangles so they look prettier\n resetPanZoomControlBackground.setAttribute(\"x\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"y\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"width\", \"182\"); // larger than expected because the whole group is transformed to scale down\n resetPanZoomControlBackground.setAttribute(\"height\", \"58\");\n resetPanZoomControlBackground.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-background\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlBackground);\n\n var resetPanZoomControlShape1 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"d\",\n \"M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape1);\n\n var resetPanZoomControlShape2 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"d\",\n \"M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape2);\n\n return resetPanZoomControl;\n },\n\n _createZoomOut: function(instance) {\n // zoom out\n var zoomOut = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomOut.setAttribute(\"id\", \"svg-pan-zoom-zoom-out\");\n zoomOut.setAttribute(\"transform\", \"translate(30.5 70) scale(0.015)\");\n zoomOut.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomOut.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n zoomOut.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n\n var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomOutBackground.setAttribute(\"x\", \"0\");\n zoomOutBackground.setAttribute(\"y\", \"0\");\n zoomOutBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomOutBackground.setAttribute(\"height\", \"1400\");\n zoomOutBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomOut.appendChild(zoomOutBackground);\n\n var zoomOutShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomOutShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z\"\n );\n zoomOutShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomOut.appendChild(zoomOutShape);\n\n return zoomOut;\n },\n\n disable: function(instance) {\n if (instance.controlIcons) {\n instance.controlIcons.parentNode.removeChild(instance.controlIcons);\n instance.controlIcons = null;\n }\n }\n};\n","var SvgUtils = require(\"./svg-utilities\"),\n Utils = require(\"./utilities\");\n\nvar ShadowViewport = function(viewport, options) {\n this.init(viewport, options);\n};\n\n/**\n * Initialization\n *\n * @param {SVGElement} viewport\n * @param {Object} options\n */\nShadowViewport.prototype.init = function(viewport, options) {\n // DOM Elements\n this.viewport = viewport;\n this.options = options;\n\n // State cache\n this.originalState = { zoom: 1, x: 0, y: 0 };\n this.activeState = { zoom: 1, x: 0, y: 0 };\n\n this.updateCTMCached = Utils.proxy(this.updateCTM, this);\n\n // Create a custom requestAnimationFrame taking in account refreshRate\n this.requestAnimationFrame = Utils.createRequestAnimationFrame(\n this.options.refreshRate\n );\n\n // ViewBox\n this.viewBox = { x: 0, y: 0, width: 0, height: 0 };\n this.cacheViewBox();\n\n // Process CTM\n var newCTM = this.processCTM();\n\n // Update viewport CTM and cache zoom and pan\n this.setCTM(newCTM);\n\n // Update CTM in this frame\n this.updateCTM();\n};\n\n/**\n * Cache initial viewBox value\n * If no viewBox is defined, then use viewport size/position instead for viewBox values\n */\nShadowViewport.prototype.cacheViewBox = function() {\n var svgViewBox = this.options.svg.getAttribute(\"viewBox\");\n\n if (svgViewBox) {\n var viewBoxValues = svgViewBox\n .split(/[\\s\\,]/)\n .filter(function(v) {\n return v;\n })\n .map(parseFloat);\n\n // Cache viewbox x and y offset\n this.viewBox.x = viewBoxValues[0];\n this.viewBox.y = viewBoxValues[1];\n this.viewBox.width = viewBoxValues[2];\n this.viewBox.height = viewBoxValues[3];\n\n var zoom = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n\n // Update active state\n this.activeState.zoom = zoom;\n this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2;\n this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2;\n\n // Force updating CTM\n this.updateCTMOnNextFrame();\n\n this.options.svg.removeAttribute(\"viewBox\");\n } else {\n this.simpleViewBoxCache();\n }\n};\n\n/**\n * Recalculate viewport sizes and update viewBox cache\n */\nShadowViewport.prototype.simpleViewBoxCache = function() {\n var bBox = this.viewport.getBBox();\n\n this.viewBox.x = bBox.x;\n this.viewBox.y = bBox.y;\n this.viewBox.width = bBox.width;\n this.viewBox.height = bBox.height;\n};\n\n/**\n * Returns a viewbox object. Safe to alter\n *\n * @return {Object} viewbox object\n */\nShadowViewport.prototype.getViewBox = function() {\n return Utils.extend({}, this.viewBox);\n};\n\n/**\n * Get initial zoom and pan values. Save them into originalState\n * Parses viewBox attribute to alter initial sizes\n *\n * @return {CTM} CTM object based on options\n */\nShadowViewport.prototype.processCTM = function() {\n var newCTM = this.getCTM();\n\n if (this.options.fit || this.options.contain) {\n var newScale;\n if (this.options.fit) {\n newScale = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n } else {\n newScale = Math.max(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n }\n\n newCTM.a = newScale; //x-scale\n newCTM.d = newScale; //y-scale\n newCTM.e = -this.viewBox.x * newScale; //x-transform\n newCTM.f = -this.viewBox.y * newScale; //y-transform\n }\n\n if (this.options.center) {\n var offsetX =\n (this.options.width -\n (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) *\n 0.5,\n offsetY =\n (this.options.height -\n (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) *\n 0.5;\n\n newCTM.e = offsetX;\n newCTM.f = offsetY;\n }\n\n // Cache initial values. Based on activeState and fix+center opitons\n this.originalState.zoom = newCTM.a;\n this.originalState.x = newCTM.e;\n this.originalState.y = newCTM.f;\n\n return newCTM;\n};\n\n/**\n * Return originalState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getOriginalState = function() {\n return Utils.extend({}, this.originalState);\n};\n\n/**\n * Return actualState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getState = function() {\n return Utils.extend({}, this.activeState);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getZoom = function() {\n return this.activeState.zoom;\n};\n\n/**\n * Get zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getRelativeZoom = function() {\n return this.activeState.zoom / this.originalState.zoom;\n};\n\n/**\n * Compute zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.computeRelativeZoom = function(scale) {\n return scale / this.originalState.zoom;\n};\n\n/**\n * Get pan\n *\n * @return {Object}\n */\nShadowViewport.prototype.getPan = function() {\n return { x: this.activeState.x, y: this.activeState.y };\n};\n\n/**\n * Return cached viewport CTM value that can be safely modified\n *\n * @return {SVGMatrix}\n */\nShadowViewport.prototype.getCTM = function() {\n var safeCTM = this.options.svg.createSVGMatrix();\n\n // Copy values manually as in FF they are not itterable\n safeCTM.a = this.activeState.zoom;\n safeCTM.b = 0;\n safeCTM.c = 0;\n safeCTM.d = this.activeState.zoom;\n safeCTM.e = this.activeState.x;\n safeCTM.f = this.activeState.y;\n\n return safeCTM;\n};\n\n/**\n * Set a new CTM\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.setCTM = function(newCTM) {\n var willZoom = this.isZoomDifferent(newCTM),\n willPan = this.isPanDifferent(newCTM);\n\n if (willZoom || willPan) {\n // Before zoom\n if (willZoom) {\n // If returns false then cancel zooming\n if (\n this.options.beforeZoom(\n this.getRelativeZoom(),\n this.computeRelativeZoom(newCTM.a)\n ) === false\n ) {\n newCTM.a = newCTM.d = this.activeState.zoom;\n willZoom = false;\n } else {\n this.updateCache(newCTM);\n this.options.onZoom(this.getRelativeZoom());\n }\n }\n\n // Before pan\n if (willPan) {\n var preventPan = this.options.beforePan(this.getPan(), {\n x: newCTM.e,\n y: newCTM.f\n }),\n // If prevent pan is an object\n preventPanX = false,\n preventPanY = false;\n\n // If prevent pan is Boolean false\n if (preventPan === false) {\n // Set x and y same as before\n newCTM.e = this.getPan().x;\n newCTM.f = this.getPan().y;\n\n preventPanX = preventPanY = true;\n } else if (Utils.isObject(preventPan)) {\n // Check for X axes attribute\n if (preventPan.x === false) {\n // Prevent panning on x axes\n newCTM.e = this.getPan().x;\n preventPanX = true;\n } else if (Utils.isNumber(preventPan.x)) {\n // Set a custom pan value\n newCTM.e = preventPan.x;\n }\n\n // Check for Y axes attribute\n if (preventPan.y === false) {\n // Prevent panning on x axes\n newCTM.f = this.getPan().y;\n preventPanY = true;\n } else if (Utils.isNumber(preventPan.y)) {\n // Set a custom pan value\n newCTM.f = preventPan.y;\n }\n }\n\n // Update willPan flag\n // Check if newCTM is still different\n if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {\n willPan = false;\n } else {\n this.updateCache(newCTM);\n this.options.onPan(this.getPan());\n }\n }\n\n // Check again if should zoom or pan\n if (willZoom || willPan) {\n this.updateCTMOnNextFrame();\n }\n }\n};\n\nShadowViewport.prototype.isZoomDifferent = function(newCTM) {\n return this.activeState.zoom !== newCTM.a;\n};\n\nShadowViewport.prototype.isPanDifferent = function(newCTM) {\n return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f;\n};\n\n/**\n * Update cached CTM and active state\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.updateCache = function(newCTM) {\n this.activeState.zoom = newCTM.a;\n this.activeState.x = newCTM.e;\n this.activeState.y = newCTM.f;\n};\n\nShadowViewport.prototype.pendingUpdate = false;\n\n/**\n * Place a request to update CTM on next Frame\n */\nShadowViewport.prototype.updateCTMOnNextFrame = function() {\n if (!this.pendingUpdate) {\n // Lock\n this.pendingUpdate = true;\n\n // Throttle next update\n this.requestAnimationFrame.call(window, this.updateCTMCached);\n }\n};\n\n/**\n * Update viewport CTM with cached CTM\n */\nShadowViewport.prototype.updateCTM = function() {\n var ctm = this.getCTM();\n\n // Updates SVG element\n SvgUtils.setCTM(this.viewport, ctm, this.defs);\n\n // Free the lock\n this.pendingUpdate = false;\n\n // Notify about the update\n if (this.options.onUpdatedCTM) {\n this.options.onUpdatedCTM(ctm);\n }\n};\n\nmodule.exports = function(viewport, options) {\n return new ShadowViewport(viewport, options);\n};\n","var Wheel = require(\"./uniwheel\"),\n ControlIcons = require(\"./control-icons\"),\n Utils = require(\"./utilities\"),\n SvgUtils = require(\"./svg-utilities\"),\n ShadowViewport = require(\"./shadow-viewport\");\n\nvar SvgPanZoom = function(svg, options) {\n this.init(svg, options);\n};\n\nvar optionsDefaults = {\n viewportSelector: \".svg-pan-zoom_viewport\", // Viewport selector. Can be querySelector string or SVGElement\n panEnabled: true, // enable or disable panning (default enabled)\n controlIconsEnabled: false, // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)\n zoomEnabled: true, // enable or disable zooming (default enabled)\n dblClickZoomEnabled: true, // enable or disable zooming by double clicking (default enabled)\n mouseWheelZoomEnabled: true, // enable or disable zooming by mouse wheel (default enabled)\n preventMouseEventsDefault: true, // enable or disable preventDefault for mouse events\n zoomScaleSensitivity: 0.1, // Zoom sensitivity\n minZoom: 0.5, // Minimum Zoom level\n maxZoom: 10, // Maximum Zoom level\n fit: true, // enable or disable viewport fit in SVG (default true)\n contain: false, // enable or disable viewport contain the svg (default false)\n center: true, // enable or disable viewport centering in SVG (default true)\n refreshRate: \"auto\", // Maximum number of frames per second (altering SVG's viewport)\n beforeZoom: null,\n onZoom: null,\n beforePan: null,\n onPan: null,\n customEventsHandler: null,\n eventsListenerElement: null,\n onUpdatedCTM: null\n};\n\nvar passiveListenerOption = { passive: true };\n\nSvgPanZoom.prototype.init = function(svg, options) {\n var that = this;\n\n this.svg = svg;\n this.defs = svg.querySelector(\"defs\");\n\n // Add default attributes to SVG\n SvgUtils.setupSvgAttributes(this.svg);\n\n // Set options\n this.options = Utils.extend(Utils.extend({}, optionsDefaults), options);\n\n // Set default state\n this.state = \"none\";\n\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Init shadow viewport\n this.viewport = ShadowViewport(\n SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector),\n {\n svg: this.svg,\n width: this.width,\n height: this.height,\n fit: this.options.fit,\n contain: this.options.contain,\n center: this.options.center,\n refreshRate: this.options.refreshRate,\n // Put callbacks into functions as they can change through time\n beforeZoom: function(oldScale, newScale) {\n if (that.viewport && that.options.beforeZoom) {\n return that.options.beforeZoom(oldScale, newScale);\n }\n },\n onZoom: function(scale) {\n if (that.viewport && that.options.onZoom) {\n return that.options.onZoom(scale);\n }\n },\n beforePan: function(oldPoint, newPoint) {\n if (that.viewport && that.options.beforePan) {\n return that.options.beforePan(oldPoint, newPoint);\n }\n },\n onPan: function(point) {\n if (that.viewport && that.options.onPan) {\n return that.options.onPan(point);\n }\n },\n onUpdatedCTM: function(ctm) {\n if (that.viewport && that.options.onUpdatedCTM) {\n return that.options.onUpdatedCTM(ctm);\n }\n }\n }\n );\n\n // Wrap callbacks into public API context\n var publicInstance = this.getPublicInstance();\n publicInstance.setBeforeZoom(this.options.beforeZoom);\n publicInstance.setOnZoom(this.options.onZoom);\n publicInstance.setBeforePan(this.options.beforePan);\n publicInstance.setOnPan(this.options.onPan);\n publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM);\n\n if (this.options.controlIconsEnabled) {\n ControlIcons.enable(this);\n }\n\n // Init events handlers\n this.lastMouseWheelEventTime = Date.now();\n this.setupHandlers();\n};\n\n/**\n * Register event handlers\n */\nSvgPanZoom.prototype.setupHandlers = function() {\n var that = this,\n prevEvt = null; // use for touchstart event to detect double tap\n\n this.eventListeners = {\n // Mouse down group\n mousedown: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n touchstart: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n\n // Mouse up group\n mouseup: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchend: function(evt) {\n return that.handleMouseUp(evt);\n },\n\n // Mouse move group\n mousemove: function(evt) {\n return that.handleMouseMove(evt);\n },\n touchmove: function(evt) {\n return that.handleMouseMove(evt);\n },\n\n // Mouse leave group\n mouseleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchcancel: function(evt) {\n return that.handleMouseUp(evt);\n }\n };\n\n // Init custom events handler if available\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.init({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n\n // Custom event handler may halt builtin listeners\n var haltEventListeners = this.options.customEventsHandler\n .haltEventListeners;\n if (haltEventListeners && haltEventListeners.length) {\n for (var i = haltEventListeners.length - 1; i >= 0; i--) {\n if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {\n delete this.eventListeners[haltEventListeners[i]];\n }\n }\n }\n }\n\n // Bind eventListeners\n for (var event in this.eventListeners) {\n // Attach event to eventsListenerElement or SVG if not available\n (this.options.eventsListenerElement || this.svg).addEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Zoom using mouse wheel\n if (this.options.mouseWheelZoomEnabled) {\n this.options.mouseWheelZoomEnabled = false; // set to false as enable will set it back to true\n this.enableMouseWheelZoom();\n }\n};\n\n/**\n * Enable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.enableMouseWheelZoom = function() {\n if (!this.options.mouseWheelZoomEnabled) {\n var that = this;\n\n // Mouse wheel listener\n this.wheelListener = function(evt) {\n return that.handleMouseWheel(evt);\n };\n\n // Bind wheelListener\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.on(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n\n this.options.mouseWheelZoomEnabled = true;\n }\n};\n\n/**\n * Disable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.disableMouseWheelZoom = function() {\n if (this.options.mouseWheelZoomEnabled) {\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.off(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n this.options.mouseWheelZoomEnabled = false;\n }\n};\n\n/**\n * Handle mouse wheel event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseWheel = function(evt) {\n if (!this.options.zoomEnabled || this.state !== \"none\") {\n return;\n }\n\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Default delta in case that deltaY is not available\n var delta = evt.deltaY || 1,\n timeDelta = Date.now() - this.lastMouseWheelEventTime,\n divider = 3 + Math.max(0, 30 - timeDelta);\n\n // Update cache\n this.lastMouseWheelEventTime = Date.now();\n\n // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)\n if (\"deltaMode\" in evt && evt.deltaMode === 0 && evt.wheelDelta) {\n delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY;\n }\n\n delta =\n -0.3 < delta && delta < 0.3\n ? delta\n : ((delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10)) / divider;\n\n var inversedScreenCTM = this.svg.getScreenCTM().inverse(),\n relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n inversedScreenCTM\n ),\n zoom = Math.pow(1 + this.options.zoomScaleSensitivity, -1 * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior\n\n this.zoomAtPoint(zoom, relativeMousePoint);\n};\n\n/**\n * Zoom in at a SVG point\n *\n * @param {SVGPoint} point\n * @param {Float} zoomScale Number representing how much to zoom\n * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.\n * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)\n */\nSvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) {\n var originalState = this.viewport.getOriginalState();\n\n if (!zoomAbsolute) {\n // Fit zoomScale in set bounds\n if (\n this.getZoom() * zoomScale <\n this.options.minZoom * originalState.zoom\n ) {\n zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom();\n } else if (\n this.getZoom() * zoomScale >\n this.options.maxZoom * originalState.zoom\n ) {\n zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom();\n }\n } else {\n // Fit zoomScale in set bounds\n zoomScale = Math.max(\n this.options.minZoom * originalState.zoom,\n Math.min(this.options.maxZoom * originalState.zoom, zoomScale)\n );\n // Find relative scale to achieve desired scale\n zoomScale = zoomScale / this.getZoom();\n }\n\n var oldCTM = this.viewport.getCTM(),\n relativePoint = point.matrixTransform(oldCTM.inverse()),\n modifier = this.svg\n .createSVGMatrix()\n .translate(relativePoint.x, relativePoint.y)\n .scale(zoomScale)\n .translate(-relativePoint.x, -relativePoint.y),\n newCTM = oldCTM.multiply(modifier);\n\n if (newCTM.a !== oldCTM.a) {\n this.viewport.setCTM(newCTM);\n }\n};\n\n/**\n * Zoom at center point\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.zoom = function(scale, absolute) {\n this.zoomAtPoint(\n scale,\n SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height),\n absolute\n );\n};\n\n/**\n * Zoom used by public instance\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoom = function(scale, absolute) {\n if (absolute) {\n scale = this.computeFromRelativeZoom(scale);\n }\n\n this.zoom(scale, absolute);\n};\n\n/**\n * Zoom at point used by public instance\n *\n * @param {Float} scale\n * @param {SVGPoint|Object} point An object that has x and y attributes\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) {\n if (absolute) {\n // Transform zoom into a relative value\n scale = this.computeFromRelativeZoom(scale);\n }\n\n // If not a SVGPoint but has x and y then create a SVGPoint\n if (Utils.getType(point) !== \"SVGPoint\") {\n if (\"x\" in point && \"y\" in point) {\n point = SvgUtils.createSVGPoint(this.svg, point.x, point.y);\n } else {\n throw new Error(\"Given point is invalid\");\n }\n }\n\n this.zoomAtPoint(scale, point, absolute);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getZoom = function() {\n return this.viewport.getZoom();\n};\n\n/**\n * Get zoom scale for public usage\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getRelativeZoom = function() {\n return this.viewport.getRelativeZoom();\n};\n\n/**\n * Compute actual zoom from public zoom\n *\n * @param {Float} zoom\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) {\n return zoom * this.viewport.getOriginalState().zoom;\n};\n\n/**\n * Set zoom to initial state\n */\nSvgPanZoom.prototype.resetZoom = function() {\n var originalState = this.viewport.getOriginalState();\n\n this.zoom(originalState.zoom, true);\n};\n\n/**\n * Set pan to initial state\n */\nSvgPanZoom.prototype.resetPan = function() {\n this.pan(this.viewport.getOriginalState());\n};\n\n/**\n * Set pan and zoom to initial state\n */\nSvgPanZoom.prototype.reset = function() {\n this.resetZoom();\n this.resetPan();\n};\n\n/**\n * Handle double click event\n * See handleMouseDown() for alternate detection method\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleDblClick = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Check if target was a control button\n if (this.options.controlIconsEnabled) {\n var targetClass = evt.target.getAttribute(\"class\") || \"\";\n if (targetClass.indexOf(\"svg-pan-zoom-control\") > -1) {\n return false;\n }\n }\n\n var zoomFactor;\n\n if (evt.shiftKey) {\n zoomFactor = 1 / ((1 + this.options.zoomScaleSensitivity) * 2); // zoom out when shift key pressed\n } else {\n zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2;\n }\n\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.svg.getScreenCTM().inverse()\n );\n this.zoomAtPoint(zoomFactor, point);\n};\n\n/**\n * Handle click event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n Utils.mouseAndTouchNormalize(evt, this.svg);\n\n // Double click detection; more consistent than ondblclick\n if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)) {\n this.handleDblClick(evt);\n } else {\n // Pan mode\n this.state = \"pan\";\n this.firstEventCTM = this.viewport.getCTM();\n this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n );\n }\n};\n\n/**\n * Handle mouse move event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseMove = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\" && this.options.panEnabled) {\n // Pan mode\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n ),\n viewportCTM = this.firstEventCTM.translate(\n point.x - this.stateOrigin.x,\n point.y - this.stateOrigin.y\n );\n\n this.viewport.setCTM(viewportCTM);\n }\n};\n\n/**\n * Handle mouse button release event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseUp = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\") {\n // Quit pan mode\n this.state = \"none\";\n }\n};\n\n/**\n * Adjust viewport size (only) so it will fit in SVG\n * Does not center image\n */\nSvgPanZoom.prototype.fit = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.min(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport size (only) so it will contain the SVG\n * Does not center image\n */\nSvgPanZoom.prototype.contain = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.max(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport pan (only) so it will be centered in SVG\n * Does not zoom/fit/contain image\n */\nSvgPanZoom.prototype.center = function() {\n var viewBox = this.viewport.getViewBox(),\n offsetX =\n (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5,\n offsetY =\n (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5;\n\n this.getPublicInstance().pan({ x: offsetX, y: offsetY });\n};\n\n/**\n * Update content cached BorderBox\n * Use when viewport contents change\n */\nSvgPanZoom.prototype.updateBBox = function() {\n this.viewport.simpleViewBoxCache();\n};\n\n/**\n * Pan to a rendered position\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.pan = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e = point.x;\n viewportCTM.f = point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Relatively pan the graph by a specified rendered position vector\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.panBy = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e += point.x;\n viewportCTM.f += point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Get pan vector\n *\n * @return {Object} {x: 0, y: 0}\n */\nSvgPanZoom.prototype.getPan = function() {\n var state = this.viewport.getState();\n\n return { x: state.x, y: state.y };\n};\n\n/**\n * Recalculates cached svg dimensions and controls position\n */\nSvgPanZoom.prototype.resize = function() {\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n this.svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Recalculate original state\n var viewport = this.viewport;\n viewport.options.width = this.width;\n viewport.options.height = this.height;\n viewport.processCTM();\n\n // Reposition control icons by re-enabling them\n if (this.options.controlIconsEnabled) {\n this.getPublicInstance().disableControlIcons();\n this.getPublicInstance().enableControlIcons();\n }\n};\n\n/**\n * Unbind mouse events, free callbacks and destroy public instance\n */\nSvgPanZoom.prototype.destroy = function() {\n var that = this;\n\n // Free callbacks\n this.beforeZoom = null;\n this.onZoom = null;\n this.beforePan = null;\n this.onPan = null;\n this.onUpdatedCTM = null;\n\n // Destroy custom event handlers\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.destroy({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n }\n\n // Unbind eventListeners\n for (var event in this.eventListeners) {\n (this.options.eventsListenerElement || this.svg).removeEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Unbind wheelListener\n this.disableMouseWheelZoom();\n\n // Remove control icons\n this.getPublicInstance().disableControlIcons();\n\n // Reset zoom and pan\n this.reset();\n\n // Remove instance from instancesStore\n instancesStore = instancesStore.filter(function(instance) {\n return instance.svg !== that.svg;\n });\n\n // Delete options and its contents\n delete this.options;\n\n // Delete viewport to make public shadow viewport functions uncallable\n delete this.viewport;\n\n // Destroy public instance and rewrite getPublicInstance\n delete this.publicInstance;\n delete this.pi;\n this.getPublicInstance = function() {\n return null;\n };\n};\n\n/**\n * Returns a public instance object\n *\n * @return {Object} Public instance object\n */\nSvgPanZoom.prototype.getPublicInstance = function() {\n var that = this;\n\n // Create cache\n if (!this.publicInstance) {\n this.publicInstance = this.pi = {\n // Pan\n enablePan: function() {\n that.options.panEnabled = true;\n return that.pi;\n },\n disablePan: function() {\n that.options.panEnabled = false;\n return that.pi;\n },\n isPanEnabled: function() {\n return !!that.options.panEnabled;\n },\n pan: function(point) {\n that.pan(point);\n return that.pi;\n },\n panBy: function(point) {\n that.panBy(point);\n return that.pi;\n },\n getPan: function() {\n return that.getPan();\n },\n // Pan event\n setBeforePan: function(fn) {\n that.options.beforePan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnPan: function(fn) {\n that.options.onPan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zoom and Control Icons\n enableZoom: function() {\n that.options.zoomEnabled = true;\n return that.pi;\n },\n disableZoom: function() {\n that.options.zoomEnabled = false;\n return that.pi;\n },\n isZoomEnabled: function() {\n return !!that.options.zoomEnabled;\n },\n enableControlIcons: function() {\n if (!that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = true;\n ControlIcons.enable(that);\n }\n return that.pi;\n },\n disableControlIcons: function() {\n if (that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = false;\n ControlIcons.disable(that);\n }\n return that.pi;\n },\n isControlIconsEnabled: function() {\n return !!that.options.controlIconsEnabled;\n },\n // Double click zoom\n enableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = true;\n return that.pi;\n },\n disableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = false;\n return that.pi;\n },\n isDblClickZoomEnabled: function() {\n return !!that.options.dblClickZoomEnabled;\n },\n // Mouse wheel zoom\n enableMouseWheelZoom: function() {\n that.enableMouseWheelZoom();\n return that.pi;\n },\n disableMouseWheelZoom: function() {\n that.disableMouseWheelZoom();\n return that.pi;\n },\n isMouseWheelZoomEnabled: function() {\n return !!that.options.mouseWheelZoomEnabled;\n },\n // Zoom scale and bounds\n setZoomScaleSensitivity: function(scale) {\n that.options.zoomScaleSensitivity = scale;\n return that.pi;\n },\n setMinZoom: function(zoom) {\n that.options.minZoom = zoom;\n return that.pi;\n },\n setMaxZoom: function(zoom) {\n that.options.maxZoom = zoom;\n return that.pi;\n },\n // Zoom event\n setBeforeZoom: function(fn) {\n that.options.beforeZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnZoom: function(fn) {\n that.options.onZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zooming\n zoom: function(scale) {\n that.publicZoom(scale, true);\n return that.pi;\n },\n zoomBy: function(scale) {\n that.publicZoom(scale, false);\n return that.pi;\n },\n zoomAtPoint: function(scale, point) {\n that.publicZoomAtPoint(scale, point, true);\n return that.pi;\n },\n zoomAtPointBy: function(scale, point) {\n that.publicZoomAtPoint(scale, point, false);\n return that.pi;\n },\n zoomIn: function() {\n this.zoomBy(1 + that.options.zoomScaleSensitivity);\n return that.pi;\n },\n zoomOut: function() {\n this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity));\n return that.pi;\n },\n getZoom: function() {\n return that.getRelativeZoom();\n },\n // CTM update\n setOnUpdatedCTM: function(fn) {\n that.options.onUpdatedCTM =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Reset\n resetZoom: function() {\n that.resetZoom();\n return that.pi;\n },\n resetPan: function() {\n that.resetPan();\n return that.pi;\n },\n reset: function() {\n that.reset();\n return that.pi;\n },\n // Fit, Contain and Center\n fit: function() {\n that.fit();\n return that.pi;\n },\n contain: function() {\n that.contain();\n return that.pi;\n },\n center: function() {\n that.center();\n return that.pi;\n },\n // Size and Resize\n updateBBox: function() {\n that.updateBBox();\n return that.pi;\n },\n resize: function() {\n that.resize();\n return that.pi;\n },\n getSizes: function() {\n return {\n width: that.width,\n height: that.height,\n realZoom: that.getZoom(),\n viewBox: that.viewport.getViewBox()\n };\n },\n // Destroy\n destroy: function() {\n that.destroy();\n return that.pi;\n }\n };\n }\n\n return this.publicInstance;\n};\n\n/**\n * Stores pairs of instances of SvgPanZoom and SVG\n * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}\n *\n * @type {Array}\n */\nvar instancesStore = [];\n\nvar svgPanZoom = function(elementOrSelector, options) {\n var svg = Utils.getSvg(elementOrSelector);\n\n if (svg === null) {\n return null;\n } else {\n // Look for existent instance\n for (var i = instancesStore.length - 1; i >= 0; i--) {\n if (instancesStore[i].svg === svg) {\n return instancesStore[i].instance.getPublicInstance();\n }\n }\n\n // If instance not found - create one\n instancesStore.push({\n svg: svg,\n instance: new SvgPanZoom(svg, options)\n });\n\n // Return just pushed instance\n return instancesStore[\n instancesStore.length - 1\n ].instance.getPublicInstance();\n }\n};\n\nmodule.exports = svgPanZoom;\n","var Utils = require(\"./utilities\"),\n _browser = \"unknown\";\n\n// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\nif (/*@cc_on!@*/ false || !!document.documentMode) {\n // internet explorer\n _browser = \"ie\";\n}\n\nmodule.exports = {\n svgNS: \"http://www.w3.org/2000/svg\",\n xmlNS: \"http://www.w3.org/XML/1998/namespace\",\n xmlnsNS: \"http://www.w3.org/2000/xmlns/\",\n xlinkNS: \"http://www.w3.org/1999/xlink\",\n evNS: \"http://www.w3.org/2001/xml-events\",\n\n /**\n * Get svg dimensions: width and height\n *\n * @param {SVGSVGElement} svg\n * @return {Object} {width: 0, height: 0}\n */\n getBoundingClientRectNormalized: function(svg) {\n if (svg.clientWidth && svg.clientHeight) {\n return { width: svg.clientWidth, height: svg.clientHeight };\n } else if (!!svg.getBoundingClientRect()) {\n return svg.getBoundingClientRect();\n } else {\n throw new Error(\"Cannot get BoundingClientRect for SVG.\");\n }\n },\n\n /**\n * Gets g element with class of \"viewport\" or creates it if it doesn't exist\n *\n * @param {SVGSVGElement} svg\n * @return {SVGElement} g (group) element\n */\n getOrCreateViewport: function(svg, selector) {\n var viewport = null;\n\n if (Utils.isElement(selector)) {\n viewport = selector;\n } else {\n viewport = svg.querySelector(selector);\n }\n\n // Check if there is just one main group in SVG\n if (!viewport) {\n var childNodes = Array.prototype.slice\n .call(svg.childNodes || svg.children)\n .filter(function(el) {\n return el.nodeName !== \"defs\" && el.nodeName !== \"#text\";\n });\n\n // Node name should be SVGGElement and should have no transform attribute\n // Groups with transform are not used as viewport because it involves parsing of all transform possibilities\n if (\n childNodes.length === 1 &&\n childNodes[0].nodeName === \"g\" &&\n childNodes[0].getAttribute(\"transform\") === null\n ) {\n viewport = childNodes[0];\n }\n }\n\n // If no favorable group element exists then create one\n if (!viewport) {\n var viewportId =\n \"viewport-\" + new Date().toISOString().replace(/\\D/g, \"\");\n viewport = document.createElementNS(this.svgNS, \"g\");\n viewport.setAttribute(\"id\", viewportId);\n\n // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes\n var svgChildren = svg.childNodes || svg.children;\n if (!!svgChildren && svgChildren.length > 0) {\n for (var i = svgChildren.length; i > 0; i--) {\n // Move everything into viewport except defs\n if (svgChildren[svgChildren.length - i].nodeName !== \"defs\") {\n viewport.appendChild(svgChildren[svgChildren.length - i]);\n }\n }\n }\n svg.appendChild(viewport);\n }\n\n // Parse class names\n var classNames = [];\n if (viewport.getAttribute(\"class\")) {\n classNames = viewport.getAttribute(\"class\").split(\" \");\n }\n\n // Set class (if not set already)\n if (!~classNames.indexOf(\"svg-pan-zoom_viewport\")) {\n classNames.push(\"svg-pan-zoom_viewport\");\n viewport.setAttribute(\"class\", classNames.join(\" \"));\n }\n\n return viewport;\n },\n\n /**\n * Set SVG attributes\n *\n * @param {SVGSVGElement} svg\n */\n setupSvgAttributes: function(svg) {\n // Setting default attributes\n svg.setAttribute(\"xmlns\", this.svgNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:xlink\", this.xlinkNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:ev\", this.evNS);\n\n // Needed for Internet Explorer, otherwise the viewport overflows\n if (svg.parentNode !== null) {\n var style = svg.getAttribute(\"style\") || \"\";\n if (style.toLowerCase().indexOf(\"overflow\") === -1) {\n svg.setAttribute(\"style\", \"overflow: hidden; \" + style);\n }\n }\n },\n\n /**\n * How long Internet Explorer takes to finish updating its display (ms).\n */\n internetExplorerRedisplayInterval: 300,\n\n /**\n * Forces the browser to redisplay all SVG elements that rely on an\n * element defined in a 'defs' section. It works globally, for every\n * available defs element on the page.\n * The throttling is intentionally global.\n *\n * This is only needed for IE. It is as a hack to make markers (and 'use' elements?)\n * visible after pan/zoom when there are multiple SVGs on the page.\n * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/\n * also see svg-pan-zoom issue: https://github.com/bumbu/svg-pan-zoom/issues/62\n */\n refreshDefsGlobal: Utils.throttle(\n function() {\n var allDefs = document.querySelectorAll(\"defs\");\n var allDefsCount = allDefs.length;\n for (var i = 0; i < allDefsCount; i++) {\n var thisDefs = allDefs[i];\n thisDefs.parentNode.insertBefore(thisDefs, thisDefs);\n }\n },\n this ? this.internetExplorerRedisplayInterval : null\n ),\n\n /**\n * Sets the current transform matrix of an element\n *\n * @param {SVGElement} element\n * @param {SVGMatrix} matrix CTM\n * @param {SVGElement} defs\n */\n setCTM: function(element, matrix, defs) {\n var that = this,\n s =\n \"matrix(\" +\n matrix.a +\n \",\" +\n matrix.b +\n \",\" +\n matrix.c +\n \",\" +\n matrix.d +\n \",\" +\n matrix.e +\n \",\" +\n matrix.f +\n \")\";\n\n element.setAttributeNS(null, \"transform\", s);\n if (\"transform\" in element.style) {\n element.style.transform = s;\n } else if (\"-ms-transform\" in element.style) {\n element.style[\"-ms-transform\"] = s;\n } else if (\"-webkit-transform\" in element.style) {\n element.style[\"-webkit-transform\"] = s;\n }\n\n // IE has a bug that makes markers disappear on zoom (when the matrix \"a\" and/or \"d\" elements change)\n // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10\n // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/\n if (_browser === \"ie\" && !!defs) {\n // this refresh is intended for redisplaying the SVG during zooming\n defs.parentNode.insertBefore(defs, defs);\n // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG\n // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that\n // are located under any other element(s).\n window.setTimeout(function() {\n that.refreshDefsGlobal();\n }, that.internetExplorerRedisplayInterval);\n }\n },\n\n /**\n * Instantiate an SVGPoint object with given event coordinates\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n * @return {SVGPoint} point\n */\n getEventPoint: function(evt, svg) {\n var point = svg.createSVGPoint();\n\n Utils.mouseAndTouchNormalize(evt, svg);\n\n point.x = evt.clientX;\n point.y = evt.clientY;\n\n return point;\n },\n\n /**\n * Get SVG center point\n *\n * @param {SVGSVGElement} svg\n * @return {SVGPoint}\n */\n getSvgCenterPoint: function(svg, width, height) {\n return this.createSVGPoint(svg, width / 2, height / 2);\n },\n\n /**\n * Create a SVGPoint with given x and y\n *\n * @param {SVGSVGElement} svg\n * @param {Number} x\n * @param {Number} y\n * @return {SVGPoint}\n */\n createSVGPoint: function(svg, x, y) {\n var point = svg.createSVGPoint();\n point.x = x;\n point.y = y;\n\n return point;\n }\n};\n","// uniwheel 0.1.2 (customized)\n// A unified cross browser mouse wheel event handler\n// https://github.com/teemualap/uniwheel\n\nmodule.exports = (function(){\n\n //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel\n\n var prefix = \"\", _addEventListener, _removeEventListener, support, fns = [];\n var passiveListenerOption = {passive: true};\n var activeListenerOption = {passive: false};\n\n // detect event model\n if ( window.addEventListener ) {\n _addEventListener = \"addEventListener\";\n _removeEventListener = \"removeEventListener\";\n } else {\n _addEventListener = \"attachEvent\";\n _removeEventListener = \"detachEvent\";\n prefix = \"on\";\n }\n\n // detect available wheel event\n support = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\n\n\n function createCallback(element,callback) {\n\n var fn = function(originalEvent) {\n\n !originalEvent && ( originalEvent = window.event );\n\n // create a normalized event object\n var event = {\n // keep a ref to the original event object\n originalEvent: originalEvent,\n target: originalEvent.target || originalEvent.srcElement,\n type: \"wheel\",\n deltaMode: originalEvent.type == \"MozMousePixelScroll\" ? 0 : 1,\n deltaX: 0,\n delatZ: 0,\n preventDefault: function() {\n originalEvent.preventDefault ?\n originalEvent.preventDefault() :\n originalEvent.returnValue = false;\n }\n };\n\n // calculate deltaY (and deltaX) according to the event\n if ( support == \"mousewheel\" ) {\n event.deltaY = - 1/40 * originalEvent.wheelDelta;\n // Webkit also support wheelDeltaX\n originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );\n } else {\n event.deltaY = originalEvent.detail;\n }\n\n // it's time to fire the callback\n return callback( event );\n\n };\n\n fns.push({\n element: element,\n fn: fn,\n });\n\n return fn;\n }\n\n function getCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns[i].fn;\n }\n }\n return function(){};\n }\n\n function removeCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns.splice(i,1);\n }\n }\n }\n\n function _addWheelListener(elem, eventName, callback, isPassiveListener ) {\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = createCallback(elem, callback);\n }\n\n elem[_addEventListener](\n prefix + eventName,\n cb,\n isPassiveListener ? passiveListenerOption : activeListenerOption\n );\n }\n\n function _removeWheelListener(elem, eventName, callback, isPassiveListener ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = getCallback(elem);\n }\n\n elem[_removeEventListener](\n prefix + eventName,\n cb,\n isPassiveListener ? passiveListenerOption : activeListenerOption\n );\n\n removeCallback(elem);\n }\n\n function addWheelListener( elem, callback, isPassiveListener ) {\n _addWheelListener(elem, support, callback, isPassiveListener );\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _addWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener );\n }\n }\n\n function removeWheelListener(elem, callback, isPassiveListener){\n _removeWheelListener(elem, support, callback, isPassiveListener);\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _removeWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener);\n }\n }\n\n return {\n on: addWheelListener,\n off: removeWheelListener\n };\n\n})();\n","module.exports = {\n /**\n * Extends an object\n *\n * @param {Object} target object to extend\n * @param {Object} source object to take properties from\n * @return {Object} extended object\n */\n extend: function(target, source) {\n target = target || {};\n for (var prop in source) {\n // Go recursively\n if (this.isObject(source[prop])) {\n target[prop] = this.extend(target[prop], source[prop]);\n } else {\n target[prop] = source[prop];\n }\n }\n return target;\n },\n\n /**\n * Checks if an object is a DOM element\n *\n * @param {Object} o HTML element or String\n * @return {Boolean} returns true if object is a DOM element\n */\n isElement: function(o) {\n return (\n o instanceof HTMLElement ||\n o instanceof SVGElement ||\n o instanceof SVGSVGElement || //DOM2\n (o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\")\n );\n },\n\n /**\n * Checks if an object is an Object\n *\n * @param {Object} o Object\n * @return {Boolean} returns true if object is an Object\n */\n isObject: function(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n },\n\n /**\n * Checks if variable is Number\n *\n * @param {Integer|Float} n\n * @return {Boolean} returns true if variable is Number\n */\n isNumber: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n\n /**\n * Search for an SVG element\n *\n * @param {Object|String} elementOrSelector DOM Element or selector String\n * @return {Object|Null} SVG or null\n */\n getSvg: function(elementOrSelector) {\n var element, svg;\n\n if (!this.isElement(elementOrSelector)) {\n // If selector provided\n if (\n typeof elementOrSelector === \"string\" ||\n elementOrSelector instanceof String\n ) {\n // Try to find the element\n element = document.querySelector(elementOrSelector);\n\n if (!element) {\n throw new Error(\n \"Provided selector did not find any elements. Selector: \" +\n elementOrSelector\n );\n return null;\n }\n } else {\n throw new Error(\"Provided selector is not an HTML object nor String\");\n return null;\n }\n } else {\n element = elementOrSelector;\n }\n\n if (element.tagName.toLowerCase() === \"svg\") {\n svg = element;\n } else {\n if (element.tagName.toLowerCase() === \"object\") {\n svg = element.contentDocument.documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"embed\") {\n svg = element.getSVGDocument().documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"img\") {\n throw new Error(\n 'Cannot script an SVG in an \"img\" element. Please use an \"object\" element or an in-line SVG.'\n );\n } else {\n throw new Error(\"Cannot get SVG.\");\n }\n return null;\n }\n }\n }\n\n return svg;\n },\n\n /**\n * Attach a given context to a function\n * @param {Function} fn Function\n * @param {Object} context Context\n * @return {Function} Function with certain context\n */\n proxy: function(fn, context) {\n return function() {\n return fn.apply(context, arguments);\n };\n },\n\n /**\n * Returns object type\n * Uses toString that returns [object SVGPoint]\n * And than parses object type from string\n *\n * @param {Object} o Any object\n * @return {String} Object type\n */\n getType: function(o) {\n return Object.prototype.toString\n .apply(o)\n .replace(/^\\[object\\s/, \"\")\n .replace(/\\]$/, \"\");\n },\n\n /**\n * If it is a touch event than add clientX and clientY to event object\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n */\n mouseAndTouchNormalize: function(evt, svg) {\n // If no clientX then fallback\n if (evt.clientX === void 0 || evt.clientX === null) {\n // Fallback\n evt.clientX = 0;\n evt.clientY = 0;\n\n // If it is a touch event\n if (evt.touches !== void 0 && evt.touches.length) {\n if (evt.touches[0].clientX !== void 0) {\n evt.clientX = evt.touches[0].clientX;\n evt.clientY = evt.touches[0].clientY;\n } else if (evt.touches[0].pageX !== void 0) {\n var rect = svg.getBoundingClientRect();\n\n evt.clientX = evt.touches[0].pageX - rect.left;\n evt.clientY = evt.touches[0].pageY - rect.top;\n }\n // If it is a custom event\n } else if (evt.originalEvent !== void 0) {\n if (evt.originalEvent.clientX !== void 0) {\n evt.clientX = evt.originalEvent.clientX;\n evt.clientY = evt.originalEvent.clientY;\n }\n }\n }\n },\n\n /**\n * Check if an event is a double click/tap\n * TODO: For touch gestures use a library (hammer.js) that takes in account other events\n * (touchmove and touchend). It should take in account tap duration and traveled distance\n *\n * @param {Event} evt\n * @param {Event} prevEvt Previous Event\n * @return {Boolean}\n */\n isDblClick: function(evt, prevEvt) {\n // Double click detected by browser\n if (evt.detail === 2) {\n return true;\n }\n // Try to compare events\n else if (prevEvt !== void 0 && prevEvt !== null) {\n var timeStampDiff = evt.timeStamp - prevEvt.timeStamp, // should be lower than 250 ms\n touchesDistance = Math.sqrt(\n Math.pow(evt.clientX - prevEvt.clientX, 2) +\n Math.pow(evt.clientY - prevEvt.clientY, 2)\n );\n\n return timeStampDiff < 250 && touchesDistance < 10;\n }\n\n // Nothing found\n return false;\n },\n\n /**\n * Returns current timestamp as an integer\n *\n * @return {Number}\n */\n now:\n Date.now ||\n function() {\n return new Date().getTime();\n },\n\n // From underscore.\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n throttle: function(func, wait, options) {\n var that = this;\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) {\n options = {};\n }\n var later = function() {\n previous = options.leading === false ? 0 : that.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n };\n return function() {\n var now = that.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n context = this; // eslint-disable-line consistent-this\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n /**\n * Create a requestAnimationFrame simulation\n *\n * @param {Number|String} refreshRate\n * @return {Function}\n */\n createRequestAnimationFrame: function(refreshRate) {\n var timeout = null;\n\n // Convert refreshRate to timeout\n if (refreshRate !== \"auto\" && refreshRate < 60 && refreshRate > 1) {\n timeout = Math.floor(1000 / refreshRate);\n }\n\n if (timeout === null) {\n return window.requestAnimationFrame || requestTimeout(33);\n } else {\n return requestTimeout(timeout);\n }\n }\n};\n\n/**\n * Create a callback that will execute after a given timeout\n *\n * @param {Function} timeout\n * @return {Function}\n */\nfunction requestTimeout(timeout) {\n return function(callback) {\n window.setTimeout(callback, timeout);\n };\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.TinyDatePicker = factory());\n}(this, (function () { 'use strict';\n\n /**\n * @file A generic set of mutation-free date functions.\n */\n\n /**\n * now returns the current date without any time values\n *\n * @returns {Date}\n */\n function now() {\n var dt = new Date();\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * dateEq compares two dates\n *\n * @param {Date} date1 the first date\n * @param {Date} date2 the second date\n * @returns {boolean}\n */\n function datesEq(date1, date2) {\n return (date1 && date1.toDateString()) === (date2 && date2.toDateString());\n }\n\n /**\n * shiftDay shifts the specified date by n days\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftDay(dt, n) {\n dt = new Date(dt);\n dt.setDate(dt.getDate() + n);\n return dt;\n }\n\n /**\n * shiftMonth shifts the specified date by a specified number of months\n *\n * @param {Date} dt\n * @param {number} n\n * @param {boolean} wrap optional, if true, does not change year\n * value, defaults to false\n * @returns {Date}\n */\n function shiftMonth(dt, n, wrap) {\n dt = new Date(dt);\n\n var dayOfMonth = dt.getDate();\n var month = dt.getMonth() + n;\n\n dt.setDate(1);\n dt.setMonth(wrap ? (12 + month) % 12 : month);\n dt.setDate(dayOfMonth);\n\n // If dayOfMonth = 31, but the target month only has 30 or 29 or whatever...\n // head back to the max of the target month\n if (dt.getDate() < dayOfMonth) {\n dt.setDate(0);\n }\n\n return dt;\n }\n\n /**\n * shiftYear shifts the specified date by n years\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftYear(dt, n) {\n dt = new Date(dt);\n dt.setFullYear(dt.getFullYear() + n);\n return dt;\n }\n\n /**\n * setYear changes the specified date to the specified year\n *\n * @param {Date} dt\n * @param {number} year\n */\n function setYear(dt, year) {\n dt = new Date(dt);\n dt.setFullYear(year);\n return dt;\n }\n\n /**\n * setMonth changes the specified date to the specified month\n *\n * @param {Date} dt\n * @param {number} month\n */\n function setMonth(dt, month) {\n return shiftMonth(dt, month - dt.getMonth());\n }\n\n /**\n * dateOrParse creates a function which, given a date or string, returns a date\n *\n * @param {function} parse the function used to parse strings\n * @returns {function}\n */\n function dateOrParse(parse) {\n return function (dt) {\n return dropTime(typeof dt === 'string' ? parse(dt) : dt);\n };\n }\n\n /**\n * constrainDate returns dt or min/max depending on whether dt is out of bounds (inclusive)\n *\n * @export\n * @param {Date} dt\n * @param {Date} min\n * @param {Date} max\n * @returns {Date}\n */\n function constrainDate(dt, min, max) {\n return (dt < min) ? min :\n (dt > max) ? max :\n dt;\n }\n\n function dropTime(dt) {\n dt = new Date(dt);\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * @file Utility functions for function manipulation.\n */\n\n /**\n * bufferFn buffers calls to fn so they only happen every ms milliseconds\n *\n * @param {number} ms number of milliseconds\n * @param {function} fn the function to be buffered\n * @returns {function}\n */\n function bufferFn(ms, fn) {\n var timeout = undefined;\n return function () {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n /**\n * noop is a function which does nothing at all.\n */\n function noop() { }\n\n /**\n * copy properties from object o2 to object o1.\n *\n * @params {Object} o1\n * @params {Object} o2\n * @returns {Object}\n */\n function cp() {\n var args = arguments;\n var o1 = args[0];\n for (var i = 1; i < args.length; ++i) {\n var o2 = args[i] || {};\n for (var key in o2) {\n o1[key] = o2[key];\n }\n }\n return o1;\n }\n\n /**\n * @file Responsible for sanitizing and creating date picker options.\n */\n\n var english = {\n days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n today: 'Today',\n clear: 'Clear',\n close: 'Close',\n };\n\n /**\n * DatePickerOptions constructs a new date picker options object, overriding\n * default values with any values specified in opts.\n *\n * @param {DatePickerOptions} opts\n * @returns {DatePickerOptions}\n */\n function DatePickerOptions(opts) {\n opts = opts || {};\n opts = cp(defaults(), opts);\n var parse = dateOrParse(opts.parse);\n opts.lang = cp(english, opts.lang);\n opts.parse = parse;\n opts.inRange = makeInRangeFn(opts);\n opts.min = parse(opts.min || shiftYear(now(), -100));\n opts.max = parse(opts.max || shiftYear(now(), 100));\n opts.hilightedDate = opts.parse(opts.hilightedDate);\n\n return opts;\n }\n\n function defaults() {\n return {\n lang: english,\n\n // Possible values: dp-modal, dp-below, dp-permanent\n mode: 'dp-modal',\n\n // The date to hilight initially if the date picker has no\n // initial value.\n hilightedDate: now(),\n\n format: function (dt) {\n return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();\n },\n\n parse: function (str) {\n var date = new Date(str);\n return isNaN(date) ? now() : date;\n },\n\n dateClass: function () { },\n\n inRange: function () {\n return true;\n }\n };\n }\n\n function makeInRangeFn(opts) {\n var inRange = opts.inRange; // Cache this version, and return a variant\n\n return function (dt, dp) {\n return inRange(dt, dp) && opts.min <= dt && opts.max >= dt;\n };\n }\n\n /**\n * @file Helper functions for dealing with dom elements.\n */\n\n var Key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n enter: 13,\n esc: 27,\n };\n\n /**\n * on attaches an event handler to the specified element, and returns an\n * off function which can be used to remove the handler.\n *\n * @param {string} evt the name of the event to handle\n * @param {HTMLElement} el the element to attach to\n * @param {function} handler the event handler\n * @returns {function} the off function\n */\n function on(evt, el, handler) {\n el.addEventListener(evt, handler, true);\n\n return function () {\n el.removeEventListener(evt, handler, true);\n };\n }\n\n var CustomEvent = shimCustomEvent();\n\n function shimCustomEvent() {\n var CustomEvent = window.CustomEvent;\n\n if (typeof CustomEvent !== 'function') {\n CustomEvent = function (event, params) {\n params = params || {bubbles: false, cancelable: false, detail: undefined};\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n }\n\n return CustomEvent;\n }\n\n /**\n * @file Manages the calendar / day-picker view.\n */\n\n var dayPicker = {\n onKeyDown: keyDown,\n onClick: {\n 'dp-day': selectDay,\n 'dp-next': gotoNextMonth,\n 'dp-prev': gotoPrevMonth,\n 'dp-today': selectToday,\n 'dp-clear': clear,\n 'dp-close': close,\n 'dp-cal-month': showMonthPicker,\n 'dp-cal-year': showYearPicker,\n },\n render: render\n };\n\n /**\n * view renders the calendar (day picker) as an HTML string.\n *\n * @param {DatePickerContext} context the date picker being rendered\n * @returns {string}\n */\n function render(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var state = dp.state;\n var dayNames = lang.days;\n var dayOffset = opts.dayOffset || 0;\n var selectedDate = state.selectedDate;\n var hilightedDate = state.hilightedDate;\n var hilightedMonth = hilightedDate.getMonth();\n var today = now().getTime();\n\n return (\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n dayNames.map(function (name, i) {\n return (\n '' + dayNames[(i + dayOffset) % dayNames.length] + ''\n );\n }).join('') +\n mapDays(hilightedDate, dayOffset, function (date) {\n var isNotInMonth = date.getMonth() !== hilightedMonth;\n var isDisabled = !opts.inRange(date);\n var isToday = date.getTime() === today;\n var className = 'dp-day';\n className += (isNotInMonth ? ' dp-edge-day' : '');\n className += (datesEq(date, hilightedDate) ? ' dp-current' : '');\n className += (datesEq(date, selectedDate) ? ' dp-selected' : '');\n className += (isDisabled ? ' dp-day-disabled' : '');\n className += (isToday ? ' dp-day-today' : '');\n className += ' ' + opts.dateClass(date, dp);\n\n return (\n ''\n );\n }) +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    '\n );\n }\n\n /**\n * keyDown handles the key down event for the day-picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -7 :\n (key === Key.down) ? 7 :\n 0;\n\n if (key === Key.esc) {\n dp.close();\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftDay(dp.state.hilightedDate, shiftBy)\n });\n }\n }\n\n function selectToday(e, dp) {\n dp.setState({\n selectedDate: now(),\n });\n }\n\n function clear(e, dp) {\n dp.setState({\n selectedDate: null,\n });\n }\n\n function close(e, dp) {\n dp.close();\n }\n\n function showMonthPicker(e, dp) {\n dp.setState({\n view: 'month'\n });\n }\n\n function showYearPicker(e, dp) {\n dp.setState({\n view: 'year'\n });\n }\n\n function gotoNextMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, 1)\n });\n }\n\n function gotoPrevMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, -1)\n });\n }\n\n function selectDay(e, dp) {\n dp.setState({\n selectedDate: new Date(parseInt(e.target.getAttribute('data-date'))),\n });\n }\n\n function mapDays(currentDate, dayOffset, fn) {\n var result = '';\n var iter = new Date(currentDate);\n iter.setDate(1);\n iter.setDate(1 - iter.getDay() + dayOffset);\n\n // If we are showing monday as the 1st of the week,\n // and the monday is the 2nd of the month, the sunday won't\n // show, so we need to shift backwards\n if (dayOffset && iter.getDate() === dayOffset + 1) {\n iter.setDate(dayOffset - 6);\n }\n\n // We are going to have 6 weeks always displayed to keep a consistent\n // calendar size\n for (var day = 0; day < (6 * 7); ++day) {\n result += fn(iter);\n iter.setDate(iter.getDate() + 1);\n }\n\n return result;\n }\n\n /**\n * @file Manages the month-picker view.\n */\n\n var monthPicker = {\n onKeyDown: keyDown$1,\n onClick: {\n 'dp-month': onChooseMonth\n },\n render: render$1\n };\n\n function onChooseMonth(e, dp) {\n dp.setState({\n hilightedDate: setMonth(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-month'))),\n view: 'day',\n });\n }\n\n /**\n * render renders the month picker as an HTML string\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$1(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var months = lang.months;\n var currentDate = dp.state.hilightedDate;\n var currentMonth = currentDate.getMonth();\n\n return (\n '
    ' +\n months.map(function (month, i) {\n var className = 'dp-month';\n className += (currentMonth === i ? ' dp-current' : '');\n\n return (\n ''\n );\n }).join('') +\n '
    '\n );\n }\n\n /**\n * keyDown handles keydown events that occur in the month picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown$1(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -3 :\n (key === Key.down) ? 3 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftMonth(dp.state.hilightedDate, shiftBy, true)\n });\n }\n }\n\n /**\n * @file Manages the year-picker view.\n */\n\n var yearPicker = {\n render: render$2,\n onKeyDown: keyDown$2,\n onClick: {\n 'dp-year': onChooseYear\n },\n };\n\n /**\n * view renders the year picker as an HTML string.\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$2(dp) {\n var state = dp.state;\n var currentYear = state.hilightedDate.getFullYear();\n var selectedYear = state.selectedDate.getFullYear();\n\n return (\n '
    ' +\n mapYears(dp, function (year) {\n var className = 'dp-year';\n className += (year === currentYear ? ' dp-current' : '');\n className += (year === selectedYear ? ' dp-selected' : '');\n\n return (\n ''\n );\n }) +\n '
    '\n );\n }\n\n function onChooseYear(e, dp) {\n dp.setState({\n hilightedDate: setYear(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-year'))),\n view: 'day',\n });\n }\n\n function keyDown$2(e, dp) {\n var key = e.keyCode;\n var opts = dp.opts;\n var shiftBy =\n (key === Key.left || key === Key.up) ? 1 :\n (key === Key.right || key === Key.down) ? -1 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n var shiftedYear = shiftYear(dp.state.hilightedDate, shiftBy);\n\n dp.setState({\n hilightedDate: constrainDate(shiftedYear, opts.min, opts.max),\n });\n }\n }\n\n function mapYears(dp, fn) {\n var result = '';\n var max = dp.opts.max.getFullYear();\n\n for (var i = max; i >= dp.opts.min.getFullYear(); --i) {\n result += fn(i);\n }\n\n return result;\n }\n\n /**\n * @file Defines the base date picker behavior, overridden by various modes.\n */\n\n var views = {\n day: dayPicker,\n year: yearPicker,\n month: monthPicker\n };\n\n function BaseMode(input, emit, opts) {\n var detatchInputEvents; // A function that detaches all events from the input\n var closing = false; // A hack to prevent calendar from re-opening when closing.\n var selectedDate; // The currently selected date\n var dp = {\n // The root DOM element for the date picker, initialized on first open.\n el: undefined,\n opts: opts,\n shouldFocusOnBlur: true,\n shouldFocusOnRender: true,\n state: initialState(),\n adjustPosition: noop,\n containerHTML: '
    ',\n\n attachToDom: function () {\n document.body.appendChild(dp.el);\n },\n\n updateInput: function (selectedDate) {\n var e = new CustomEvent('change', {bubbles: true});\n e.simulated = true;\n input.value = selectedDate ? opts.format(selectedDate) : '';\n input.dispatchEvent(e);\n },\n\n computeSelectedDate: function () {\n return opts.parse(input.value);\n },\n\n currentView: function() {\n return views[dp.state.view];\n },\n\n open: function () {\n if (closing) {\n return;\n }\n\n if (!dp.el) {\n dp.el = createContainerElement(opts, dp.containerHTML);\n attachContainerEvents(dp);\n }\n\n selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);\n dp.state.hilightedDate = selectedDate || opts.hilightedDate;\n dp.state.view = 'day';\n\n dp.attachToDom();\n dp.render();\n\n emit('open');\n },\n\n isVisible: function () {\n return !!dp.el && !!dp.el.parentNode;\n },\n\n hasFocus: function () {\n var focused = document.activeElement;\n return dp.el &&\n dp.el.contains(focused) &&\n focused.className.indexOf('dp-focuser') < 0;\n },\n\n shouldHide: function () {\n return dp.isVisible();\n },\n\n close: function (becauseOfBlur) {\n var el = dp.el;\n\n if (!dp.isVisible()) {\n return;\n }\n\n if (el) {\n var parent = el.parentNode;\n parent && parent.removeChild(el);\n }\n\n closing = true;\n\n if (becauseOfBlur && dp.shouldFocusOnBlur) {\n focusInput(input);\n }\n\n // When we close, the input often gains refocus, which\n // can then launch the date picker again, so we buffer\n // a bit and don't show the date picker within N ms of closing\n setTimeout(function() {\n closing = false;\n }, 100);\n\n emit('close');\n },\n\n destroy: function () {\n dp.close();\n detatchInputEvents();\n },\n\n render: function () {\n if (!dp.el || !dp.el.firstChild) {\n return;\n }\n\n var hadFocus = dp.hasFocus();\n var html = dp.currentView().render(dp);\n html && (dp.el.firstChild.innerHTML = html);\n\n dp.adjustPosition();\n\n if (hadFocus || dp.shouldFocusOnRender) {\n focusCurrent(dp);\n }\n },\n\n // Conceptually similar to setState in React, updates\n // the view state and re-renders.\n setState: function (state) {\n for (var key in state) {\n dp.state[key] = state[key];\n }\n\n emit('statechange');\n dp.render();\n },\n };\n\n detatchInputEvents = attachInputEvents(input, dp);\n\n // Builds the initial view state\n // selectedDate is a special case and causes changes to hilightedDate\n // hilightedDate is set on open, so remains undefined initially\n // view is the current view (day, month, year)\n function initialState() {\n return {\n get selectedDate() {\n return selectedDate;\n },\n set selectedDate(dt) {\n if (dt && !opts.inRange(dt)) {\n return;\n }\n\n if (dt) {\n selectedDate = new Date(dt);\n dp.state.hilightedDate = selectedDate;\n } else {\n selectedDate = dt;\n }\n\n dp.updateInput(selectedDate);\n emit('select');\n dp.close();\n },\n view: 'day',\n };\n }\n\n return dp;\n }\n\n function createContainerElement(opts, containerHTML) {\n var el = document.createElement('div');\n\n el.className = opts.mode;\n el.innerHTML = containerHTML;\n\n return el;\n }\n\n function attachInputEvents(input, dp) {\n var bufferShow = bufferFn(5, function () {\n if (dp.shouldHide()) {\n dp.close();\n } else {\n dp.open();\n }\n });\n\n var off = [\n on('blur', input, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n })),\n\n on('mousedown', input, function () {\n if (input === document.activeElement) {\n bufferShow();\n }\n }),\n\n on('focus', input, bufferShow),\n\n on('input', input, function (e) {\n var date = dp.opts.parse(e.target.value);\n isNaN(date) || dp.setState({\n hilightedDate: date\n });\n }),\n ];\n\n // Unregister all events that were registered above.\n return function() {\n off.forEach(function (f) {\n f();\n });\n };\n }\n\n function focusCurrent(dp) {\n var current = dp.el.querySelector('.dp-current');\n return current && current.focus();\n }\n\n function attachContainerEvents(dp) {\n var el = dp.el;\n var calEl = el.querySelector('.dp');\n\n // Hack to get iOS to show active CSS states\n el.ontouchstart = noop;\n\n function onClick(e) {\n e.target.className.split(' ').forEach(function(evt) {\n var handler = dp.currentView().onClick[evt];\n handler && handler(e, dp);\n });\n }\n\n // The calender fires a blur event *every* time we redraw\n // this means we need to buffer the blur event to see if\n // it still has no focus after redrawing, and only then\n // do we return focus to the input. A possible other approach\n // would be to set context.redrawing = true on redraw and\n // set it to false in the blur event.\n on('blur', calEl, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n }));\n\n on('keydown', el, function (e) {\n if (e.keyCode === Key.enter) {\n onClick(e);\n } else {\n dp.currentView().onKeyDown(e, dp);\n }\n });\n\n // If the user clicks in non-focusable space, but\n // still within the date picker, we don't want to\n // hide, so we need to hack some things...\n on('mousedown', calEl, function (e) {\n e.target.focus && e.target.focus(); // IE hack\n if (document.activeElement !== e.target) {\n e.preventDefault();\n focusCurrent(dp);\n }\n });\n\n on('click', el, onClick);\n }\n\n function focusInput(input) {\n // When the modal closes, we need to focus the original input so the\n // user can continue tabbing from where they left off.\n input.focus();\n\n // iOS zonks out if we don't blur the input, so...\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {\n input.blur();\n }\n }\n\n /**\n * @file Defines the modal date picker behavior.\n */\n\n function ModalMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n // In modal mode, users really shouldn't be able to type in\n // the input, as all input is done via the calendar.\n input.readonly = true;\n\n // In modal mode, we need to know when the user has tabbed\n // off the end of the calendar, and set focus to the original\n // input. To do this, we add a special element to the DOM.\n // When the user tabs off the bottom of the calendar, they\n // will tab onto this element.\n dp.containerHTML += '.';\n\n return dp;\n }\n\n /**\n * @file Defines the dropdown date picker behavior.\n */\n\n function DropdownMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n dp.shouldFocusOnBlur = false;\n\n Object.defineProperty(dp, 'shouldFocusOnRender', {\n get: function() {\n return input !== document.activeElement;\n }\n });\n\n dp.adjustPosition = function () {\n autoPosition(input, dp);\n };\n\n return dp;\n }\n\n function autoPosition(input, dp) {\n var inputPos = input.getBoundingClientRect();\n var win = window;\n\n adjustCalY(dp, inputPos, win);\n adjustCalX(dp, inputPos, win);\n\n dp.el.style.visibility = '';\n }\n\n function adjustCalX(dp, inputPos, win) {\n var cal = dp.el;\n var scrollLeft = win.pageXOffset;\n var inputLeft = inputPos.left + scrollLeft;\n var maxRight = win.innerWidth + scrollLeft;\n var offsetWidth = cal.offsetWidth;\n var calRight = inputLeft + offsetWidth;\n var shiftedLeft = maxRight - offsetWidth;\n var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;\n\n cal.style.left = left + 'px';\n }\n\n function adjustCalY(dp, inputPos, win) {\n var cal = dp.el;\n var scrollTop = win.pageYOffset;\n var inputTop = scrollTop + inputPos.top;\n var calHeight = cal.offsetHeight;\n var belowTop = inputTop + inputPos.height + 8;\n var aboveTop = inputTop - calHeight - 8;\n var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);\n var top = isAbove ? aboveTop : belowTop;\n\n if (cal.classList) {\n cal.classList.toggle('dp-is-above', isAbove);\n cal.classList.toggle('dp-is-below', !isAbove);\n }\n cal.style.top = top + 'px';\n }\n\n /**\n * @file Defines the permanent date picker behavior.\n */\n\n function PermanentMode(root, emit, opts) {\n var dp = BaseMode(root, emit, opts);\n\n dp.close = noop;\n dp.destroy = noop;\n dp.updateInput = noop;\n dp.shouldFocusOnRender = opts.shouldFocusOnRender;\n\n dp.computeSelectedDate = function () {\n return opts.hilightedDate;\n };\n\n dp.attachToDom = function () {\n root.appendChild(dp.el);\n };\n\n dp.open();\n\n return dp;\n }\n\n /**\n * @file Defines the various date picker modes (modal, dropdown, permanent)\n */\n\n function Mode(input, emit, opts) {\n input = input && input.tagName ? input : document.querySelector(input);\n\n if (opts.mode === 'dp-modal') {\n return ModalMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-below') {\n return DropdownMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-permanent') {\n return PermanentMode(input, emit, opts);\n }\n }\n\n /**\n * @file Defines simple event emitter behavior.\n */\n\n /**\n * Emitter constructs a new emitter object which has on/off methods.\n *\n * @returns {EventEmitter}\n */\n function Emitter() {\n var handlers = {};\n\n function onOne(name, handler) {\n (handlers[name] = (handlers[name] || [])).push(handler);\n }\n\n function onMany(fns) {\n for (var name in fns) {\n onOne(name, fns[name]);\n }\n }\n\n return {\n on: function (name, handler) {\n if (handler) {\n onOne(name, handler);\n } else {\n onMany(name);\n }\n\n return this;\n },\n\n emit: function (name, arg) {\n (handlers[name] || []).forEach(function (handler) {\n handler(name, arg);\n });\n },\n\n off: function (name, handler) {\n if (!name) {\n handlers = {};\n } else if (!handler) {\n handlers[name] = [];\n } else {\n handlers[name] = (handlers[name] || []).filter(function (h) {\n return h !== handler;\n });\n }\n\n return this;\n }\n };\n }\n\n /**\n * @file The root date picker file, defines public exports for the library.\n */\n\n /**\n * The date picker language configuration\n * @typedef {Object} LangOptions\n * @property {Array.} [days] - Days of the week\n * @property {Array.} [months] - Months of the year\n * @property {string} today - The label for the 'today' button\n * @property {string} close - The label for the 'close' button\n * @property {string} clear - The label for the 'clear' button\n */\n\n /**\n * The configuration options for a date picker.\n *\n * @typedef {Object} DatePickerOptions\n * @property {LangOptions} [lang] - Configures the label text, defaults to English\n * @property {('dp-modal'|'dp-below'|'dp-permanent')} [mode] - The date picker mode, defaults to 'dp-modal'\n * @property {(string|Date)} [hilightedDate] - The date to hilight if no date is selected\n * @property {function(string|Date):Date} [parse] - Parses a date, the complement of the \"format\" function\n * @property {function(Date):string} [format] - Formats a date for displaying to user\n * @property {function(Date):string} [dateClass] - Associates a custom CSS class with a date\n * @property {function(Date):boolean} [inRange] - Indicates whether or not a date is selectable\n * @property {(string|Date)} [min] - The minimum selectable date (inclusive, default 100 years ago)\n * @property {(string|Date)} [max] - The maximum selectable date (inclusive, default 100 years from now)\n */\n\n /**\n * The state values for the date picker\n *\n * @typedef {Object} DatePickerState\n * @property {string} view - The current view 'day' | 'month' | 'year'\n * @property {Date} selectedDate - The date which has been selected by the user\n * @property {Date} hilightedDate - The date which is currently hilighted / active\n */\n\n /**\n * An instance of TinyDatePicker\n *\n * @typedef {Object} DatePicker\n * @property {DatePickerState} state - The values currently displayed.\n * @property {function} on - Adds an event handler\n * @property {function} off - Removes an event handler\n * @property {function} setState - Changes the current state of the date picker\n * @property {function} open - Opens the date picker\n * @property {function} close - Closes the date picker\n * @property {function} destroy - Destroys the date picker (removing all handlers from the input, too)\n */\n\n /**\n * TinyDatePicker constructs a new date picker for the specified input\n *\n * @param {HTMLElement | string} input The input or CSS selector associated with the datepicker\n * @param {DatePickerOptions} opts The options for initializing the date picker\n * @returns {DatePicker}\n */\n function TinyDatePicker(input, opts) {\n var emitter = Emitter();\n var options = DatePickerOptions(opts);\n var mode = Mode(input, emit, options);\n var me = {\n get state() {\n return mode.state;\n },\n on: emitter.on,\n off: emitter.off,\n setState: mode.setState,\n open: mode.open,\n close: mode.close,\n destroy: mode.destroy,\n };\n\n function emit(evt) {\n emitter.emit(evt, me);\n }\n\n return me;\n }\n\n return TinyDatePicker;\n\n})));\n","/*!\n * Unidragger v2.3.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( [\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'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._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\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\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\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar 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\nproto.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\nproto.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 */\nproto.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\nproto._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\nproto.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 */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._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\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._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\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._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\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.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\nproto._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\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n","/*!\n * Unipointer v2.3.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( [\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'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.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 */\nproto._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 ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.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\nproto.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\nproto.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\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.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 */\nproto._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\nproto.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\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._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\nproto._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\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.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 */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.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 */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.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 */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\n/**\n * Finds all elements with a \"data-module-init\" attribute\n * and calls the corresponding script\n */\nfunction initializeModules() {\n var modules = document.querySelectorAll( \"[data-module-init]\" );\n\n for ( var i = 0; i < modules.length; i++ ) {\n var el = modules[ i ];\n var $el = $( el );\n var name = el.getAttribute( \"data-module-init\" );\n\n // Find the module script\n try {\n var Module = require( \"modules/\" + name );\n } catch ( e ) {\n console.log( e.toString() );\n var Module = false;\n }\n\n // Initialize the module with the calling element\n if ( typeof Module === \"function\" && !$el.data( \"module\" ) ) {\n var mod = new Module( el );\n\n // Save module instance to jQuery data\n $( el ).data( \"module\", mod );\n }\n }\n}\n\nmodule.exports = initializeModules;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar initializeModules = require( \"./lib/init-modules.js\" );\n\n$(function() {\n\tinitializeModules();\n});\n"]}