{"version":3,"sources":["app.min.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","dep","init","performance","analytics","svg","handlebarsHelpers","history","navigation","video","quotes","partnerCarousel","customSelectBox","genericSearch","genericPager","participantsView","resultHandling","ideaHandling","socialMedia","imageUpload","formHandling","formEventHandling","sideBarImageLoader","yearbookPager","generalLoader","generalPager","whoGoesLoader","gallery","cookiePolicy","linkedinImport","boxCarousel","isInstantiated","getInstance","./utils/analytics","./utils/cookie-layer.js","./utils/custom-selectbox","./utils/form-event-handling","./utils/general-form-handling","./utils/general-pager-handling","./utils/generic-pager-handling","./utils/generic-search-handling","./utils/handlebars-helpers","./utils/history","./utils/idea-handling","./utils/image-upload","./utils/linkedin-import.js","./utils/performance","./utils/quotes","./utils/result-handling","./utils/socialmedia","./utils/svg","./utils/video","./views/box-carousel.js","./views/gallery.js","./views/general-loader","./views/navigation","./views/participants-view","./views/partners-carousel","./views/sidebar-image-loader","./views/whogoes-loader","./views/yearbook-pager","2","App","window","./app","3","trackingId","isAnalyticsEnabled","addEventListener","initDOMElements","injectGA","checkGaLoaded","$window","getCachedDom","$body","$subnavLinks","$","$participantsTable","$participantsPager","$discussions","$faqQuestions","undefined","ga","clearTimeout","checkTid","setTimeout","remove","analyticsURL","initBindings","linkTypesSelector","mainNavLinksSelector","footerLinksSelector","socialLinksSelector","pageTitleSelector","on","submit","gaLabel","$form","currentTarget","data","find","val","collectGAData","click","category","this","is","parent","trackEvent","attr","trackEventOnLink","scroll","page","matchMedia","addListener","mql","matches","mousedown","mouseleave","fieldTypes","$fieldset","allFieldsFilled","profileSectionsFilled","each","$fieldType","text","indexOf","m","document","g","GoogleAnalyticsObject","q","push","arguments","Date","createElement","id","getElementsByTagName","async","src","parentNode","insertBefore","pageView","url","$obj","type","action","label","value","console","./performance.js","4","checkCookieLayer","$layer","preventDefault","hideCookieLayer","localStorage","getItem","showCookieLayer","removeCookieLayer","setItem","removeClass","addClass","./performance","5","createCookie","name","expirationDate","date","expires","splitDate","split","toUTCString","cookie","encodeURI","6","SelectBox","hideSelected","7","loaderClass","hb","handlebars","isActivities","serviceURL","pageID","eventID","pageIndex","pageUrl","sortHandling","$pager","$ideaTitle","verificationToken","pageSize","change","sendRequest","titleArray","ideaID","closest","ideaTitle","ideaDescription","editIdea","limitIdeaTitleLength","createIdea","keyup","parents","removeIdea","$thisIdea","$toggleLike","likeIdea","sendEdit","eventId","pageId","ideaId","titleLength","charsLeft","$ideaTitleHint","target","ideaTitleMaxLength","substr","method","removeData","hideLoader","showDelayedLoader","clearPreviousEditPromise","EventId","RootId","IdeaId","$removePromise","ajax","JSON","stringify","contentType","dataType","headers","__RequestVerificationToken","when","then","result","IsSuccess","location","reload","likeData","$likePromise","formData","generalFormHandling","createDataObject","serializeArray","removeFormErrors","$editPromise","GenericError","handleGenericError","fielderrors","handleFormErrors","pagerUrlBase","pagerUrl","sortData","DiscussionsPageId","sortQueryString","PageIndex","PageSize","SortBy","SortDesc","fromHistory","totalPages","pushStateObj","clearPreviousPromise","$hbWrapper","browserUrl","$discussionPromise","Math","ceil","Total","css","display","hasClass","html","createPagers","setPagerStates","pushState","title","getTpl","readyState","abort","loaderTid","showLoader","loaderDelay","../views/general-loader","../views/participants-view","./general-form-handling","./general-pager-handling","./handlebars-helpers","8","profileID","eventChangedByUser","updateEventID","EventProfileID","$eventPromise","updateFormFields","ProfileData","updateCancelAttendanceLink","CancelAttendanceUrl","scrollTo","profileData","selectbox","removeActivities","getCheckedActivites","key","match","updatePhoneFields","addItem","prop","k","v","createActivity","Name","Value","checkedActivites","$formElement","phoneData","$phoneElement","columnName","activityName","activityID","activityHTML","returnValue","append","9","prepareForm","checkPassword","checkPasswordIdentity","loadMoreContent","$elem","$loadMoreContentWrapper","templateId","loaderData","skipIndex","parseInt","clearPreviousLoadMorePromise","$loadMorePromise","UpcomingEvents","insertAfter","last","PreviousEvents","show","appendTo","HasMore","hide","$input","isValid","re","first","test","targetVal","$target","toLowerCase","sendForm","$formPromise","ResponseMessage","AutoLoginCookieName","AutoLoginCookieValue","AutoLoginCookieExp","RedirectUrl","handleRedirect","trigger","removeAttr","errors","$element","$firstError","errorItem","scrollTop","offset","top","error","shortName","formattedData","hasNewsletter","replace","getElementById","checked","isArray","join","IsNewsletter","./analytics","./cookie","10","preparePageRequest","$pagerItem","direction","serviceUrl","selectedPage","currentPage","handlebarsId","index","pageindex","$pagerPromise","currentIndex","$pagerObj","blur","stepsStart","actualPagerSize","nextMoreStep","prevMoreStep","pagerHtml","selectedYearQueryParam","SelectedYear","globalPagerSize","min","11","initSettings","settings","size","total","active","pagesToShow","isFirst","isLast","shouldDisplay","input","onPagerEvent","updatePager","extend","compile","pagerData","pages","prev","next","start","floor","max","end","number","dots","12","$searchWrapper","formEl","tpl","responseKey","isLoadMore","search","applyQueryString","pager-change","send-request","initSortBindings","sort-change","collectFormData","inputs","inputsArr","Array","prototype","slice","forEach","item","buildQueryString","object","queryString","Object","keys","map","hasAttribute","filter","keyVal","parseQueryString","queries","queryObj","tick","el","hasOwnProperty","$promise","sortby","sortdesc","genericSort","isSortInit","$parent","$sortInput","$descInput","updateSettings","update","./generic-pager-handling","./generic-sort-handling","13","onSortEvent","14","Handlebars","registerHelpers","$this","registerPartial","registerHelper","str","v1","v2","options","fn","inverse","operator","equalityCheck","compareCheck","andOrCheck","15","onpopstate","event","state","discussionsHandling","./discussion-handling","16","$ideaContainer","initOverlayBindings","$overlay","likeEndpoint","onIdeaAction","createOrEditIdea","onLikeSuccess","$amount","parse","compileOverlay","initOverlayFormBindings","form-success","closeOverlay","limitInputLength","$tip","maxLength","successCallback","errorCallback","clearPendingPromise","promise","17","initVariables","initImageUpload","$document","$cropOverlay","$cancelBtn","$cropBtn","$cropImageContainer","$canvas","$cropErrorMessage","$fileInput","$uploadContainer","$photoFieldset","$imagePreview","$uploadErrorMessage","$topAvatar","$imageIdField","$savedIdField","saveCroppedImageService","uploadImageService","emailAddress","trim","PId","timeout","dropZoneTimeout","draggedClass","droppedFiles","originalEvent","dataTransfer","files","fileupload","click.closeCrop","close","click.dCrop","crop","dropZone","canDrag","disableValidation","done","HasErrors","href","imageCropSettings","image","preloadImage","setSize","insertImage","initJCrop","open","add","resetButtons","overlayOpenedClass","empty","resetCanvas","img","Image","overlayContentHeight","innerHeight","scaledW","scaledH","setW","setH","imageH","originalheight","imageW","originalwidth","ratio","resizedImageWidth","resizedImageHeight","windowRatio","width","height","largerThanScreen","buttonsHeight","setAttribute","$image","setSelectDimensions","left","Jcrop","bgFade","bgOpacity","setSelect","minSize","aspectRatio","onSelect","setCoords","jcropApi","drawImageToCanvas","context","getContext","$img","imgW","imgH","ratioY","ratioX","getX","coordinates","x","getY","y","getWidth","w","getHeight","h","drawImage","getCanvasData","ret","toDataURL","sendImageData","imageData","cache","ImageId","BaseValue","Email","handleCropSuccess","showCropError","fail","ImageUrl","SavedId","c","x2","y2","18","AppLinkedinConnect","origin","AppPerformance","Deferred","destroyCallback","createCallback","openWindow","linkedinAuth","bind","serviceData","loadService","getDeviceProperties","resolve","reject","19","$inputLinkedInProfileLink","linkedinUrl","importFromLinkedin","connection","$parentFormElement","errorClass","PublicUrl","linkedinConnect","./linkedin-connect","20","initCacheDOM","initTouch","saveDeviceProperties","$cachedDOM","body","$html","$head","$htmlbody","style","touchAction","FastClick","attach","deviceProperties","resizeTid","d","documentElement","W","innerWidth","clientWidth","H","clientHeight","navigator","pixelRatio","devicePixelRatio","21","slideToClasses","apply","checkForQuotes","initQuotes","params","quotesData","$wrapper","tid","auto","delay","loop","updateQuotes","$sources","$slides","eq","clearRequestTimeout","requestTimeout","22","initMasonryGrid","$masonryGrid","$mansoryItem","pageNumber","scrolling","resize","currentHeight","windowHeight","ready","unbind","outerWidth","isotope","layoutMode","itemSelector","percentPosition","updateMasonryGrid","itemsHTML","$items","resultData","$articlesPromise","processData","HasNext","PageNumber","23","checkSocialMedia","ideaUrl","twitterUser","twitterShare","tweet","shareUrl","opts","escapedTweet","encodeURIComponent","escapedUrl","twButton","liButton","loadTwitter","loadLinkedin","js","liScript1","liScript2","twttr","fjs","_e","24","svgUrl","checkAssetRoot","loadSvg","addSpriteToDOM","sprite","25","targets","injectYTScript","firstScriptTag","tag","onYouTubeIframeAPIReady","player","videoId","playerVars","rel","iv_load_policy","assign","YT","Player","events","onReady","playerReady","onStateChange","playerStateChange","players","playVideo","videoData","getVideoData","$autoPlay","video_id","$cover","TypeError","source","../utils/performance","26","lazyLoadImages","tmp","Carousel","querySelectorAll","getAttribute","onload","removeAttribute","$carousel","initBoxCarousel","$boxCarouselItem","boxCarouselTimer","itemCount","actualStep","random","animateBoxCarousel","./../utils/performance","27","$gallery","photos","$hbOverlayWrapper","handleGallerySources","loadImages","setupDensity","$galleryOverlay","targetURL","handleOverlay","isGallerySlideshowActive","closeGalleryOverlay","keydown","which","keyCode","isGalleryOverlayActive","prevURL","nextURL","targetIndex","prevIndex","nextIndex","lastIndex","arrayLength","overlaySources","Src","currentURL","openGalleryOverlay","handleGestures","galleryOverlay","galleryGestures","Hammer","get","set","threshold","ev","../utils/handlebars-helpers","28","initBinding","pressResultLoader","isLoaderActive","moreText","loadButton","29","checkForLoginRequest","handleResize","$header","$subNavigation","className","classNames","pageContentScrolled","resizedFinished","closePanel","togglePanel","handleBodyClick","detachBindings","initDesktopBindings","initTouchBindings","off","mouseenter","toggleSubnavigation","closeSubNavigation","has","openPanel","isMobile","$subNavigationItem","siblings","currentSubnavigationId","openSubNavigation","htmlActive","subNavigationActive","30","$participants","toggleParticipantInfo","not","scrollIntoView","behavior","block","31","initPartnerLogos","$partners","$partnersInner","$partnerItem","countPartnerItems","diff","partnerItemClone","clone","currentTime","movePartnerLogos","dif","getTime","transform","requestAnimationFrame","32","imageOnlySidebarSources","initLayout","appendImages","$pageContent","$sideBar","availableHeight","imageType","imageHeight","minSidebarHeight","sidebarLayoutSettings","minHeight","pattern","layoutPattern","patternLength","screenEstateAvailable","getFullSizeRelativeHeight","getRatio","layout","j","gridItem","imageGridItems","createDocumentFragment","imgClasses","imageClasses","ptrnClasses","patternClasses","classList","appendChild","fullSizeImageWidth","fullSizeImageHeight","imageWidthToHeightRatio","full","half","33","setGuestImages","isInViewport","element","rect","getBoundingClientRect","bottom","right","34","$page","$yearbookSlider","showPreviousSliderItem","showNextSliderItem","adjustSliderHeight","recalculate","configWebAPI","yearbookAPIParams","initSlider","indexOfActiveEl","numOfSliderItems","ImageFolderID","sliderInstance","unslider","nav","arrows","lazyLoadActiveImage","Images","outerHeight","$el","contains"],"mappings":"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","file":"app.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o -1) {\r\n\t\t\t\t\tif ($(e.currentTarget).attr('target') === '_blank') {\r\n\t\t\t\t\t\ttrackEvent('Press', 'Click', 'Press link clicked click');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttrackEventOnLink($(e.currentTarget).attr('href'), 'Press', 'Click', 'Press link clicked click');\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, pageTitleSelector + '+ div .text-content__full-copy p a');\r\n\r\n\t}\r\n\r\n\tfunction injectGA() {\r\n\t\tvar i = window,\r\n\t\t\ts = document,\r\n\t\t\to = 'script',\r\n\t\t\tg = analyticsURL,\r\n\t\t\tr = 'ga',\r\n\t\t\ta, m;\r\n\r\n\t\tif (!trackingId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ti.GoogleAnalyticsObject = r;\r\n\r\n\t\ti[r] = i[r] || function () {\r\n\t\t\t(i[r].q = i[r].q || []).push(arguments);\r\n\t\t};\r\n\r\n\t\ti[r].l = new Date();\r\n\r\n\t\ta = s.createElement(o);\r\n\t\ta.id = 'analyticsSDK';\r\n\t\tm = s.getElementsByTagName(o)[0];\r\n\r\n\t\ta.async = 1;\r\n\t\ta.src = g;\r\n\t\tm.parentNode.insertBefore(a, m);\r\n\r\n\t\tga('create', trackingId, 'auto');\r\n\t\tga('require', 'displayfeatures');\r\n\t\tga('send', 'pageview');\r\n\t\tga('require', 'linker');\r\n\t}\r\n\r\n\tfunction pageView(url) {\r\n\t\tif (window.ga) {\r\n\t\t\twindow.ga('send', 'pageview', url);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction collectGAData($obj) {\r\n\t\tvar type = $obj.attr('data-ga-type') || false,\r\n\t\t\tdata;\r\n\r\n\t\tif (type === 'event') {\r\n\t\t\tdata = {};\r\n\t\t\tdata.category = $obj.attr('data-ga-category');\r\n\t\t\tdata.action = $obj.attr('data-ga-action');\r\n\t\t\tdata.label = $obj.attr('data-ga-label');\r\n\t\t\ttrackEvent(data.category, data.action, data.label);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction trackEvent(category, action, label, value) {\r\n\t\ttry {\r\n\t\t\tif (value) {\r\n\t\t\t\tga('send', 'event', category, action, label, value);\r\n\t\t\t} else {\r\n\t\t\t\tga('send', 'event', category, action, label);\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('Analytics error!');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction trackEventOnLink(url, category, action, label) {\r\n\t\ttry {\r\n\t\t\tga('send', 'event', category, action, label);\r\n\t\t} catch (e) {\r\n\t\t\tif (window.console) {\r\n\t\t\t\tconsole.warn('Analytics error!');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tpageView: pageView,\r\n\t\tcollectGAData: collectGAData,\r\n\t\ttrackEvent: trackEvent,\r\n\t\ttrackEventOnLink: trackEventOnLink\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance.js')\r\n\t}\r\n));\r\n\n},{\"./performance.js\":20}],4:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$layer;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t\tcheckCookieLayer();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$layer = $body.find('[data-cookie-layer]');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\thideCookieLayer();\r\n\t\t\t}\r\n\t\t}, '[data-cookie-agree]');\r\n\t}\r\n\r\n\tfunction checkCookieLayer() {\r\n\r\n\t\tif (window.localStorage) {\r\n\t\t\tif (window.localStorage.getItem('stream-cookie-policy') === null) {\r\n\t\t\t\tshowCookieLayer();\r\n\t\t\t} else {\r\n\t\t\t\tremoveCookieLayer();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction hideCookieLayer() {\r\n\t\tif (window.localStorage) {\r\n\t\t\twindow.localStorage.setItem('stream-cookie-policy', 1);\r\n\t\t}\r\n\t\t$layer.removeClass('cookie-policy--show');\r\n\t}\r\n\r\n\tfunction showCookieLayer() {\r\n\t\t$layer.addClass('cookie-policy--show');\r\n\t}\r\n\r\n\tfunction removeCookieLayer() {\r\n\t\t$layer.remove();\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\n},{\"./performance\":20}],5:[function(require,module,exports){\nmodule.exports = (function () {\r\n\t'use strict';\r\n\r\n\tvar exports;\r\n\r\n\tfunction createCookie(name, value, expirationDate) {\r\n\t\tvar date,\r\n\t\t\texpires,\r\n\t\t\tsplitDate;\r\n\r\n\t\tif (expirationDate) {\r\n\t\t\tsplitDate = expirationDate.split('/');\r\n\t\t\tdate = new Date(splitDate[2], splitDate[1], splitDate[0]);\r\n\t\t\texpires = '; expires=' + date.toUTCString();\r\n\t\t} else {\r\n\t\t\texpires = '';\r\n\t\t}\r\n\t\tdocument.cookie = encodeURI(name) + '=' + encodeURI(value) + expires +'; path=/';\r\n\t}\r\n\r\n\texports = {\r\n\t\tcreateCookie: createCookie\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}());\r\n\n},{}],6:[function(require,module,exports){\nmodule.exports = (function () {\r\n\t'use strict';\r\n\r\n\tvar exports;\r\n\r\n\tfunction init() {\r\n\t\t$('[data-selectbox]').each(function () {\r\n\t\t\t$(this).data('custom-selectbox', new SelectBox($(this), {\r\n\t\t\t\thideSelected: false\r\n\t\t\t}));\r\n\t\t});\r\n\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\n},{\"./performance\":20}],7:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$discussions,\r\n\t\tbrowserUrl,\r\n\t\tpageUrl,\r\n\t\tserviceURL,\r\n\t\tpageID,\r\n\t\teventID,\r\n\t\tideaID,\r\n\t\tideaTitle,\r\n\t\tideaDescription,\r\n\t\tpageIndex,\r\n\t\tpageSize,\r\n\t\tsortData = {},\r\n\t\tsortQueryString,\r\n\t\tloaderClass,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\thb,\r\n\t\t$hbWrapper,\r\n\t\t$pager,\r\n\t\t$ideaTitle,\r\n\t\tideaTitleMaxLength = 140,\r\n\t\t$discussionPromise,\r\n\t\t$editPromise,\r\n\t\t$removePromise,\r\n\t\t$likePromise,\r\n\t\tisActivities = false,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\thb = dep.handlebars;\r\n\r\n\t\tif ($discussions.length > 0) {\r\n\t\t\tif($discussions.attr('data-activity')) {\r\n\t\t\t\tisActivities = true;\r\n\t\t\t}\r\n\t\t\tserviceURL = $discussions.attr('data-service-url');\r\n\t\t\tpageID = $discussions.attr('data-discussion-page-id');\r\n\t\t\teventID = $discussions.attr('data-event-id');\r\n\t\t\tpageIndex = $discussions.attr('data-page-index');\r\n\t\t\tpageUrl = $discussions.attr('data-pageurl');\r\n\r\n\t\t\tsortHandling();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$discussions = $('[data-discussions]');\r\n\t\t$pager = $body.find('[data-pager]');\r\n\t\t$ideaTitle = $('#idea-title');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\r\n\t\tpageSize = 0;\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tchange: function () {\r\n\t\t\t\tpageIndex = 1;\r\n\t\t\t\tsortHandling();\r\n\t\t\t\tsendRequest();\r\n\t\t\t}\r\n\t\t}, '#discussion-sort');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tvar titleArray;\r\n\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tideaID = $(e.currentTarget).closest('[data-idea]').attr('data-idea-id');\r\n\t\t\t\tideaTitle = $(e.currentTarget).closest('[data-idea]').find('[data-idea-title]').text();\r\n\t\t\t\ttitleArray = ideaTitle.split('|');\r\n\t\t\t\tideaTitle = titleArray[0];\r\n\t\t\t\tideaDescription = $(e.currentTarget).closest('[data-idea]').find('[data-idea-description]').text();\r\n\t\t\t\teditIdea(eventID, pageID, ideaID, ideaTitle, ideaDescription);\r\n\r\n\t\t\t\tif (ideaTitle.length > 0) {\r\n\t\t\t\t\tlimitIdeaTitleLength();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-edit-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tcreateIdea(eventID, pageID);\r\n\t\t\t\tif ($ideaTitle.val().length > 0) {\r\n\t\t\t\t\t$('[data-overlay] #idea-title').val('');\r\n\t\t\t\t\t$('[data-overlay] #idea-text').val('');\r\n\t\t\t\t\tlimitIdeaTitleLength();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-start-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tkeyup: limitIdeaTitleLength\r\n\t\t}, '#idea-title');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tideaID = $(e.currentTarget).parents().find('#idea-id').val();\r\n\t\t\t\teventID = $(e.currentTarget).parents().find('#event-id').val();\r\n\t\t\t\tpageID = $(e.currentTarget).parents().find('#root-id').val();\r\n\t\t\t\tremoveIdea(eventID, pageID, ideaID);\r\n\t\t\t}\r\n\t\t}, '[data-remove-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tvar $thisIdea,\r\n\t\t\t\t\t$toggleLike;\r\n\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t$thisIdea = $(e.currentTarget).closest('[data-idea]');\r\n\t\t\t\t$toggleLike = $thisIdea.find('[data-liked]');\r\n\t\t\t\tideaID = $thisIdea.attr('data-idea-id');\r\n\r\n\t\t\t\tif ($toggleLike.attr('data-liked') === 'liked') {\r\n\t\t\t\t\t$toggleLike.attr('data-liked', 'un-liked');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$toggleLike.attr('data-liked', 'liked');\r\n\t\t\t\t}\r\n\t\t\t\tlikeIdea(eventID, pageID, ideaID);\r\n\t\t\t}\r\n\t\t}, '[data-likeable=\"likeable\"] [data-liked]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tsendEdit('submit');\r\n\t\t\t}\r\n\t\t}, '[data-submit-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tsendEdit('edit');\r\n\t\t\t}\r\n\t\t}, '[data-submit-edited-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tideaID = $(e.currentTarget).closest('[data-idea]').attr('data-idea-id');\r\n\t\t\t\t$('[data-overlay]').addClass('show show--remove');\r\n\t\t\t\t$('[data-overlay] #event-id').val('{' + eventID + '}');\r\n\t\t\t\t$('[data-overlay] #root-id').val('{' + pageID + '}');\r\n\t\t\t\t$('[data-overlay] #idea-id').val(ideaID);\r\n\t\t\t}\r\n\t\t}, '[data-delete-idea]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\t$('[data-overlay]').removeClass('show show--submit show--edit show--remove');\r\n\t\t\t}\r\n\t\t}, '[data-close], [data-cancel]');\r\n\t}\r\n\r\n\tfunction createIdea(eventId, pageID) {\r\n\t\t$('[data-overlay] #event-id').val('{' + eventId + '}');\r\n\t\t$('[data-overlay] #root-id').val('{' + pageID + '}');\r\n\t\t$('[data-overlay]').addClass('show show--submit');\r\n\t}\r\n\r\n\tfunction editIdea(eventId, pageId, ideaId, ideaTitle, ideaDescription) {\r\n\t\t$('[data-overlay] #event-id').val('{' + eventId + '}');\r\n\t\t$('[data-overlay] #root-id').val('{' + pageId + '}');\r\n\t\t$('[data-overlay] #idea-id').val(ideaId);\r\n\t\t$('[data-overlay] #idea-title').val(ideaTitle);\r\n\t\t$('[data-overlay] #idea-text').val(ideaDescription);\r\n\t\t$('[data-overlay]').addClass('show show--edit');\r\n\t}\r\n\r\n\tfunction limitIdeaTitleLength(e) {\r\n\t\tvar titleLength,\r\n\t\t\tcharsLeft,\r\n\t\t\tideaTitle,\r\n\t\t\t$ideaTitleHint = $('[data-overlay].show [for=\"idea-title\"] .helper-text');\r\n\r\n\t\tideaTitle = e ? $(e.target).val() : $ideaTitle.val();\r\n\r\n\t\ttitleLength = ideaTitle.length;\r\n\t\tcharsLeft = ideaTitleMaxLength - titleLength;\r\n\r\n\t\tif (charsLeft <= 0) {\r\n\t\t\t$ideaTitle.val(ideaTitle.substr(0, ideaTitleMaxLength));\r\n\t\t\tcharsLeft = 0;\r\n\t\t} else if (charsLeft === ideaTitleMaxLength) {\r\n\t\t\t$ideaTitleHint.text('(in ' + ideaTitleMaxLength + ' characters)');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$ideaTitleHint.text('(' + charsLeft + ' character' + (charsLeft > 1 ? 's' : '') + ' left) ');\r\n\t}\r\n\r\n\tfunction removeIdea(eventId, pageId, ideaId) {\r\n\t\tvar url,\r\n\t\t\tmethod,\r\n\t\t\tremoveData;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousEditPromise();\r\n\r\n\t\tif(isActivities) {\r\n\t\t\turl = '/api/stream/activities/delete';\r\n\t\t} else {\r\n\t\t\turl = '/api/stream/discussions/delete';\r\n\t\t}\r\n\t\tmethod = 'post';\r\n\t\tremoveData = {EventId: eventId, RootId: pageId, IdeaId: ideaId};\r\n\r\n\t\t$removePromise = $.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: JSON.stringify(removeData),\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($removePromise).then(function (result) {\r\n\t\t\t// hideLoader();\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t}, 1000);\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction likeIdea(eventId, pageId, ideaId) {\r\n\t\tvar url,\r\n\t\t\tmethod,\r\n\t\t\tlikeData;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousEditPromise();\r\n\r\n\t\tif(isActivities) {\r\n\t\t\turl = '/api/stream/activities/togglelike';\r\n\t\t} else {\r\n\t\t\turl = '/api/stream/discussions/togglelike';\r\n\t\t}\r\n\r\n\t\tmethod = 'post';\r\n\t\tlikeData = {EventId: eventId, RootId: pageId, IdeaId: ideaId};\r\n\r\n\t\t$likePromise = $.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: JSON.stringify(likeData),\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($likePromise).then(function (result) {\r\n\t\t\t// hideLoader();\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t}, 1000);\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction sendEdit(type) {\r\n\t\tvar url,\r\n\t\t\tmethod,\r\n\t\t\tformData,\r\n\t\t\t$form;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousEditPromise();\r\n\r\n\t\t$form = $('[data-overlay] #' + type + '-idea-form');\r\n\t\turl = $form.attr('action');\r\n\t\tmethod = $form.attr('method');\r\n\t\tformData = dep.generalFormHandling.createDataObject($form.serializeArray());\r\n\r\n\t\tdep.generalFormHandling.removeFormErrors($form);\r\n\r\n\t\t$editPromise = $.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: JSON.stringify(formData),\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($editPromise).then(function (result) {\r\n\t\t\thideLoader();\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\t$('[data-overlay]').removeClass('show show--edit');\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t}, 1000);\r\n\t\t\t} else if (result && result.IsSuccess === false) {\r\n\r\n\t\t\t\tif (result.GenericError) {\r\n\t\t\t\t\tdep.generalFormHandling.handleGenericError($form, result.GenericError);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (result.fielderrors) {\r\n\t\t\t\t\tdep.generalFormHandling.handleFormErrors($form, result.fielderrors);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!result.fielderrors && !result.GenericError) {\r\n\t\t\t\t\tdep.generalFormHandling.handleGenericError($form, 'Service error! Please try again!');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\t$('[data-overlay]').removeClass('show show--edit');\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction sortHandling() {\r\n\t\tvar pagerUrlBase,\r\n\t\t\tpagerUrl;\r\n\r\n\t\tsortData.DiscussionsPageId = '{' + pageID + '}';\r\n\t\tsortQueryString = '?DiscussionsPageId={' + pageID + '}';\r\n\t\tsortData.PageIndex = pageIndex;\r\n\t\tsortData.PageSize = pageSize;\r\n\t\t// sortQueryString += '&PageSize=' + pageSize;\r\n\r\n\t\tif($('#discussion-sort').length > 0) {\r\n\t\t\t$.each($('#discussion-sort option:selected').val().split(/\\|/), function (i, val) {\r\n\t\t\t\tif (i === 0) {\r\n\t\t\t\t\tsortData.SortBy = val;\r\n\t\t\t\t\tsortQueryString += '&SortBy=' + val;\r\n\t\t\t\t} else if (i === 1) {\r\n\t\t\t\t\tsortData.SortDesc = val !== 'asc';\r\n\t\t\t\t\tsortQueryString += '&SortDesc=';\r\n\t\t\t\t\tsortQueryString += val !== 'asc';\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tsortData.SortBy = 'date';\r\n\t\t\tsortQueryString += '&SortBy=date';\r\n\t\t\tsortData.SortDesc = true;\r\n\t\t\tsortQueryString += '&SortDesc=true';\r\n\t\t}\r\n\r\n\t\tif ($pager.length > 0) {\r\n\t\t\tpagerUrlBase = $body.find('[data-pager]').attr('data-pager-url').split('?')[0];\r\n\t\t\tpagerUrl = pagerUrlBase + sortQueryString;\r\n\t\t\t$pager.attr('data-pager-url', pagerUrl);\r\n\t\t\t$pager.attr('data-pager-pageurl', pagerUrl);\r\n\t\t\t$pager.attr('data-pager-currentpage', pageIndex);\r\n\t\t}\r\n\r\n\t\tsortQueryString += '&PageIndex=' + pageIndex;\r\n\t}\r\n\r\n\tfunction sendRequest(data, fromHistory) {\r\n\t\tvar pushStateObj = {},\r\n\t\t\ttotalPages;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousPromise();\r\n\r\n\t\t$hbWrapper = $body.find('[data-hb-wrapper=\"discussion-item\"]');\r\n\r\n\t\tbrowserUrl = pageUrl.split('?')[0];\r\n\t\tif (browserUrl !== undefined) {\r\n\t\t\tbrowserUrl += sortQueryString;\r\n\t\t}\r\n\r\n\t\tsortData.PageIndex = pageIndex;\r\n\r\n\t\tif (fromHistory === true) {\r\n\t\t\tsortData = data;\r\n\t\t}\r\n\r\n\t\t$discussionPromise = $.ajax({\r\n\t\t\ttype: 'get',\r\n\t\t\turl: serviceURL,\r\n\t\t\tdata: sortData,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($discussionPromise).then(function (result) {\r\n\t\t\thideLoader();\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\r\n\t\t\t\ttotalPages = Math.ceil(result.Total / result.PageSize);\r\n\r\n\t\t\t\tif ($pager.length > 0) {\r\n\r\n\t\t\t\t\t$pager.attr('data-pager-totalpages', totalPages);\r\n\t\t\t\t\t$pager.attr('data-pager-currentpage', result.PageIndex);\r\n\r\n\t\t\t\t\tif (result.PageSize >= result.Total) {\r\n\t\t\t\t\t\t$pager.css({display: 'none'});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif ($pager.hasClass('pager--hidden')) {\r\n\t\t\t\t\t\t\t$pager.removeClass('pager--hidden');\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$pager.find('[data-pager-indexes]').html(dep.generalPager.createPagers(totalPages, result.PageIndex, pageUrl));\r\n\t\t\t\t\t\tdep.generalPager.setPagerStates($pager, result.PageIndex, totalPages);\r\n\t\t\t\t\t\t// $pager.find('[data-page]').first().addClass('stepper--active').siblings().removeClass('stepper--active');\r\n\t\t\t\t\t\t$pager.css({display: 'block'});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (window.history && fromHistory !== true) {\r\n\t\t\t\t\tpushStateObj.type = 'discussion-list';\r\n\t\t\t\t\tpushStateObj.sortData = sortData;\r\n\t\t\t\t\twindow.history.pushState(pushStateObj, document.title, browserUrl);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($hbWrapper.length > 0) {\r\n\t\t\t\t\t$hbWrapper.html(hb.getTpl('discussion-item')(result));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconsole.log('jump');\r\n\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction clearPreviousPromise() {\r\n\t\tif ($discussionPromise && $discussionPromise.readyState !== 4) {\r\n\t\t\t$discussionPromise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction clearPreviousEditPromise() {\r\n\t\tif ($editPromise && $editPromise.readyState !== 4) {\r\n\t\t\t$editPromise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tparticipantsView: require('../views/participants-view'),\r\n\t\thandlebars: require('./handlebars-helpers'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\tgeneralPager: require('./general-pager-handling'),\r\n\t\tgeneralFormHandling: require('./general-form-handling')\r\n\t}\r\n));\r\n\r\n\r\n\n},{\"../views/general-loader\":28,\"../views/participants-view\":30,\"./general-form-handling\":9,\"./general-pager-handling\":10,\"./handlebars-helpers\":14,\"./performance\":20}],8:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$eventPromise,\r\n\t\t$form,\r\n\t\t$formElement,\r\n\t\t$phoneElement,\r\n\t\tprofileID,\r\n\t\turl,\r\n\t\tmethod,\r\n\t\tcheckedActivites,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\tloaderClass,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\turl = '/api/stream/profile/getprofile';\r\n\t\tmethod = 'POST';\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$form = $('[data-form]');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tchange: function () {\r\n\t\t\t\tprofileID = $('option:selected', this).val();\r\n\t\t\t\teventChangedByUser(profileID);\r\n\t\t\t}\r\n\t\t}, '#EventID');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\t$('[data-overlay]').removeClass('show show--submit show--edit show--remove');\r\n\t\t\t}\r\n\t\t}, '[data-ok]');\r\n\t}\r\n\r\n\tfunction eventChangedByUser(id) {\r\n\t\tvar data;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tupdateEventID(id);\r\n\r\n\t\tdata = JSON.stringify({EventProfileID: id});\r\n\r\n\t\t$eventPromise = $.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: method,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($eventPromise).then(function (result) {\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\tupdateFormFields(result.ProfileData);\r\n\t\t\t\tupdateCancelAttendanceLink(result.ProfileData.CancelAttendanceUrl);\r\n\t\t\t}\r\n\r\n\t\t\thideLoader();\r\n\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\r\n\t\twindow.scrollTo(0, 0);\r\n\t}\r\n\r\n\tfunction updateEventID(id) {\r\n\t\t$('#EventProfileID').val(id);\r\n\t}\r\n\r\n\tfunction updateFormFields(profileData) {\r\n\t\tvar selectbox;\r\n\r\n\t\t$form = $('[data-form]');\r\n\r\n\t\tremoveActivities();\r\n\t\tgetCheckedActivites(profileData);\r\n\r\n\t\t$.each(profileData, function (key, value) {\r\n\t\t\tif (key.match(/Phone/ig)) {\r\n\t\t\t\tupdatePhoneFields(key, value);\r\n\t\t\t} else if (key === 'KnownParticipants') {\r\n\t\t\t\tselectbox = $('#' + key).data('custom-selectbox');\r\n\t\t\t\tselectbox.addItem(value, true, true);\r\n\t\t\t} else if (key === 'IsNewsletter') {\r\n\t\t\t\t$('#' + key).prop('checked', value);\r\n\t\t\t} else if (key.match(/ColumnActivities/ig)) {\r\n\t\t\t\t$.each(value, function (k, v) {\r\n\t\t\t\t\tcreateActivity(key, v.Name, v.Value, checkedActivites);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t$formElement = $form.find('[data-form-element=\"' + key + '\"]');\r\n\t\t\t\t$formElement.find('input').val(value);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction updateCancelAttendanceLink(url) {\r\n\t\t$form.find('[data-cancel-event-url]').attr('href', url);\r\n\t}\r\n\r\n\tfunction updatePhoneFields(key, phoneData) {\r\n\t\t$phoneElement = $('[data-form-element=\"' + key + '\"]');\r\n\r\n\t\t$.each(phoneData, function (k, v) {\r\n\t\t\tif(k === 'Prefix') {\r\n\t\t\t\t$phoneElement.find('option:selected').val(v);\r\n\t\t\t}\r\n\t\t\tif(k === 'PhoneNumber') {\r\n\t\t\t\t$phoneElement.find('input').val(v);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction removeActivities() {\r\n\t\t$('[data-column]').html('');\r\n\t}\r\n\r\n\tfunction createActivity(columnName, activityName, activityID, checkedActivites) {\r\n\t\tvar activityHTML = '',\r\n\t\t\treturnValue = true;\r\n\r\n\t\t$.each(checkedActivites, function( i, val ) {\r\n\t\t\tif(val === activityID) {\r\n\t\t\t\tactivityHTML = '
';\r\n\t\t\t\treturnValue = false;\r\n\t\t\t} else {\r\n\t\t\t\tactivityHTML = '
';\r\n\t\t\t\treturnValue = true;\r\n\t\t\t}\r\n\r\n\t\t\treturn returnValue;\r\n\t\t});\r\n\r\n\t\t$('[data-column='+ columnName +']').append(activityHTML);\r\n\t}\r\n\r\n\tfunction getCheckedActivites(data) {\r\n\t\t$.each(data, function (key, value) {\r\n\t\t\tif (key === 'Activities') {\r\n\t\t\t\tcheckedActivites = value;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tgeneralLoader: require('../views/general-loader')\r\n\t}\r\n));\r\n\n},{\"../views/general-loader\":28,\"./performance\":20}],9:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\t$body,\r\n\t\t$formPromise,\r\n\t\t$loadMorePromise,\r\n\t\thb,\r\n\t\tloaderClass,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\thb = dep.handlebars;\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tsubmit: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tprepareForm($(this));\r\n\t\t\t}\r\n\t\t}, '[data-form]');\r\n\r\n\t\t$body.on({\r\n\t\t\tkeyup: function () {\r\n\t\t\t\tcheckPassword($(this));\r\n\t\t\t}\r\n\t\t}, '[data-password-check]');\r\n\r\n\t\t$body.on({\r\n\t\t\tkeyup: function () {\r\n\t\t\t\tcheckPasswordIdentity($(this));\r\n\t\t\t}\r\n\t\t}, '[data-password-check-identity]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tloadMoreContent($(this));\r\n\t\t\t}\r\n\t\t}, '[data-load-more]');\r\n\t}\r\n\r\n\tfunction loadMoreContent($elem) {\r\n\t\tvar templateId = $elem.attr('data-load-more-tpl') || false,\r\n\t\t\ttarget = $elem.attr('data-load-more-target') || false,\r\n\t\t\turl = $elem.attr('data-load-more-url'),\r\n\t\t\t$loadMoreContentWrapper,\r\n\t\t\tloaderData = {},\r\n\t\t\tskipIndex = parseInt($elem.attr('data-load-more-skip'), 10);\r\n\r\n\t\tif ($elem.data('loaderData') === undefined && target === 'event-list') {\r\n\t\t\tloaderData.pageSize = 4;\r\n\t\t\tloaderData.pageIndex = skipIndex;\r\n\t\t} else if ($elem.data('loaderData') === undefined) {\r\n\t\t\tloaderData.pageSize = 4;\r\n\t\t\tloaderData.pageIndex = 0;\r\n\t\t} else {\r\n\t\t\tloaderData = $elem.data('loaderData');\r\n\t\t\tloaderData.pageIndex += loaderData.pageSize;\r\n\t\t}\r\n\r\n\t\t$elem.data('loaderData', loaderData);\r\n\r\n\t\tif (target !== false) {\r\n\t\t\t$loadMoreContentWrapper = $body.find('[data-load-more-id=\"' + target + '\"]');\r\n\t\t}\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousLoadMorePromise();\r\n\r\n\t\t$loadMorePromise = $.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: 'post',\r\n\t\t\tdata: JSON.stringify(loaderData),\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($loadMorePromise).then(function (result) {\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\tif (result.UpcomingEvents.length > 0) {\r\n\t\t\t\t\t$(hb.getTpl('upcoming-event-list-item')(result)).insertAfter($('[data-load-upcoming-event-list]').find('.stream-list__item').last());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (result.PreviousEvents.length > 0) {\r\n\t\t\t\t\tif ($('[data-load-previous-event-list]').find('.stream-list__item').length === 0) {\r\n\t\t\t\t\t\t$('[data-previous-events]').show();\r\n\t\t\t\t\t\t$(hb.getTpl('previous-event-list-item')(result)).appendTo($('[data-load-previous-event-list]'));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$(hb.getTpl('previous-event-list-item')(result)).insertAfter($('[data-load-previous-event-list]').find('.stream-list__item').last());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (templateId !== false && $loadMoreContentWrapper.length > 0 && $('script').data('tpl') === templateId) {\r\n\t\t\t\t\t$(hb.getTpl(templateId)(result)).insertAfter($loadMoreContentWrapper.find('.stream-list__item').last());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (result.HasMore === false) {\r\n\t\t\t\t\t$elem.hide();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\thideLoader();\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction checkPassword($input) {\r\n\t\tvar val = $input.val(),\r\n\t\t\tisValid = true,\r\n\t\t\t$formElement,\r\n\t\t\tre = /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}/;\r\n\r\n\t\t$formElement = $input.parents('[data-form-element]').first();\r\n\t\t$formElement.find('[data-validation-ok]').css({display: 'none'});\r\n\t\t$formElement.find('[data-validation-error]').css({display: 'none'});\r\n\r\n\t\tif (!re.test(val) && val !== '') {\r\n\t\t\tisValid = false;\r\n\t\t}\r\n\r\n\t\tif (val !== '') {\r\n\t\t\tif (isValid) {\r\n\t\t\t\t$formElement.find('[data-validation-ok]').css({display: 'block'});\r\n\t\t\t\t$formElement.find('[data-validation-error]').css({display: 'none'});\r\n\t\t\t} else {\r\n\t\t\t\t$formElement.find('[data-validation-ok]').css({display: 'none'});\r\n\t\t\t\t$formElement.find('[data-validation-error]').css({display: 'block'});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction checkPasswordIdentity($input) {\r\n\t\tvar val = $input.val(),\r\n\t\t\ttargetVal,\r\n\t\t\t$target,\r\n\t\t\t$form,\r\n\t\t\tisValid = true,\r\n\t\t\t$formElement;\r\n\r\n\t\t$form = $input.parents('[data-form]').first();\r\n\t\t$formElement = $input.parents('[data-form-element]').first();\r\n\t\t$formElement.find('[data-validation-ok]').css({display: 'none'});\r\n\t\t$formElement.find('[data-validation-error]').css({display: 'none'});\r\n\r\n\t\t$target = $form.find('input[name=\"' + $input.attr('data-password-check-identity') + '\"]');\r\n\t\ttargetVal = $target.val();\r\n\r\n\t\tif (targetVal !== val && targetVal !== '') {\r\n\t\t\tisValid = false;\r\n\t\t}\r\n\r\n\t\tif (targetVal !== '') {\r\n\t\t\tif (isValid) {\r\n\t\t\t\t$formElement.find('[data-validation-ok]').css({display: 'block'});\r\n\t\t\t\t$formElement.find('[data-validation-error]').css({display: 'none'});\r\n\t\t\t} else {\r\n\t\t\t\t$formElement.find('[data-validation-ok]').css({display: 'none'});\r\n\t\t\t\t$formElement.find('[data-validation-error]').css({display: 'block'});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction prepareForm($form) {\r\n\t\tvar url = $form.attr('action') || false,\r\n\t\t\tmethod = $form.attr('method').toLowerCase() || 'post',\r\n\t\t\tformData = createDataObject($form.serializeArray());\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousPromise();\r\n\r\n\t\t$form.find('input[type=\"tel\"]').closest('[data-form-element]').attr('data-field-type', 'phone');\r\n\r\n\t\tif (formData && url) {\r\n\t\t\tsendForm(url, method, formData, $form);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction sendForm(url, method, formData, $form) {\r\n\r\n\t\tremoveFormErrors($form);\r\n\r\n\t\t$formPromise = $.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: method,\r\n\t\t\tdata: JSON.stringify(formData),\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($formPromise).then(function (result) {\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\r\n\t\t\t\t$('[data-save-message]').text(result.ResponseMessage);\r\n\t\t\t\t$('[data-overlay=\"profile-save-success\"]').addClass('show');\r\n\r\n\t\t\t\tif (result.AutoLoginCookieName) {\r\n\t\t\t\t\tdep.cookie.createCookie(result.AutoLoginCookieName, result.AutoLoginCookieValue, result.AutoLoginCookieExp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (result.RedirectUrl && result.RedirectUrl !== '') {\r\n\t\t\t\t\thandleRedirect(result.RedirectUrl);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$form.trigger('form-success');\r\n\r\n\t\t\t} else if (result && result.IsSuccess === false) {\r\n\r\n\t\t\t\tif (result.GenericError) {\r\n\t\t\t\t\thandleGenericError($form, result.GenericError);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (result.fielderrors) {\r\n\t\t\t\t\thandleFormErrors($form, result.fielderrors);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!result.fielderrors && !result.GenericError) {\r\n\t\t\t\t\thandleGenericError($form, 'Service error! Please try again!');\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\thideLoader();\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction handleRedirect(url) {\r\n\t\tif (url) {\r\n\t\t\twindow.location = url;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\tfunction clearPreviousPromise() {\r\n\t\tif ($formPromise && $formPromise.readyState !== 4) {\r\n\t\t\t$formPromise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction clearPreviousLoadMorePromise() {\r\n\t\tif ($loadMorePromise && $loadMorePromise.readyState !== 4) {\r\n\t\t\t$loadMorePromise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction removeFormErrors($form) {\r\n\t\t$form.find('[data-form-element]').removeClass('form-element--has-error');\r\n\t\t$form.find('[data-validation-ok]').removeAttr('style');\r\n\t\t$form.find('[data-validation-error]').removeAttr('style');\r\n\t}\r\n\r\n\tfunction handleFormErrors($form, errors) {\r\n\t\tvar $element,\r\n\t\t\t$firstError,\r\n\t\t\terrorItem;\r\n\r\n\t\t$.each(errors, function (key, value) {\r\n\t\t\terrorItem = value;\r\n\t\t\t$element = $form.find('[data-form-element=\"' + errorItem.key + '\"]');\r\n\t\t\t$element.addClass('form-element--has-error').find('.form-element__error').text(errorItem.value);\r\n\t\t});\r\n\r\n\t\tif (errors) {\r\n\t\t\t$firstError = $form.find('[data-form-element].form-element--has-error').first();\r\n\t\t\t$(window).scrollTop($firstError.offset().top);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction handleGenericError($form, error) {\r\n\t\tvar $element;\r\n\r\n\t\tif ($form.find('[data-form-element=\"GenericError\"]').length > 0) {\r\n\t\t\t$element = $form.find('[data-form-element=\"GenericError\"]');\r\n\t\t\t$element.addClass('form-element--has-error').find('.form-element__error').text(error);\r\n\t\t}\r\n\r\n\t\tif ($form.data('form') === 'login') {\r\n\t\t\tdep.analytics.trackEvent('Login', 'Login error', error);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction createDataObject(src) {\r\n\t\tvar shortName,\r\n\t\t\tformattedData = {},\r\n\t\t\thasNewsletter = false;\r\n\r\n\t\t$.each(src, function (k, v) {\r\n\t\t\tif (v.name.match(/\\[\\]/ig) !== null) {\r\n\t\t\t\tshortName = v.name.replace(/\\[\\]/ig, '');\r\n\t\t\t\tif (formattedData[shortName] === undefined) {\r\n\t\t\t\t\tformattedData[shortName] = [];\r\n\t\t\t\t}\r\n\t\t\t\tformattedData[shortName].push(v.value);\r\n\t\t\t} else {\r\n\t\t\t\tformattedData[v.name] = v.value;\r\n\r\n\t\t\t\tif (v.name === 'IsNewsletter') {\r\n\t\t\t\t\tif (document.getElementById(v.name).checked) {\r\n\t\t\t\t\t\tformattedData[v.name] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.each(formattedData, function (k, v) {\r\n\r\n\t\t\tif ($.isArray(v)) {\r\n\t\t\t\tformattedData[k] = v.join('|');\r\n\t\t\t}\r\n\r\n\t\t\tif (k === 'IsNewsletter') {\r\n\t\t\t\thasNewsletter = true;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (!hasNewsletter) {\r\n\t\t\tformattedData.IsNewsletter = false;\r\n\t\t}\r\n\r\n\t\treturn formattedData;\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tprepareForm: prepareForm,\r\n\t\tcreateDataObject: createDataObject,\r\n\t\thandleFormErrors: handleFormErrors,\r\n\t\thandleGenericError: handleGenericError,\r\n\t\tremoveFormErrors: removeFormErrors\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\tcookie: require('./cookie'),\r\n\t\thandlebars: require('./handlebars-helpers'),\r\n\t\tanalytics: require('./analytics')\r\n\t}\r\n));\r\n\r\n\n},{\"../views/general-loader\":28,\"./analytics\":3,\"./cookie\":5,\"./handlebars-helpers\":14,\"./performance\":20}],10:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\tglobalPagerSize = 7,\r\n\t\t$body,\r\n\t\t$pagerPromise,\r\n\t\t$pager,\r\n\t\thb,\r\n\t\tloaderClass,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\thb = dep.handlebars;\r\n\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$pager = $body.find('[data-pager]');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tpreparePageRequest($(this));\r\n\t\t\t}\r\n\t\t}, '[data-pager] [data-page]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tpreparePageRequest($(this), -1);\r\n\t\t\t}\r\n\t\t}, '[data-pager] [data-pager-prev]:not(.pager__elem--inactive)');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tpreparePageRequest($(this), 1);\r\n\t\t\t}\r\n\t\t}, '[data-pager] [data-pager-next]:not(.pager__elem--inactive)');\r\n\t}\r\n\r\n\tfunction preparePageRequest($pagerItem, direction) {\r\n\t\tvar serviceUrl,\r\n\t\t\tselectedPage,\r\n\t\t\ttotalPages,\r\n\t\t\tcurrentPage,\r\n\t\t\thandlebarsId;\r\n\r\n\t\tif ($pager.length > 0) {\r\n\t\t\tserviceUrl = $pager.attr('data-pager-url');\r\n\t\t\tcurrentPage = parseInt($pager.attr('data-pager-currentpage'), 10);\r\n\t\t\ttotalPages = parseInt($pager.attr('data-pager-totalpages'), 10);\r\n\r\n\t\t\tif (direction !== undefined) {\r\n\t\t\t\tselectedPage = currentPage + (direction === -1 ? -1 : 1);\r\n\t\t\t} else {\r\n\t\t\t\tselectedPage = $pagerItem.attr('data-page');\r\n\t\t\t}\r\n\r\n\t\t\tif (selectedPage < 0) {\r\n\t\t\t\tselectedPage = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (selectedPage > totalPages) {\r\n\t\t\t\tselectedPage = totalPages;\r\n\t\t\t}\r\n\r\n\t\t\thandlebarsId = $pager.attr('data-handlebars-id') || false;\r\n\t\t}\r\n\r\n\t\tif (serviceUrl && currentPage !== selectedPage) {\r\n\t\t\tshowDelayedLoader();\r\n\t\t\tsendRequest(serviceUrl, selectedPage, handlebarsId);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction sendRequest(url, index, templateId, fromHistory) {\r\n\t\tvar data = {},\r\n\t\t\tpageUrl,\r\n\t\t\ttotalPages,\r\n\t\t\tbrowserUrl = url.split('?')[1] || '',\r\n\t\t\tpushStateObj = {},\r\n\t\t\tcurrentPage = parseInt($pager.attr('data-pager-currentpage'), 10),\r\n\t\t\t$hbWrapper;\r\n\r\n\t\tpageUrl = $pager.attr('data-pager-pageurl');\r\n\r\n\t\tif (templateId !== false) {\r\n\t\t\t$hbWrapper = $body.find('[data-hb-wrapper=\"' + templateId + '\"]');\r\n\t\t}\r\n\r\n\t\tdata.pageindex = index;\r\n\r\n\t\t$pagerPromise = $.ajax({\r\n\t\t\ttype: 'get',\r\n\t\t\turl: url,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t\t$.when($pagerPromise).then(function (result) {\r\n\t\t\thideLoader();\r\n\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\r\n\t\t\t\tif (browserUrl === '') {\r\n\t\t\t\t\tbrowserUrl = '?pageindex=' + result.PageIndex;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbrowserUrl = '?' + browserUrl;\r\n\t\t\t\t\tbrowserUrl += '&pageindex=' + result.PageIndex;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (window.history && fromHistory !== true) {\r\n\r\n\t\t\t\t\tpushStateObj.type = 'pager';\r\n\t\t\t\t\tpushStateObj.pagerUrl = url;\r\n\t\t\t\t\tpushStateObj.templateId = templateId;\r\n\t\t\t\t\tpushStateObj.currentIndex = result.PageIndex;\r\n\r\n\t\t\t\t\tif (result.PageIndex !== currentPage) {\r\n\t\t\t\t\t\twindow.history.pushState(pushStateObj, document.title, browserUrl);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttotalPages = Math.ceil(result.Total / result.PageSize);\r\n\r\n\t\t\t\t$pager.find('[data-pager-indexes]').html(createPagers(totalPages, result, pageUrl));\r\n\r\n\t\t\t\tsetPagerStates($pager, result.PageIndex, totalPages);\r\n\r\n\t\t\t\tif (templateId !== false && $hbWrapper.length > 0) {\r\n\t\t\t\t\t$hbWrapper.html(hb.getTpl(templateId)(result));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t$body.scrollTop(0);\r\n\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction setPagerStates($pagerObj, pageIndex, totalPages) {\r\n\t\t$pagerObj.attr('data-pager-currentpage', pageIndex);\r\n\t\t$pagerObj.find('[data-pager-prev]').removeClass('pager__elem--inactive');\r\n\t\t$pagerObj.find('[data-pager-next]').removeClass('pager__elem--inactive');\r\n\r\n\t\tif (pageIndex < 2) {\r\n\t\t\t$pagerObj.find('[data-pager-prev]').addClass('pager__elem--inactive');\r\n\t\t}\r\n\r\n\t\tif (pageIndex > totalPages - 1) {\r\n\t\t\t$pagerObj.find('[data-pager-next]').addClass('pager__elem--inactive');\r\n\t\t}\r\n\r\n\t\t$pagerObj.find('[data-page]').removeClass('stepper--active').blur();\r\n\t\t$pagerObj.find('[data-page=\"' + pageIndex + '\"]').addClass('stepper--active');\r\n\r\n\t\t$pagerObj.find('[data-pager-mobil-index]').html(pageIndex + '/' + totalPages);\r\n\t}\r\n\r\n\tfunction createPagers(totalPages, page, pageUrl) {\r\n\t\tvar stepsStart,\r\n\t\t\tcurrentPage,\r\n\t\t\tactualPagerSize,\r\n\t\t\tnextMoreStep,\r\n\t\t\tprevMoreStep,\r\n\t\t\tpagerHtml = '',\r\n\t\t\ti = 0,\r\n\t\t\tselectedYearQueryParam = page.SelectedYear ? '&year=' + page.SelectedYear : '';\r\n\r\n\t\tcurrentPage = page.PageIndex;\r\n\r\n\t\tif (currentPage > totalPages) {\r\n\t\t\tcurrentPage = totalPages;\r\n\t\t}\r\n\r\n\t\tstepsStart = currentPage - Math.ceil((globalPagerSize - 1) / 2);\r\n\r\n\t\tif (stepsStart > totalPages - globalPagerSize + 1) {\r\n\t\t\tstepsStart = totalPages - globalPagerSize + 1;\r\n\t\t}\r\n\r\n\t\tif (stepsStart < 1) {\r\n\t\t\tstepsStart = 1;\r\n\t\t}\r\n\r\n\t\tactualPagerSize = Math.min(globalPagerSize, totalPages);\r\n\t\tnextMoreStep = currentPage + actualPagerSize;\r\n\r\n\t\tif (nextMoreStep > totalPages) {\r\n\t\t\tnextMoreStep = totalPages;\r\n\t\t}\r\n\r\n\t\tprevMoreStep = currentPage - actualPagerSize;\r\n\r\n\t\tif (prevMoreStep < 1) {\r\n\t\t\tprevMoreStep = 1;\r\n\t\t}\r\n\r\n\t\tif (stepsStart > 1) {\r\n\t\t\tpagerHtml += '...';\r\n\t\t}\r\n\r\n\t\tfor (i; i < (totalPages > globalPagerSize ? globalPagerSize : totalPages); i++) {\r\n\t\t\tpagerHtml += '' + parseInt(stepsStart + i, 10) + '';\r\n\t\t}\r\n\r\n\t\tif (stepsStart + globalPagerSize - 1 < totalPages) {\r\n\t\t\tpagerHtml += '...';\r\n\t\t}\r\n\r\n\t\treturn pagerHtml;\r\n\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tsendRequest: sendRequest,\r\n\t\tcreatePagers: createPagers,\r\n\t\tsetPagerStates: setPagerStates\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\thandlebars: require('./handlebars-helpers')\r\n\t}\r\n));\r\n\r\n\n},{\"../views/general-loader\":28,\"./handlebars-helpers\":14,\"./performance\":20}],11:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$hbWrapper,\r\n\t\t$pager,\r\n\t\thb,\r\n\t\tsettings;\r\n\r\n\tfunction init() {\r\n\t\thb = dep.handlebars;\r\n\r\n\t\tinitSettings();\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t}\r\n\r\n\tfunction initSettings() {\r\n\t\tsettings = {\r\n\t\t\tsize: 10,\r\n\t\t\ttotal: 0,\r\n\t\t\tactive: 0,\r\n\t\t\tpagesToShow: 8,\r\n\t\t\tisFirst: false,\r\n\t\t\tisLast: false,\r\n\t\t\t$input: false,\r\n\t\t\tshouldDisplay: false\r\n\t\t};\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$pager = $body.find('[data-generic-pager]');\r\n\t\t$hbWrapper = $pager.find('[data-hb-wrapper=\"pager-tpl\"]');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$pager.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tsettings.active = parseInt($(e.currentTarget).attr('data-page'), 10);\r\n\r\n\t\t\t\tif(settings.input) {\r\n\t\t\t\t\tsettings.input.val(settings.active);\r\n\t\t\t\t\tsettings.input.trigger('pager-change');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tonPagerEvent();\r\n\t\t\t}\r\n\t\t}, '[data-page]:not(.active)');\r\n\t}\r\n\r\n\tfunction updatePager(data) {\r\n\t\t$.extend(settings, data);\r\n\r\n\t\tif(settings.input) {\r\n\t\t\tsettings.input.val(settings.active);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction compile() {\r\n\t\tvar pagerData = {\r\n\t\t\tpages: [],\r\n\t\t\tactive: settings.active,\r\n\t\t\tisFirst: settings.active === 1,\r\n\t\t\tisLast: settings.active === settings.totalPages,\r\n\t\t\tprev: settings.active - 1,\r\n\t\t\tnext: settings.active + 1,\r\n\t\t\tstart: settings.active < Math.floor(settings.pagesToShow / 2) ? 1 : settings.active - Math.floor(settings.pagesToShow / 2),\r\n\t\t\ttotalPages: settings.totalPages,\r\n\t\t\tshouldDisplay: settings.shouldDisplay\r\n\t\t\t},\r\n\t\t\ti;\r\n\r\n\t\tpagerData.start = Math.min(pagerData.start, settings.totalPages - settings.pagesToShow);\r\n\t\tpagerData.start = Math.max(1, pagerData.start);\r\n\t\tpagerData.end = Math.min(settings.totalPages, pagerData.start + settings.pagesToShow);\r\n\r\n\t\tfor(i = pagerData.start; i <= pagerData.end; i++) {\r\n\t\t\tpagerData.pages.push({\r\n\t\t\t\tindex: i,\r\n\t\t\t\tnumber: i,\r\n\t\t\t\tactive: settings.active === i\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif(pagerData.totalPages > settings.active + settings.pagesToShow - 1) {\r\n\t\t\tpagerData.dots = pagerData.end;\r\n\t\t}\r\n\r\n\t\t$hbWrapper.html(hb.getTpl('pager-tpl')(pagerData));\r\n\t}\r\n\r\n\tfunction onPagerEvent() {}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tupdatePager: updatePager,\r\n\t\tcompile: compile,\r\n\t\tonPagerEvent: onPagerEvent\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\thandlebars: require('./handlebars-helpers')\r\n\t}\r\n));\r\n\r\n\n},{\"../views/general-loader\":28,\"./handlebars-helpers\":14,\"./performance\":20}],12:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\tserviceURL,\r\n\t\tformEl,\r\n\t\t$promise,\r\n\t\thb,\r\n\t\tloaderClass,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\t$searchWrapper,\r\n\t\t$form,\r\n\t\t$hbWrapper,\r\n\t\ttotalPages,\r\n\t\ttpl,\r\n\t\tresponseKey,\r\n\t\tisLoadMore = false,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\thb = dep.handlebars;\r\n\r\n\t\tif ($searchWrapper.length > 0) {\r\n\t\t\tserviceURL = $searchWrapper.attr('data-service-url');\r\n\t\t\tformEl = $searchWrapper.find('[data-generic-search-form]');\r\n\t\t\ttpl = $searchWrapper.attr('data-hb-template');\r\n\t\t\tresponseKey = $searchWrapper.attr('data-response-key');\r\n\t\t\tisLoadMore = $searchWrapper.attr('data-type') === 'load-more';\r\n\r\n\t\t\tif (window.location.search !== '') {\r\n\t\t\t\tapplyQueryString();\r\n\t\t\t}\r\n\t\t\tsendRequest();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$searchWrapper = $body.find('[data-generic-search]');\r\n\t\t$form = $searchWrapper.find('[data-generic-search-form]');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$form.on({\r\n\t\t\tchange: function () {\r\n\t\t\t\tformEl.find('[name=\"pageindex\"]').val(1);\r\n\t\t\t\tsendRequest();\r\n\t\t\t}\r\n\t\t}, 'input:not([name=\"pageindex\"]):not([name=\"sortby\"]):not([name=\"sortdesc\"]), select');\r\n\r\n\t\t$form.on({\r\n\t\t\t'pager-change': function () {\r\n\t\t\t\tsendRequest();\r\n\t\t\t}\r\n\t\t}, 'input[name=\"pageindex\"]');\r\n\r\n\t\t$searchWrapper.on({\r\n\t\t\t'send-request': function () {\r\n\t\t\t\tsendRequest();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction initSortBindings() {\r\n\t\t$searchWrapper.on({\r\n\t\t\t'sort-change': function () {\r\n\t\t\t\tsendRequest();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\tfunction collectFormData() {\r\n\t\tvar formData = {},\r\n\t\t\tinputs = formEl.find('input, select'),\r\n\t\t\tinputsArr = Array.prototype.slice.call(inputs);\r\n\r\n\t\tinputsArr.forEach(function (item) {\r\n\t\t\tswitch (item.type) {\r\n\t\t\t\tcase 'text':\r\n\t\t\t\tcase 'email':\r\n\t\t\t\tcase 'tel':\r\n\t\t\t\tcase 'hidden':\r\n\t\t\t\t\tif (item.value && item.value !== '') {\r\n\t\t\t\t\t\tformData[item.name] = item.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'checkbox':\r\n\t\t\t\tcase 'radio':\r\n\t\t\t\t\tif (item.checked) {\r\n\t\t\t\t\t\tif (formData[item.name] === undefined) {\r\n\t\t\t\t\t\t\tformData[item.name] = item.value;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tformData[item.name] = formData[item.name] + '|' + item.value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'select':\r\n\t\t\t\t\tif (item.value && item.value !== '') {\r\n\t\t\t\t\t\tformData[item.name] = item.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn formData;\r\n\t}\r\n\r\n\tfunction buildQueryString(object) {\r\n\t\tvar queryString = Object.keys(object).map(function(key) {\r\n\t\t\tif (object[key] && object[key] !== '') {\r\n\t\t\t\tif (!formEl.find('[name=\"' + key + '\"]')[0].hasAttribute('data-skip-from-query')) {\r\n\t\t\t\t\treturn key + '=' + object[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}).filter(function(keyVal) {\r\n\t\t\treturn keyVal !== undefined;\r\n\t\t});\r\n\r\n\t\treturn queryString.length > 0 ? '?' + queryString.join('&') : '';\r\n\t}\r\n\r\n\tfunction parseQueryString() {\r\n\t\tvar queryString = window.location.search,\r\n\t\t\tqueries,\r\n\t\t\tqueryObj = {};\r\n\r\n\t\tif (queryString !== '') {\r\n\t\t\tqueries = queryString.replace('?', '').split('&');\r\n\r\n\t\t\tqueries.forEach(function(val) {\r\n\t\t\t\tif (val.split('=')[1] && val.split('=')[1] !== undefined) {\r\n\t\t\t\t\tqueryObj[val.split('=')[0]] = val.split('=')[1];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn queryObj;\r\n\t}\r\n\r\n\tfunction applyQueryString() {\r\n\t\tvar queryObj = parseQueryString(),\r\n\t\t\tel,\r\n\t\t\tprop;\r\n\r\n\t\tfor (prop in queryObj) {\r\n\t\t\tif (queryObj.hasOwnProperty(prop)) {\r\n\t\t\t\tel = formEl.find('[name=\"' + prop + '\"]');\r\n\r\n if (el.length) {\r\n if (el[0].type.toLowerCase() === 'checkbox' || el[0].type.toLowerCase() === 'radio') {\r\n queryObj[prop].split('|').forEach(tick);\r\n } else if (el[0].type.toLowerCase() === 'select') {\r\n el.val(queryObj[prop]);\r\n } else {\r\n el.val(queryObj[prop]);\r\n }\r\n }\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction tick(value) {\r\n\t\t\tformEl.find('[value=\"' + value + '\"]').attr('checked', true);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction sendRequest() {\r\n\t\tvar data = collectFormData(),\r\n\t\t\tpagerData,\r\n\t\t\tsortData;\r\n\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPreviousPromise();\r\n\r\n\t\twindow.history.pushState(null, document.title, buildQueryString(data));\r\n\r\n\t\t$hbWrapper = $body.find('[data-hb-wrapper=\"result\"]');\r\n\t\t$promise = $.ajax({\r\n\t\t\ttype: 'get',\r\n\t\t\turl: serviceURL,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($promise).then(function (result) {\r\n\t\t\thideLoader();\r\n\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\r\n\t\t\t\tif (result.PageIndex === 0 || result.PageIndex > 1 && result[responseKey].length === 0) {\r\n\t\t\t\t\tformEl.find('[name=\"pageindex\"]').val(1);\r\n\t\t\t\t\tformEl.find('[name=\"pageindex\"]').trigger('pager-change');\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttotalPages = Math.ceil(result.Total / result.PageSize);\r\n\r\n\t\t\t\tpagerData = {\r\n\t\t\t\t\ttotal: result.Total,\r\n\t\t\t\t\tactive: result.PageIndex,\r\n\t\t\t\t\tsize: result.PageSize,\r\n\t\t\t\t\ttotalPages: totalPages,\r\n\t\t\t\t\tshouldDisplay: parseInt(result.Total, 10) > parseInt(result.PageSize, 10),\r\n\t\t\t\t\tinput: formEl.find('[name=\"pageindex\"]')\r\n\t\t\t\t};\r\n\t\t\t\tdep.genericPager.updatePager(pagerData);\r\n\t\t\t\tdep.genericPager.compile();\r\n\r\n\t\t\t\tif ($hbWrapper.length > 0) {\r\n\t\t\t\t\tif (isLoadMore) {\r\n\t\t\t\t\t\t$hbWrapper.append(hb.getTpl(tpl)(result));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$hbWrapper.html(hb.getTpl(tpl)(result));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (data.sortby !== undefined && data.sortdesc !== undefined) {\r\n\t\t\t\t\tif (dep.genericSort.isSortInit() === false) {\r\n\t\t\t\t\t\tsortData = {\r\n\t\t\t\t\t\t\t$parent: $searchWrapper,\r\n\t\t\t\t\t\t\tsortby: data.sortby,\r\n\t\t\t\t\t\t\tsortdesc: data.sortdesc === 'true',\r\n\t\t\t\t\t\t\t$sortInput: formEl.find('[name=\"sortby\"]'),\r\n\t\t\t\t\t\t\t$descInput: formEl.find('[name=\"sortdesc\"]')\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tdep.genericSort.init(sortData);\r\n\t\t\t\t\t\tinitSortBindings();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdep.genericSort.updateSettings({\r\n\t\t\t\t\t\t\tsortby: data.sortby,\r\n\t\t\t\t\t\t\tsortdesc: data.sortdesc === 'true'\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tdep.genericSort.update();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction clearPreviousPromise() {\r\n\t\tif ($promise && $promise.readyState !== 4) {\r\n\t\t\t$promise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\thandlebars: require('./handlebars-helpers'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\tgenericPager: require('./generic-pager-handling'),\r\n\t\tgenericSort: require('./generic-sort-handling')\r\n\t}\r\n));\r\n\r\n\n},{\"../views/general-loader\":28,\"./generic-pager-handling\":11,\"./generic-sort-handling\":13,\"./handlebars-helpers\":14,\"./performance\":20}],13:[function(require,module,exports){\nmodule.exports = (function () {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tsettings = {\r\n init: false\r\n };\r\n\r\n\tfunction init(data) {\r\n\t\tinitSettings(data);\r\n\t\tupdate();\r\n\t\tinitBindings();\r\n\t\tsettings.init = true;\r\n\t}\r\n\r\n\tfunction initSettings(data) {\r\n $.extend(settings = {\r\n $parent: undefined,\r\n\t\t\tsortby: '',\r\n\t\t\tsortdesc: false,\r\n\t\t\t$sortInput: false,\r\n\t\t\t$descInput: false,\r\n\t\t\tinit: false\r\n\t\t}, data);\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\tsettings.$parent.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tsettings.sortby = $(e.currentTarget).attr('data-sort');\r\n\t\t\t\tsettings.sortdesc = $(e.currentTarget).hasClass('sort--asc');\r\n\r\n\t\t\t\tif(settings.$sortInput) {\r\n\t\t\t\t\tsettings.$sortInput.val(settings.sortby);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(settings.$descInput) {\r\n\t\t\t\t\tsettings.$descInput.val(settings.sortdesc);\r\n\t\t\t\t}\r\n\t\t\t\tsettings.$parent.trigger('sort-change');\r\n\t\t\t\tonSortEvent();\r\n\t\t\t}\r\n\t\t}, '[data-sort]');\r\n\t}\r\n\r\n\tfunction update() {\r\n\t\tsettings.$parent.find('[data-sort].sort--asc, [data-sort].sort--desc').removeClass('sort--asc sort--desc');\r\n\t\tsettings.$parent.find('[data-sort=\"' + settings.sortby + '\"]').addClass(settings.sortdesc ? 'sort--desc' : 'sort--asc');\r\n\t}\r\n\r\n\tfunction updateSettings(data) {\r\n\t\t$.extend(settings, data);\r\n\t}\r\n\r\n\tfunction isSortInit() {\r\n\t\treturn settings.init;\r\n\t}\r\n\r\n\tfunction onSortEvent() {}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tisSortInit: isSortInit,\r\n\t\tupdate: update,\r\n\t\tupdateSettings: updateSettings,\r\n\t\tonSortEvent: onSortEvent\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}());\r\n\r\n\n},{}],14:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\ttpl;\r\n\r\n\tfunction init() {\r\n\t\ttpl = {};\r\n\r\n\t\tif (typeof Handlebars !== 'undefined') {\r\n\r\n\t\t\tregisterHelpers();\r\n\r\n\t\t\t$body = dep.performance.getCachedDom().$body;\r\n\r\n\t\t\t$body.find('[data-tpl]').each(function (k, v) {\r\n\t\t\t\tvar $this = $(v),\r\n\t\t\t\t\tid = $this.attr('data-tpl');\r\n\r\n\t\t\t\ttpl[id] = Handlebars.compile($this.html());\r\n\r\n\t\t\t\tif (id.indexOf('partial/') === 0) {\r\n\t\t\t\t\tHandlebars.registerPartial(id.split('/')[1], $this.html());\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction registerHelpers() {\r\n\r\n\t\tHandlebars.registerHelper('toLowerCase', function toLowerCase(str) {\r\n\t\t\treturn str.toLowerCase();\r\n\t\t});\r\n\r\n\t\tHandlebars.registerHelper('per', function per(v1, v2) {\r\n\t\t\treturn v1 / v2;\r\n\t\t});\r\n\r\n\t\tHandlebars.registerHelper('eq', function eq(v1, v2, options) {\r\n\t\t\tif (v1 === v2) {\r\n\t\t\t\treturn options.fn(this);\r\n\t\t\t}\r\n\t\t\treturn options.inverse(this);\r\n\t\t});\r\n\r\n\t\tHandlebars.registerHelper('noteq', function noteq(v1, v2, options) {\r\n\t\t\tif (v1 !== v2) {\r\n\t\t\t\treturn options.fn(this);\r\n\t\t\t}\r\n\t\t\treturn options.inverse(this);\r\n\t\t});\r\n\r\n\t\tHandlebars.registerHelper('echoJson', function echoJson(v1) {\r\n\t\t\treturn JSON.stringify(v1);\r\n\t\t});\r\n\r\n\t\tHandlebars.registerHelper('ifCond', function ifCond(v1, operator, v2, options) {\r\n\r\n\t\t\tswitch (operator) {\r\n\t\t\tcase '==':\r\n\t\t\tcase '===':\r\n\t\t\t\treturn equalityCheck(v1, v2, options);\r\n\t\t\tcase '<':\r\n\t\t\tcase '<=':\r\n\t\t\tcase '>':\r\n\t\t\tcase '>=':\r\n\t\t\t\treturn compareCheck(v1, v2, options, operator);\r\n\t\t\tcase '&&':\r\n\t\t\tcase '||':\r\n\t\t\t\treturn andOrCheck(v1, v2, options, operator);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction equalityCheck(v1, v2, options) {\r\n\t\treturn v1 === v2 ? options.fn(this) : options.inverse(this);\r\n\t}\r\n\r\n\tfunction compareCheck(v1, v2, options, operator) {\r\n\t\tswitch (operator) {\r\n\t\tcase '<':\r\n\t\t\treturn v1 < v2 ? options.fn(this) : options.inverse(this);\r\n\t\tcase '<=':\r\n\t\t\treturn v1 <= v2 ? options.fn(this) : options.inverse(this);\r\n\t\tcase '>':\r\n\t\t\treturn v1 > v2 ? options.fn(this) : options.inverse(this);\r\n\t\tcase '>=':\r\n\t\t}\r\n\t}\r\n\r\n\tfunction andOrCheck(v1, v2, options, operator) {\r\n\t\tswitch (operator) {\r\n\t\tcase '&&':\r\n\t\t\treturn v1 && v2 ? options.fn(this) : options.inverse(this);\r\n\t\tcase '||':\r\n\t\t\treturn v1 || v2 ? options.fn(this) : options.inverse(this);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction getTpl(id) {\r\n\t\treturn tpl[id];\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tregisterHelpers: registerHelpers,\r\n\t\tgetTpl: getTpl\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\r\n\n},{\"./performance\":20}],15:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports;\r\n\r\n\tfunction init() {\r\n\t\twindow.onpopstate = function (event) {\r\n\t\t\tif (event.state && event.state.type) {\r\n\t\t\t\tswitch (event.state.type) {\r\n\t\t\t\tcase 'pager':\r\n\t\t\t\t\tdep.generalPager.sendRequest(event.state.pagerUrl, event.state.currentIndex, event.state.templateId, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'discussion-list':\r\n\t\t\t\t\tdep.discussionsHandling.sendRequest(event.state.sortData, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tgeneralPager: require('./general-pager-handling'),\r\n\t\tdiscussionsHandling: require('./discussion-handling')\r\n\t}\r\n));\r\n\n},{\"./discussion-handling\":7,\"./general-pager-handling\":10}],16:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\t/* eslint-disable */\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$ideaContainer,\r\n\t\t$searchWrapper,\r\n\t\t$overlay,\r\n\t\tloaderClass,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\tsettings = {},\r\n\t\thb,\r\n\t\tpromise,\r\n\t\tverificationToken;\r\n\t/* eslint-enable */\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\r\n\t\tloaderClass = dep.generalLoader;\r\n\t\thb = dep.handlebars;\r\n\r\n\t\tif ($ideaContainer.length > 0) {\r\n\t\t\tinitSettings();\r\n\t\t\tinitBindings();\r\n\t\t\tinitOverlayBindings();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$searchWrapper = $body.find('[data-generic-search]');\r\n\t\t$overlay = $body.find('[data-overlay]');\r\n\t\t$ideaContainer = $('[data-idea-handler]');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initSettings() {\r\n\t\tsettings = {\r\n\t\t\tlikeEndpoint: $ideaContainer.attr('data-like-service-url')\r\n\t\t};\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$ideaContainer.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tonIdeaAction($(e.currentTarget));\r\n\t\t\t}\r\n\t\t}, '[data-idea-action]');\r\n\t}\r\n\r\n\tfunction initOverlayBindings() {\r\n\t\t$overlay.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\t$overlay.removeClass('show');\r\n\t\t\t}\r\n\t\t}, '[data-close-overlay]');\r\n\t}\r\n\r\n\tfunction onIdeaAction($target) {\r\n\t\tvar type = $target.attr('data-idea-action');\r\n\r\n\t\tswitch(type) {\r\n\t\t\tcase 'like':\r\n\t\t\t\tlikeIdea($target);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'edit':\r\n\t\t\t\tcreateOrEditIdea($target);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'remove':\r\n\t\t\t\tremoveIdea($target);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'create':\r\n\t\t\t\tcreateOrEditIdea($target);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction likeIdea($target) {\r\n\t\tvar data = $target.attr('data-idea-action-data'),\r\n\t\t\t$amount = $target.find('span');\r\n\r\n\t\tfunction onLikeSuccess() {\r\n\t\t\tif ($target.hasClass('discussion-item__like--liked')) {\r\n\t\t\t\t$target.removeClass('discussion-item__like--liked');\r\n\t\t\t\t$amount.text(parseInt($amount.text(), 10) - 1);\r\n\t\t\t} else {\r\n\t\t\t\t$target.addClass('discussion-item__like--liked');\r\n\t\t\t\t$amount.text(parseInt($amount.text(), 10) + 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsendRequest(settings.likeEndpoint, 'POST', data, onLikeSuccess, null);\r\n\t}\r\n\r\n\tfunction createOrEditIdea($target) {\r\n\t\tvar data = JSON.parse($target.attr('data-idea-action-data')),\r\n\t\t\t$form;\r\n\r\n\t\tcompileOverlay('edit-overlay', data);\r\n\t\t$form = $overlay.find('[data-form]');\r\n\t\tinitOverlayFormBindings($form, 'create');\r\n\t}\r\n\r\n\tfunction removeIdea($target) {\r\n\t\tvar data = JSON.parse($target.attr('data-idea-action-data')),\r\n\t\t\t$form;\r\n\r\n\t\tcompileOverlay('remove-overlay', data);\r\n\t\t$form = $overlay.find('[data-form]');\r\n\t\tinitOverlayFormBindings($form, 'remove');\r\n\t}\r\n\r\n\tfunction initOverlayFormBindings($form, type) {\r\n\t\t$form.on({\r\n\t\t\t'form-success': function () {\r\n\t\t\t\tcloseOverlay();\r\n\r\n\t\t\t\tif (type === 'remove') {\r\n\t\t\t\t\t$ideaContainer.find('[data-idea-id=\"' + $form.find('[name=\"IdeaId\"]').val() + '\"]').remove();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetTimeout(function(){\r\n\t\t\t\t\t$searchWrapper.trigger('send-request');\r\n\t\t\t\t}, 500);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif ($form.find('[maxlength]').length > 0) {\r\n\t\t\t$form.on({\r\n\t\t\t\tkeyup: function (e) {\r\n\t\t\t\t\tlimitInputLength($(e.currentTarget));\r\n\t\t\t\t}\r\n\t\t\t}, '[maxlength]');\r\n\t\t\t$form.find('[maxlength]').trigger('keyup');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction limitInputLength($target) {\r\n\t\tvar maxLength = $target.attr('maxlength'),\r\n\t\t\t$tip;\r\n\r\n\t\t$tip = $target.closest('[data-form-element]').find('label span[maxlength-tip]');\r\n\t\t$tip.text(maxLength - $target.val().length);\r\n\r\n\t\tif ($target.val().length >= maxLength) {\r\n\t\t\t$target.val($target.val().substr(0, maxLength));\r\n\t\t}\r\n\t}\r\n\r\n\tfunction compileOverlay(tpl, data) {\r\n\t\t$overlay.html(hb.getTpl(tpl)(data));\r\n\t\t$overlay.addClass('show');\r\n\t}\r\n\r\n\tfunction closeOverlay() {\r\n\t\t$overlay.removeClass('show');\r\n\t}\r\n\r\n\tfunction sendRequest(url, method, data, successCallback, errorCallback) {\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tclearPendingPromise();\r\n\r\n\t\tpromise = $.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when(promise).then(function (result) {\r\n\t\t\thideLoader();\r\n\r\n\t\t\tif (result && result.IsSuccess === true) {\r\n\t\t\t\tsuccessCallback();\r\n\t\t\t} else {\r\n\t\t\t\terrorCallback();\r\n\t\t\t}\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction clearPendingPromise() {\r\n\t\tif (promise && promise.readyState !== 4) {\r\n\t\t\tpromise.abort();\r\n\t\t\thideLoader();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\thandlebars: require('./handlebars-helpers'),\r\n\t\tgeneralLoader: require('../views/general-loader'),\r\n\t\tgeneralFormHandling: require('./general-form-handling')\r\n\t}\r\n));\r\n\r\n\r\n\n},{\"../views/general-loader\":28,\"./general-form-handling\":9,\"./handlebars-helpers\":14,\"./performance\":20}],17:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\r\n\tvar exports,\r\n\t\t$document,\r\n\t\t$cropOverlay,\r\n\t\t$cancelBtn,\r\n\t\t$cropBtn,\r\n\t\t$canvas,\r\n\t\t$cropImageContainer,\r\n\t\tsaveCroppedImageService,\r\n\t\tuploadImageService,\r\n\t\tmethod,\r\n\t\t$fileInput,\r\n\t\t$uploadContainer,\r\n\t\t$uploadErrorMessage,\r\n\t\t$cropErrorMessage,\r\n\t\t$imagePreview,\r\n\t\tdraggedClass = 'drag-over',\r\n\t\toverlayOpenedClass = 'show',\r\n\t\t$photoFieldset,\r\n\t\temailAddress,\r\n\t\tPId,\r\n\t\tloaderTid,\r\n\t\tloaderDelay = 150,\r\n\t\tloaderClass,\r\n\t\timageCropSettings = {\r\n\t\t\twidth: 250,\r\n\t\t\theight: 250\r\n\t\t},\r\n\t\tcoordinates = {},\r\n\t\tbuttonsHeight = 51,\r\n\t\t$window,\r\n\t\t$topAvatar,\r\n\t\t$imageIdField,\r\n\t\t$savedIdField,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tif ($('[data-upload-photo]').length > 0) {\r\n\t\t\tloaderClass = dep.generalLoader;\r\n\r\n\t\t\tinitDOMElements();\r\n\t\t\tinitVariables();\r\n\t\t\tinitBindings();\r\n\t\t\tinitImageUpload();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$document = $(document);\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\r\n\t\t$cropOverlay = $('[data-crop-overlay]');\r\n\t\t$cancelBtn = $cropOverlay.find('[data-cancel]');\r\n\t\t$cropBtn = $cropOverlay.find('[data-do-crop]');\r\n\t\t$cropImageContainer = $cropOverlay.find('[data-image-container]');\r\n\t\t$canvas = $cropOverlay.find('[data-crop-canvas]')[0];\r\n\t\t$cropErrorMessage = $cropOverlay.find('[data-save-crop-error]');\r\n\r\n\t\t$fileInput = $('[data-upload-photo]');\r\n\t\t$uploadContainer = $('[data-drag-area]');\r\n\r\n\t\t$photoFieldset = $('[data-drag-area]');\r\n\t\t$imagePreview = $('.profile__img img');\r\n\t\t$uploadErrorMessage = $('[data-image-upload-error]');\r\n\t\t$topAvatar = $('.header__account img');\r\n\t\t$imageIdField = $('#ImageId');\r\n\t\t$savedIdField = $('#SavedId');\r\n\t}\r\n\r\n\tfunction initVariables() {\r\n\t\tsaveCroppedImageService = $cropOverlay.attr('data-crop-overlay');\r\n\t\tmethod = $cropOverlay.attr('data-method');\r\n\t\tuploadImageService = $uploadContainer.attr('data-image-service');\r\n\t\temailAddress = $('[data-user-email]').length ? $('[data-user-email]').find('p').text().trim() : $('input#email[type=\"email\"]').val();\r\n\t\tPId = $('[data-globalprofile-id]').data('globalprofile-id');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$document.on('dragover', function (e) {\r\n\t\t\tvar timeout = window.dropZoneTimeout;\r\n\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tif (!timeout) {\r\n\t\t\t\t$photoFieldset.addClass(draggedClass);\r\n\t\t\t} else {\r\n\t\t\t\twindow.clearTimeout(timeout);\r\n\t\t\t}\r\n\r\n\t\t\twindow.dropZoneTimeout = setTimeout(function () {\r\n\t\t\t\twindow.dropZoneTimeout = null;\r\n\t\t\t\t$photoFieldset.removeClass(draggedClass);\r\n\t\t\t}, 100);\r\n\t\t});\r\n\r\n\t\t$document.on('drop', function (e) {\r\n\t\t\tvar droppedFiles = e.originalEvent.dataTransfer.files;\r\n\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tinitImageUpload();\r\n\r\n\t\t\t$fileInput.fileupload('add', {\r\n\t\t\t\tfiles: droppedFiles\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t$cancelBtn.on({\r\n\t\t\t'click.closeCrop': close\r\n\t\t});\r\n\r\n\t\t$cropBtn.on({\r\n\t\t\t'click.dCrop': crop\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t// Initialize the image upload plugin instance for the gallery images\r\n\tfunction initImageUpload() {\r\n\t\t$fileInput.fileupload({\r\n\t\t\turl: uploadImageService,\r\n\t\t\tdropZone: $photoFieldset,\r\n\t\t\tcanDrag: true,\r\n\t\t\tdisableValidation: true,\r\n\t\t\tdataType: 'json',\r\n\t\t\tdone: function (e, data) {\r\n\t\t\t\tif (!data.result.IsSuccess || data.result.HasErrors) {\r\n\t\t\t\t\t$uploadErrorMessage.text(data.result.GenericError);\r\n\t\t\t\t\t$uploadErrorMessage.show();\r\n\t\t\t\t\thideLoader();\r\n\t\t\t\t\tif (data.RedirectUrl) {\r\n\t\t\t\t\t\twindow.location.href = data.RedirectUrl;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\timageCropSettings.image = data.result.files[0];\r\n\t\t\t\t\tpreloadImage();\r\n\t\t\t\t\tsetSize();\r\n\t\t\t\t\tinsertImage();\r\n\t\t\t\t\tinitJCrop();\r\n\t\t\t\t\topen();\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\t\t\tadd: function (e, data) {\r\n\t\t\t\tif ($uploadErrorMessage.css('display') !== 'none') {\r\n\t\t\t\t\t$uploadErrorMessage.show();\r\n\t\t\t\t}\r\n\t\t\t\tshowDelayedLoader();\r\n\t\t\t\tdata.submit();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Inset the image to be cropped into the crop-overlay\r\n\tfunction insertImage() {\r\n\t\t$cropImageContainer.html('');\r\n\t}\r\n\r\n\t// Close the image cropper overlay and reset the DOM elements to original state\r\n\tfunction close() {\r\n\t\tresetButtons();\r\n\t\t$cropOverlay.removeClass(overlayOpenedClass);\r\n\t\t$cropImageContainer.empty();\r\n\t\t$cropImageContainer.removeAttr('style');\r\n\t\tresetCanvas();\r\n\t}\r\n\r\n\t// Preload the image to be cropped\r\n\tfunction preloadImage() {\r\n\t\tvar img = new Image();\r\n\r\n\t\timg.src = imageCropSettings.image.url;\r\n\t}\r\n\r\n\t// Open the overlay\r\n\tfunction open() {\r\n\t\tvar overlayContentHeight;\r\n\r\n\t\toverlayContentHeight = $cropImageContainer.innerHeight() + $cropOverlay.find('[data-buttons]').innerHeight();\r\n\t\t$cropOverlay.find('.overlay__content').css('height', overlayContentHeight);\r\n\r\n\t\t$cropOverlay.addClass(overlayOpenedClass);\r\n\t\thideLoader();\r\n\t}\r\n\r\n\t// Calculate and set min/max height/width for the overlay's elements\r\n\tfunction setSize() {\r\n\t\tvar imageH = parseInt(imageCropSettings.image.originalheight, 10),\r\n\t\t\timageW = parseInt(imageCropSettings.image.originalwidth, 10),\r\n\t\t\tscaledW,\r\n\t\t\tscaledH,\r\n\t\t\tsetW,\r\n\t\t\tsetH,\r\n\t\t\tratio = imageW / imageH,\r\n\t\t\tresizedImageWidth = 980,\r\n\t\t\tresizedImageHeight = resizedImageWidth / ratio,\r\n\t\t\twindowRatio = $window.width() / $window.height(),\r\n\t\t\tlargerThanScreen = false;\r\n\r\n\t\tif (resizedImageWidth > $window.width() || resizedImageHeight + buttonsHeight > $window.height()) {\r\n\t\t\tlargerThanScreen = true;\r\n\t\t}\r\n\r\n\t\tif (!largerThanScreen) {\r\n\t\t\tsetW = resizedImageWidth;\r\n\t\t\tsetH = resizedImageHeight;\r\n\t\t} else {\r\n\t\t\tif (ratio < windowRatio) {\r\n\t\t\t\tscaledH = $window.height() / 100 * 90 - buttonsHeight;\r\n\t\t\t\tscaledW = scaledH * ratio;\r\n\t\t\t} else {\r\n\t\t\t\tscaledW = $window.width() / 100 * 90;\r\n\t\t\t\tscaledH = scaledW / ratio;\r\n\t\t\t}\r\n\r\n\t\t\tsetW = scaledW;\r\n\t\t\tsetH = scaledH;\r\n\t\t}\r\n\r\n\t\t$cropImageContainer.css('width', setW + 'px');\r\n\t\t$cropImageContainer.css('height', setH + 'px');\r\n\r\n\t\t$canvas.setAttribute('width', imageCropSettings.width);\r\n\t\t$canvas.setAttribute('height', imageCropSettings.height);\r\n\t}\r\n\r\n\tfunction resetCanvas() {\r\n\t\t$canvas.width = $canvas.width;\r\n\t}\r\n\r\n\tfunction initJCrop() {\r\n\t\tvar $image = $cropOverlay.find('[data-image-to-crop]');\r\n\r\n\t\t$uploadErrorMessage.css('display', 'none');\r\n\r\n\t\tif ($image.length) {\r\n\t\t\t$image.on('load', function () {\r\n\t\t\t\tvar setSelectDimensions = {};\r\n\r\n\t\t\t\tif ($cropImageContainer.width() < imageCropSettings.width) {\r\n\t\t\t\t\tsetSelectDimensions.width = $cropImageContainer.width();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetSelectDimensions.width = imageCropSettings.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($cropImageContainer.height() < imageCropSettings.height) {\r\n\t\t\t\t\tsetSelectDimensions.height = $cropImageContainer.height();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetSelectDimensions.height = imageCropSettings.height;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetSelectDimensions.top = ($cropImageContainer.height() - imageCropSettings.height) / 2;\r\n\t\t\t\tsetSelectDimensions.left = ($cropImageContainer.width() - imageCropSettings.width) / 2;\r\n\r\n\t\t\t\t/*eslint-disable */\r\n\t\t\t\t$image.Jcrop({\r\n\t\t\t\t\tbgFade: true,\r\n\t\t\t\t\tbgOpacity: 0.2,\r\n\t\t\t\t\tsetSelect: [\r\n\t\t\t\t\t\tsetSelectDimensions.width,\r\n\t\t\t\t\t\tsetSelectDimensions.height,\r\n\t\t\t\t\t\tsetSelectDimensions.left,\r\n\t\t\t\t\t\tsetSelectDimensions.top\r\n\t\t\t\t\t],\r\n\t\t\t\t\tminSize: [\r\n\t\t\t\t\t\tsetSelectDimensions.width,\r\n\t\t\t\t\t\tsetSelectDimensions.height\r\n\t\t\t\t\t],\r\n\t\t\t\t\taspectRatio: 1,\r\n\t\t\t\t\tonSelect: setCoords\r\n\t\t\t\t}, function () {\r\n\t\t\t\t\twindow.jcropApi = this;\r\n\t\t\t\t});\r\n\t\t\t\t/*eslint-enable */\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Draw the currently selected image part to the canvas, proportionately resized\r\n\tfunction drawImageToCanvas() {\r\n\t\tvar context = $canvas.getContext('2d'),\r\n\t\t\t$img = $('[data-image-to-crop]'),\r\n\t\t\timg = $img[0],\r\n\r\n\t\t\timgW = img.width === 0 ? $img.attr('width') : img.width,\r\n\t\t\timgH = img.height === 0 ? $img.attr('height') : img.height,\r\n\r\n\t\t\tratioY = imgH / $img.height(),\r\n\t\t\tratioX = imgW / $img.width(),\r\n\r\n\t\t\tgetX = Math.floor(coordinates.x * ratioX),\r\n\t\t\tgetY = Math.floor(coordinates.y * ratioY),\r\n\r\n\t\t\tgetWidth = Math.floor(coordinates.w * ratioX),\r\n\t\t\tgetHeight = Math.floor(coordinates.h * ratioY);\r\n\r\n\t\tcontext.drawImage(img, getX, getY, getWidth, getHeight, 0, 0, imageCropSettings.width, imageCropSettings.height);\r\n\t}\r\n\r\n\tfunction getCanvasData() {\r\n\t\tvar ret;\r\n\r\n\t\tif ($canvas) {\r\n\t\t\tret = $canvas.toDataURL('image/jpeg', 1.0);\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\t// Send the base64 canvas data to the server for saving the image file\r\n\tfunction sendImageData() {\r\n\t\tvar imageData = getCanvasData();\r\n\r\n\t\tshowDelayedLoader();\r\n\r\n\t\tif ($cropErrorMessage.css('display') !== 'none') {\r\n\t\t\t$cropErrorMessage.css('display', 'none');\r\n\t\t}\r\n\r\n\t\t$cropBtn.attr('disabled', true);\r\n\t\t$cancelBtn.attr('disabled', true);\r\n\r\n\t\t$.ajax({\r\n\t\t\turl: saveCroppedImageService,\r\n\t\t\ttype: method,\r\n\t\t\tdataType: 'json',\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tcache: false,\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t},\r\n\t\t\tdata: JSON.stringify({\r\n\t\t\t\tImageId: imageCropSettings.image.id,\r\n\t\t\t\tBaseValue: imageData,\r\n\t\t\t\tEmail: emailAddress,\r\n\t\t\t\tPId: PId\r\n\t\t\t})\r\n\t\t}).done(function (data) {\r\n\t\t\thideLoader();\r\n\t\t\tif (data.IsSuccess) {\r\n\r\n\r\n\t\t\t\thandleCropSuccess(data);\r\n\t\t\t} else {\r\n\t\t\t\tif (data.GenericError) {\r\n\t\t\t\t\tshowCropError(data.GenericError);\r\n\t\t\t\t\tresetButtons();\r\n\t\t\t\t}\r\n\t\t\t\tif (data.ResponseMessage) {\r\n\t\t\t\t\tshowCropError(data.ResponseMessage);\r\n\t\t\t\t\tresetButtons();\r\n\t\t\t\t}\r\n\t\t\t\tif (data.RedirectUrl) {\r\n\t\t\t\t\twindow.location.href = data.RedirectUrl;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}).fail(function () {\r\n\t\t\thideLoader();\r\n\t\t\tclose();\r\n\t\t});\r\n\t}\r\n\r\n\t// Handler for the successful AJAX callback of the saved cropped profilepic\r\n\tfunction handleCropSuccess(data) {\r\n\t\t$imagePreview.attr('src', data.ImageUrl);\r\n\r\n\t\tconsole.log($body.find('.registration-form').length);\r\n\r\n\t\tif (!$body.find('.registration-form').length) {\r\n\t\t\t$topAvatar.attr('srcset', '');\r\n\t\t\t$topAvatar.attr('src', data.ImageUrl);\r\n\t\t}\r\n\r\n\t\t$savedIdField.val(data.SavedId);\r\n\t\t$imageIdField.val(data.ImageId);\r\n\t\tclose();\r\n\t}\r\n\r\n\t// Show the error message in the overlay\r\n\tfunction showCropError(text) {\r\n\t\t$cropErrorMessage.text(text);\r\n\t\t$cropErrorMessage.css('display', 'block');\r\n\t}\r\n\r\n\tfunction resetButtons() {\r\n\t\t$cropBtn.attr('disabled', false);\r\n\t\t$cancelBtn.attr('disabled', false);\r\n\t}\r\n\r\n\t// Handler for the crop button - call drawImageToCanvas and sendImageData\r\n\tfunction crop() {\r\n\t\tdrawImageToCanvas();\r\n\t\tsendImageData();\r\n\t}\r\n\r\n\t// Set all coords (onSelect callback for the image cropper), stores the coords in global vars\r\n\tfunction setCoords(c) {\r\n\t\tcoordinates.x = c.x;\r\n\t\tcoordinates.y = c.y;\r\n\t\tcoordinates.x2 = c.x2;\r\n\t\tcoordinates.y2 = c.y2;\r\n\t\tcoordinates.w = c.w;\r\n\t\tcoordinates.h = c.h;\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tgeneralLoader: require('../views/general-loader')\r\n\t}\r\n));\r\n\r\n\n},{\"../views/general-loader\":28,\"./performance\":20}],18:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports;\r\n\r\n\tfunction AppLinkedinConnect(settings) {\r\n\t\tthis.settings = {\r\n\t\t\twindow: {\r\n\t\t\t\tw: 690,\r\n\t\t\t\th: 600\r\n\t\t\t},\r\n\t\t\tserviceUrl: window.location.origin + '/api/stream/profile/linkedin'\r\n\t\t};\r\n\r\n\t\tthis.AppPerformance = dep.performance;\r\n\r\n\t\t/* eslint new-cap: 0 */\r\n\t\tthis.$promise = new $.Deferred();\r\n\r\n\t\t$.extend(this.settings, settings);\r\n\r\n\t\tthis.destroyCallback();\r\n\t\tthis.createCallback();\r\n\t\tthis.openWindow();\r\n\t}\r\n\r\n\tAppLinkedinConnect.prototype.createCallback = function() {\r\n\t\twindow.linkedinAuth = this.linkedinAuth.bind(this);\r\n\t};\r\n\r\n\tAppLinkedinConnect.prototype.linkedinAuth = function(action, code, state) {\r\n\t\tthis.serviceData = {\r\n\t\t\taction: action,\r\n\t\t\tcode: code,\r\n\t\t\tstate: state\r\n\t\t};\r\n\r\n\t\tthis.loadService(this.settings.serviceUrl);\r\n\t\tthis.destroyCallback();\r\n\t};\r\n\r\n\tAppLinkedinConnect.prototype.openWindow = function() {\r\n\t\tvar top = this.AppPerformance.getDeviceProperties().window.h / 2 - this.settings.window.h / 2,\r\n\t\t\tleft = this.AppPerformance.getDeviceProperties().window.w / 2 - this.settings.window.w / 2;\r\n\r\n\t\twindow.open(this.settings.url, '_linkedinAuthWin', 'height=' + this.settings.window.h +\r\n\t\t\t',width=' + this.settings.window.w + ',scrollbars=1,resizable=1,titlebar=1,toolbar=0,menubar=0,top=' + top + ',left=' + left);\r\n\r\n\t};\r\n\r\n\tAppLinkedinConnect.prototype.destroyCallback = function() {\r\n\t\twindow.linkedinAuth = null;\r\n\t};\r\n\r\n\tAppLinkedinConnect.prototype.loadService = function(url) {\r\n\t\t$.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: 'post',\r\n\t\t\tdata: JSON.stringify(this.serviceData),\r\n\t\t\tcontentType: 'application/json; charset=utf-8',\r\n\t\t\tdataType: 'json',\r\n\t\t\tcache: false\r\n\t\t}).then(this.$promise.resolve, this.$promise.reject);\r\n\r\n\t\tthis.serviceData = null;\r\n\t};\r\n\r\n\texports = {\r\n\t\tAppLinkedinConnect: AppLinkedinConnect\r\n\t};\r\n\r\n\treturn exports;\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\n},{\"./performance\":20}],19:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar AppLinkedinConnect,\r\n\t\texports,\r\n\t\t$body,\r\n\t\t$inputLinkedInProfileLink,\r\n\t\tlinkedinUrl;\r\n\r\n\tAppLinkedinConnect = dep.linkedinConnect.AppLinkedinConnect;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t\tinitVariables();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$inputLinkedInProfileLink = $('#LinkedIn');\r\n\t}\r\n\r\n\tfunction initVariables() {\r\n\t\tlinkedinUrl = $('[data-linkedin-url]').data('linkedin-url');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\timportFromLinkedin();\r\n\t\t\t}\r\n\t\t}, '[data-linkedin-import]');\r\n\t}\r\n\r\n\tfunction importFromLinkedin() {\r\n\t\tvar connection = new AppLinkedinConnect({\r\n\t\t\t\turl: linkedinUrl\r\n\t\t\t}),\r\n\t\t\t$parentFormElement = $('[data-form-element=\"LinkedIn\"]'),\r\n\t\t\terrorClass = 'form-element--has-error';\r\n\r\n\t\tconnection.$promise.then(function(data) {\r\n\t\t\tif (data.PublicUrl) {\r\n\t\t\t\t$parentFormElement.removeClass(errorClass);\r\n\t\t\t\t$inputLinkedInProfileLink.val(data.PublicUrl);\r\n\t\t\t} else {\r\n\t\t\t\t$parentFormElement.addClass(errorClass);\r\n\t\t\t\t$inputLinkedInProfileLink.val('');\r\n\t\t\t\t$inputLinkedInProfileLink.next('.form-element__error').text('Error getting LinkedIn profile link, try typing it in');\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\tlinkedinConnect: require('./linkedin-connect')\r\n\t}\r\n));\r\n\n},{\"./linkedin-connect\":18,\"./performance\":20}],20:[function(require,module,exports){\nmodule.exports = (function () {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tresizeTid,\r\n\t\t$cachedDOM,\r\n\t\tdeviceProperties;\r\n\r\n\tfunction init() {\r\n\t\tinitCacheDOM();\r\n\t\tinitBindings();\r\n\t\tinitTouch();\r\n\t\tsaveDeviceProperties();\r\n\t}\r\n\r\n\tfunction initCacheDOM() {\r\n\t\t$cachedDOM = {\r\n\t\t\twindow: window,\r\n\t\t\t$window: $(window),\r\n\t\t\t$body: $(document.body),\r\n\t\t\t$html: $('html'),\r\n\t\t\t$head: $('head'),\r\n\t\t\t$htmlbody: $('html, body')\r\n\t\t};\r\n\t}\r\n\r\n\tfunction initTouch() {\r\n\t\tif ('touchAction' in document.body.style) {\r\n\t\t\tdocument.body.style.touchAction = 'manipulation';\r\n\t\t} else {\r\n\t\t\twindow.addEventListener('load', function () {\r\n\t\t\t\tFastClick.attach(document.body);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction getCachedDom() {\r\n\t\treturn $cachedDOM;\r\n\t}\r\n\r\n\tfunction getDeviceProperties() {\r\n\t\treturn deviceProperties;\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$(window).on('resize', function () {\r\n\t\t\twindow.clearTimeout(resizeTid);\r\n\t\t\tresizeTid = window.setTimeout(function () {\r\n\t\t\t\tsaveDeviceProperties();\r\n\t\t\t}, 250);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction saveDeviceProperties() {\r\n\t\tvar w = window,\r\n\t\t\td = document,\r\n\t\t\te = d.documentElement,\r\n\t\t\tg = d.getElementsByTagName('body')[0],\r\n\t\t\tW = w.innerWidth || e.clientWidth || g.clientWidth,\r\n\t\t\tH = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n\t\tdeviceProperties = {\r\n\t\t\tconnection: navigator.connection ? navigator.connection : 'unknown',\r\n\t\t\tpixelRatio: window.devicePixelRatio,\r\n\t\t\twindow: {\r\n\t\t\t\twidth: W,\r\n\t\t\t\theight: H\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tinitCacheDOM: initCacheDOM,\r\n\t\tgetCachedDom: getCachedDom,\r\n\t\tgetDeviceProperties: getDeviceProperties\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}());\r\n\r\n\n},{}],21:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tslideToClasses,\r\n\t\t$body;\r\n\r\n\tfunction init() {\r\n\r\n\t\tslideToClasses = Array.apply(0, new Array(20)).map(function (x, y) {\r\n\t\t\treturn 'slide-to-' + parseInt(y + 1, 10);\r\n\t\t});\r\n\r\n\t\tinitDOMElements();\r\n\t\tcheckForQuotes();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t}\r\n\r\n\tfunction checkForQuotes() {\r\n\t\t$body.find('[data-quotes]').each(function () {\r\n\t\t\tinitQuotes($(this));\r\n\t\t});\r\n\t}\r\n\r\n\tfunction initQuotes($obj) {\r\n\t\tvar $wrapper = $obj,\r\n\t\t\tparams,\r\n\t\t\tquotesData;\r\n\r\n\t\tif ($wrapper.data('quotesData') === undefined) {\r\n\r\n\t\t\tparams = $wrapper && $wrapper.attr('data-quotes') && $wrapper.attr('data-quotes').split(':');\r\n\r\n\t\t\tquotesData = {};\r\n\t\t\tquotesData.currentIndex = 1;\r\n\t\t\tquotesData.tid = 0;\r\n\t\t\tquotesData.auto = params[0] && params[0] === 'auto' || false;\r\n\t\t\tquotesData.delay = params[1] || 5000;\r\n\t\t\tquotesData.loop = params[2] && params[2] === 'loop' || false;\r\n\r\n\t\t\t$wrapper.data({quotesData: quotesData});\r\n\r\n\t\t\tupdateQuotes($wrapper);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction updateQuotes($obj) {\r\n\t\tvar quotesData = $obj.data('quotesData'),\r\n\t\t\t$wrapper = $obj,\r\n\t\t\t$sources = $wrapper.find('[data-quotes-sources]'),\r\n\t\t\t$slides = $wrapper.find('[data-quotes-slides]'),\r\n\t\t\tcurrentIndex = quotesData.currentIndex;\r\n\r\n\t\t$sources.find('ul li').removeClass('active').eq(currentIndex - 1).addClass('active');\r\n\t\t$slides.removeClass(slideToClasses.join(' ')).addClass('slide-to-' + currentIndex);\r\n\r\n\t\tquotesData.currentIndex = quotesData.currentIndex > $slides.find('ul li').length - 1 ? 1 : currentIndex + 1;\r\n\r\n\t\t$wrapper.data({quotesData: quotesData});\r\n\r\n\t\twindow.clearRequestTimeout(quotesData.tid);\r\n\t\tquotesData.tid = window.requestTimeout(function () {\r\n\t\t\tupdateQuotes($wrapper);\r\n\t\t}, quotesData.delay);\r\n\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\r\n\n},{\"./performance\":20}],22:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$window,\r\n\t\t$body,\r\n\t\tserviceURL,\r\n\t\t$masonryGrid,\r\n\t\t$mansoryItem,\r\n\t\t$articlesPromise,\r\n\t\tpageNumber,\r\n\t\tresultData = {},\r\n\t\thb,\r\n\t\tloaderClass,\r\n\t\tloaderTid,\r\n\t\tverificationToken,\r\n\t\tloaderDelay = 150,\r\n\t\tready = true;\r\n\r\n\tfunction init() {\r\n\t\tif ($('[data-result-page]').length) {\r\n\t\t\tinitDOMElements();\r\n\t\t\tinitBindings();\r\n\r\n\t\t\tinitMasonryGrid();\r\n\r\n\t\t\tloaderClass = dep.generalLoader;\r\n\t\t\thb = dep.handlebars;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$masonryGrid = $body.find('[data-masonry-block]');\r\n\t\t$mansoryItem = $masonryGrid.find('[data-masonry-item]');\r\n\t\tserviceURL = $masonryGrid.attr('data-service-url');\r\n\t\tpageNumber = $masonryGrid.attr('data-id-page');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$window.on({\r\n\t\t\tscroll: function() {\r\n\t\t\t\tscrolling();\r\n\t\t\t},\r\n\t\t\tresize: function () {\r\n\t\t\t\tinitMasonryGrid();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction scrolling(){\r\n\t\tvar currentHeight = $(document).height() - 50,\r\n\t\t\twindowHeight = $window.scrollTop() + $window.height();\r\n\r\n\t\tif(windowHeight >= currentHeight && ready === true){\r\n\t\t\tready = false;\r\n\t\t\t$(this).unbind('scroll');\r\n\t\t\tsendRequest();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initMasonryGrid() {\r\n\t\tif($window.outerWidth() > 769 ) {\r\n\t\t\tif($mansoryItem.length) {\r\n\t\t\t\t$masonryGrid.isotope({\r\n\t\t\t\t\tlayoutMode: 'packery',\r\n\r\n\t\t\t\t\titemSelector: '.brand-items__item',\r\n\t\t\t\t\tpercentPosition: true\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t$masonryGrid.isotope().isotope('destroy');\r\n\t\t}\r\n\r\n\t}\r\n\tfunction updateMasonryGrid(itemsHTML) {\r\n\t\tvar $items = $(itemsHTML);\r\n\r\n\t\tif($window.outerWidth() > 769 ) {\r\n\t\t\tif($mansoryItem.length) {\r\n\t\t\t\t$masonryGrid.append($items)\r\n\t\t\t\t\t.isotope({\r\n\t\t\t\t\t\tlayoutMode: 'packery',\r\n\r\n\t\t\t\t\t\titemSelector: '.brand-items__item',\r\n\t\t\t\t\t\tpercentPosition: true\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.isotope('appended', $items);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t$masonryGrid.append($items)\r\n\t\t\t\t.isotope({\r\n\t\t\t\t\tlayoutMode: 'packery',\r\n\r\n\t\t\t\t\titemSelector: '.brand-items__item',\r\n\t\t\t\t\tpercentPosition: true\r\n\t\t\t\t})\r\n\t\t\t\t.isotope('appended', $items).isotope('destroy');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tdep.generalLoader.hideLoader();\r\n\t}\r\n\r\n\tfunction showDelayedLoader() {\r\n\t\tclearTimeout(loaderTid);\r\n\t\tloaderTid = setTimeout(function () {\r\n\t\t\tloaderClass.showLoader();\r\n\t\t}, loaderDelay);\r\n\t}\r\n\r\n\tfunction sendRequest() {\r\n\t\thideLoader();\r\n\t\tshowDelayedLoader();\r\n\t\tresultData = 'PageNumber=' + pageNumber;\r\n\r\n\t\t$articlesPromise = $.ajax({\r\n\t\t\ttype: 'get',\r\n\t\t\turl: serviceURL,\r\n\t\t\tdata: resultData,\r\n\t\t\tprocessData: false,\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($articlesPromise).then(function (result) {\r\n\t\t\thideLoader();\r\n\r\n\r\n\t\t\tif ( result && result.IsSuccess === true ) {\r\n\r\n\t\t\t\tupdateMasonryGrid(hb.getTpl('result-page-item')(result));\r\n\t\t\t\tif(result.HasNext) {\r\n\t\t\t\t\t$window.on('scroll', scrolling);\r\n\t\t\t\t\tpageNumber = result.PageNumber;\r\n\t\t\t\t\tready = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}, function () {\r\n\t\t\thideLoader();\r\n\t\t});\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tsendRequest: sendRequest\r\n\t};\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance'),\r\n\t\thandlebars: require('./handlebars-helpers'),\r\n\t\tgeneralLoader: require('../views/general-loader')\r\n\t}\r\n));\r\n\n},{\"../views/general-loader\":28,\"./handlebars-helpers\":14,\"./performance\":20}],23:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\tlinkedinUrl,\r\n\t\tideaUrl,\r\n\t\tideaTitle,\r\n\t\tideaDescription,\r\n\t\ttitleArray,\r\n\t\ttwitterUser;\r\n\r\n\tfunction init() {\r\n\t\tcheckSocialMedia();\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\r\n\t\tlinkedinUrl = 'https://www.linkedin.com/shareArticle?';\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tideaUrl = $(e.currentTarget).closest('[data-idea]').attr('data-idea-url');\r\n\t\t\t\tideaTitle = $(e.currentTarget).closest('[data-idea]').find('[data-idea-title]').text();\r\n\t\t\t\tideaDescription = $(e.currentTarget).closest('[data-idea]').find('[data-idea-description]').text();\r\n\t\t\t\ttwitterUser = $(e.currentTarget).closest('[data-idea]').attr('data-idea-twitter-user');\r\n\t\t\t\ttitleArray = ideaTitle.split('|');\r\n\t\t\t\tideaTitle = titleArray[0];\r\n\r\n\t\t\t\tif(twitterUser.length === 1) {\r\n\t\t\t\t\ttwitterUser = '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif($(e.currentTarget).attr('data-social-share') === 'twitter') {\r\n\t\t\t\t\ttwitterShare(ideaTitle + ' Great idea from ' + twitterUser + ' #wppstream', ideaUrl);\r\n\t\t\t\t} else if ($(e.currentTarget).attr('data-social-share') === 'linkedin') {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t$(e.currentTarget).attr('href', linkedinUrl + 'mini=true&url=' + ideaUrl + '&title=' + ideaTitle + '&summary=' + ideaDescription + '&source=WPPStream');\r\n\t\t\t\t\twindow.open($(e.currentTarget).attr('href'), 'linkedinwindow', 'left=20,top=20,width=300,height=300,toolbar=0,resizable=1');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-social-share]');\r\n\t}\r\n\r\n\tfunction twitterShare(tweet, url) {\r\n\t\tvar escapedTweet = encodeURIComponent(tweet),\r\n\t\t\tescapedUrl = encodeURIComponent(url),\r\n\t\t\twidth = 575,\r\n\t\t\theight = 400,\r\n\t\t\tleft = ($(window).width() - width) / 2,\r\n\t\t\ttop = ($(window).height() - height) / 2,\r\n\t\t\tshareUrl,\r\n\t\t\topts;\r\n\r\n\t\tshareUrl = 'http://twitter.com/share?text=' + escapedTweet + '&url=' + escapedUrl;\r\n\t\topts = 'status=1' +\r\n\t\t\t',width=' + width +\r\n\t\t\t',height=' + height +\r\n\t\t\t',top=' + top +\r\n\t\t\t',left=' + left;\r\n\r\n\t\twindow.open(shareUrl, 'twitter', opts);\r\n\t}\r\n\r\n\tfunction checkSocialMedia() {\r\n\t\tvar twButton = $('[data-social-share=\"twitter\"]'),\r\n\t\t\tliButton = $('[data-social-share=\"linkedin\"]');\r\n\r\n\t\tif (twButton !== null) {\r\n\t\t\tloadTwitter();\r\n\t\t}\r\n\r\n\t\tif (liButton !== null) {\r\n\t\t\tloadLinkedin();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadLinkedin() {\r\n\t\tvar src = '//platform.linkedin.com/in.js?async=true',\r\n\t\t\tjs = document.getElementsByTagName('script')[0],\r\n\t\t\tliScript1 = document.createElement('script'),\r\n\t\t\tliScript2 = document.createElement('script');\r\n\r\n\t\tliScript1.setAttribute('src', src);\r\n\t\tliScript2.setAttribute('type', 'IN/Share');\r\n\t\tjs.parentNode.insertBefore(liScript1, js);\r\n\t\tjs.parentNode.insertBefore(liScript2, js);\r\n\t}\r\n\r\n\tfunction loadTwitter() {\r\n\t\twindow.twttr = (function (d, s, id) {\r\n\t\t\tvar js, fjs = d.getElementsByTagName(s)[0],\r\n\t\t\t\tt = window.twttr || {};\r\n\r\n\t\t\tif (d.getElementById(id)) {\r\n\t\t\t\treturn t;\r\n\t\t\t}\r\n\t\t\tjs = d.createElement(s);\r\n\t\t\tjs.id = id;\r\n\t\t\tjs.src = '//platform.twitter.com/widgets.js';\r\n\t\t\tfjs.parentNode.insertBefore(js, fjs);\r\n\t\t\tt._e = [];\r\n\t\t\tt.ready = function (f) {\r\n\t\t\t\tt._e.push(f);\r\n\t\t\t};\r\n\r\n\t\t\treturn t;\r\n\t\t}(document, 'script', 'twitter-wjs'));\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\r\n\n},{\"./performance\":20}],24:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\tsettings,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\t$body = null;\r\n\t\tsettings = {\r\n\t\t\tsvgUrl: '/i/sprite/sprite-app.svg'\r\n\t\t};\r\n\r\n\t\tinitDOMElements();\r\n\t\tcheckAssetRoot();\r\n\t\tloadSvg();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction checkAssetRoot() {\r\n\t\tif ($body && $body.attr('data-sprite-url') !== undefined) {\r\n\t\t\tsettings.svgUrl = $body.attr('data-sprite-url');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadSvg() {\r\n\t\tvar $promise = $.ajax({\r\n\t\t\ttype: 'GET',\r\n\t\t\turl: settings.svgUrl,\r\n\t\t\tdataType: 'html',\r\n\t\t\tcontentType: 'application/json; charset=utf-8',\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$.when($promise).then(function (result) {\r\n\t\t\taddSpriteToDOM(result);\r\n\t\t}, function () {\r\n\t\t\tconsole.log('%c [Module - SVG] - Sprite SVG can\\'t be loaded: %s ', 'background: #ea4118; color: #fff', settings.svgUrl);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction addSpriteToDOM(sprite) {\r\n\t\t$body.find('[data-svgsprite]').remove();\r\n\t\t$body.append('
' + sprite + '
');\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./performance')\r\n\t}\r\n));\r\n\r\n\n},{\"./performance\":20}],25:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\ttargets = [],\r\n\t\tplayers = [];\r\n\r\n\t/* eslint-disable */\r\n\tif (typeof Object.assign !== 'function') {\r\n\t\tObject.assign = function(target) {\r\n\t\t\t'use strict';\r\n\t\t\tif (target == null) {\r\n\t\t\t\tthrow new TypeError('Cannot convert undefined or null to object');\r\n\t\t\t}\r\n\r\n\t\t\ttarget = Object(target);\r\n\t\t\tfor (var index = 1; index < arguments.length; index++) {\r\n\t\t\t\tvar source = arguments[index];\r\n\t\t\t\tif (source != null) {\r\n\t\t\t\t\tfor (var key in source) {\r\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\r\n\t\t\t\t\t\t\ttarget[key] = source[key];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t};\r\n\t}\r\n\t/* eslint-enable */\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\r\n\t\tif (targets.length > 0) {\r\n\t\t\tinjectYTScript();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction injectYTScript() {\r\n\t\tvar tag = document.createElement('script'),\r\n\t\t\tfirstScriptTag;\r\n\r\n\t\tfirstScriptTag = document.getElementsByTagName('script')[0];\r\n\t//\ttag.src = '//www.youtube.com/iframe_api';\r\n\t\ttag.src = '/WPPStream/js/libs/yt_api.js';\r\n\t\tfirstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n\r\n\t\twindow.onYouTubeIframeAPIReady = onYouTubeIframeAPIReady;\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$body.find('[data-video-player]').each(function () {\r\n\t\t\ttargets.push($(this));\r\n\t\t});\r\n\t}\r\n\r\n\tfunction onYouTubeIframeAPIReady() {\r\n\t\tvar player,\r\n\t\t\tvideoId;\r\n\r\n\t\t$.each(targets, function (k, v) {\r\n\t\t\tvar playerVars = {rel: 0, iv_load_policy: 3};\r\n\r\n\t\t\tvideoId = v.attr('data-video-player');\r\n\t\t\tif(v.attr('data-settings') && v.attr('data-settings').length) {\r\n\t\t\t\tObject.assign(playerVars, JSON.parse(v.attr('data-settings')));\r\n\t\t\t}\r\n\t\t\tplayer = new YT.Player(v[0], {\r\n\t\t\t\twidth: v[0].clientWidth,\r\n\t\t\t\theight: v[0].clientHeight,\r\n\t\t\t\tvideoId: videoId,\r\n\t\t\t\ttitle: '',\r\n\t\t\t\tplayerVars: playerVars,\r\n\t\t\t\tevents: {\r\n\t\t\t\t\tonReady: function (event) {\r\n\t\t\t\t\t\tplayerReady(event);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonStateChange: function (event) {\r\n\t\t\t\t\t\tplayerStateChange(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tplayers.push(player);\r\n\r\n\t\t\t$body.find('[data-video-cover]').on('click', function() {\r\n\t\t\t\tif ($(this).attr('data-video-cover') === videoId) {\r\n\t\t\t\t\tplayer.playVideo();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t$body.find('[data-video-autoplay]').on('click', function() {\r\n\t\t\t\tif ($(this).attr('data-video-autoplay') === videoId) {\r\n\t\t\t\t\tplayer.playVideo();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tfunction playerReady(event) {\r\n\t\tvar videoData = event.target.getVideoData(),\r\n\t\t\t$autoPlay = $body.find('[data-video-autoplay=\"' + videoData.video_id + '\"]');\r\n\r\n\t\tif ($autoPlay.length) {\r\n\t\t\t$autoPlay.click();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction playerStateChange(event) {\r\n\t\tvar videoData = event.target.getVideoData(),\r\n\t\t\tstate = event.data,\r\n\t\t\t$cover;\r\n\r\n\t\tif (videoData && videoData.video_id) {\r\n\t\t\t$cover = $body.find('[data-video-cover=\"' + videoData.video_id + '\"]');\r\n\t\t}\r\n\r\n\t\tif ($cover.length > 0) {\r\n\r\n\t\t\tif (state !== 0) {\r\n\t\t\t\tdep.analytics.trackEvent('Video', 'Play');\r\n\t\t\t\t$cover.addClass('hide');\r\n\t\t\t} else {\r\n\t\t\t\t$cover.removeClass('hide');\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('../utils/performance'),\r\n\t\tanalytics: require('./analytics')\r\n\t}\r\n));\r\n\r\n\n},{\"../utils/performance\":20,\"./analytics\":3}],26:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\tCarousel,\r\n\t\ttmp;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tlazyLoadImages();\r\n\t\t$body.find('[data-box-carousel]').each(function () {\r\n\t\t\ttmp = new Carousel($(this));\r\n\t\t\tconsole.log(tmp);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t}\r\n\r\n\tfunction lazyLoadImages() {\r\n\t\t[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {\r\n\t\t\timg.setAttribute('src', img.getAttribute('data-src'));\r\n\t\t\timg.onload = function() {\r\n\t\t\t\timg.removeAttribute('data-src');\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\r\n\tCarousel = function ($carousel) {\r\n\t\tvar actualStep = 0,\r\n\t\t\titemCount,\r\n\t\t\t$boxCarouselItem,\r\n\t\t\tboxCarouselTimer;\r\n\r\n\r\n\t\tfunction initBoxCarousel() {\r\n\r\n\t\t\t$boxCarouselItem = $carousel.find('[data-box-carousel-item]');\r\n\t\t\tboxCarouselTimer = $carousel.attr('data-box-carousel-timer');\r\n\r\n\t\t\titemCount = $boxCarouselItem.length;\r\n\r\n\t\t\tactualStep = Math.floor(Math.random() * (itemCount - 1)) + 1;\r\n\t\t\tif(itemCount > 1) {\r\n\t\t\t\t$boxCarouselItem.eq(actualStep).addClass('active');\r\n\t\t\t} else {\r\n\t\t\t\t$boxCarouselItem.eq(0).addClass('active');\r\n\t\t\t}\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\t$carousel.addClass('ready');\r\n\t\t\t}, 8);\r\n\r\n\t\t\tif(itemCount > 1) {\r\n\t\t\t\tanimateBoxCarousel();\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction animateBoxCarousel() {\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tif (actualStep < itemCount - 1) {\r\n\t\t\t\t\tactualStep++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tactualStep = 0;\r\n\t\t\t\t}\r\n\t\t\t\t$carousel.find('.active').addClass('out');\r\n\t\t\t\t$boxCarouselItem.removeClass('active');\r\n\t\t\t\t$boxCarouselItem.eq(actualStep).addClass('active');\r\n\t\t\t\tanimateBoxCarousel();\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t$carousel.find('.out').removeClass('out');\r\n\t\t\t\t}, 3000);\r\n\t\t\t}, boxCarouselTimer);\r\n\r\n\t\t}\r\n\r\n\t\tinitBoxCarousel();\r\n\r\n\t};\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./../utils/performance')\r\n\t}\r\n));\r\n\n},{\"./../utils/performance\":20}],27:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\tvar $body,\r\n\t\t$gallery,\r\n\t\thb,\r\n\t\t$hbWrapper,\r\n\t\t$hbOverlayWrapper,\r\n\t\t$galleryOverlay,\r\n\t\ttargetURL;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\r\n\t\tif ($gallery.length && window.photos) {\r\n\t\t\thb = dep.handlebars;\r\n\t\t\t$hbWrapper = $body.find('[data-hb-wrapper=\"gallery-item\"]');\r\n\t\t\t$hbOverlayWrapper = $body.find('[data-hb-wrapper=\"gallery-overlay\"]');\r\n\t\t\thandleGallerySources();\r\n\t\t\tloadImages();\r\n\t\t\tsetupDensity();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$gallery = $body.find('[data-gallery]');\r\n\t\t$galleryOverlay = $body.find('[data-gallery-overlay]');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\ttargetURL = $(e.currentTarget).find('img').attr('src');\r\n\t\t\t\thandleOverlay(targetURL);\r\n\t\t\t}\r\n\t\t}, '[data-gallery-item]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tif(!isGallerySlideshowActive()) {\r\n\t\t\t\t\ttargetURL = $(e.currentTarget).attr('data-overlay-next-url');\r\n\t\t\t\t\thandleOverlay(targetURL);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-overlay-next-url]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tif(!isGallerySlideshowActive()) {\r\n\t\t\t\t\ttargetURL = $(e.currentTarget).attr('data-overlay-prev-url');\r\n\t\t\t\t\thandleOverlay(targetURL);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-overlay-prev-url]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\t$galleryOverlay.removeClass('gallery-overlay--slideshow');\r\n\t\t\t\t$galleryOverlay.removeAttr('data-gallery-slideshow');\r\n\t\t\t\tcloseGalleryOverlay();\r\n\t\t\t}\r\n\t\t}, '[data-gallery-close]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\t$galleryOverlay.addClass('gallery-overlay--slideshow');\r\n\t\t\t\t$galleryOverlay.attr('data-gallery-slideshow', 5000);\r\n\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-next-url]').attr('data-overlay-next-url'));\r\n\t\t\t}\r\n\t\t}, '[data-overlay-slideshow=\"play\"]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\t$galleryOverlay.removeClass('gallery-overlay--slideshow');\r\n\t\t\t\t$galleryOverlay.removeAttr('data-gallery-slideshow');\r\n\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-next-url]').attr('data-overlay-next-url'));\r\n\t\t\t}\r\n\t\t}, '[data-overlay-slideshow=\"pause\"]');\r\n\r\n\t\t$body.on({\r\n\t\t\tkeydown: function (e) {\r\n\t\t\t\tif ((e.which === 27 || e.keyCode === 27) && isGalleryOverlayActive()) {\r\n\t\t\t\t\t$galleryOverlay.removeClass('gallery-overlay--slideshow');\r\n\t\t\t\t\t$galleryOverlay.removeAttr('data-gallery-slideshow');\r\n\t\t\t\t\tcloseGalleryOverlay();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$body.on({\r\n\t\t\tkeydown: function (e) {\r\n\t\t\t\tif ((e.which === 37 || e.keyCode === 37) && isGalleryOverlayActive() && !isGallerySlideshowActive()) {\r\n\t\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-prev-url]').attr('data-overlay-prev-url'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$body.on({\r\n\t\t\tkeydown: function (e) {\r\n\t\t\t\tif ((e.which === 39 || e.keyCode === 39 || e.which === 32 || e.keyCode === 32) && isGalleryOverlayActive() && !isGallerySlideshowActive()) {\r\n\t\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-next-url]').attr('data-overlay-next-url'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction handleGallerySources() {\r\n\r\n\t\tif ($hbWrapper.length > 0) {\r\n\t\t\t$hbWrapper.html(hb.getTpl('gallery-item')(window.photos));\r\n\t\t\tloadImages();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadImages() {\r\n\t\tif($hbWrapper && $hbWrapper.length) {\r\n\t\t\t$hbWrapper.find('[data-lazy]:not([data-lazy-initialized])').attr('data-lazy-initialized', 1).on('load', function () {\r\n\t\t\t\t$(this).parents('[data-gallery-item]').first().removeClass('loading').addClass('loaded');\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setupDensity() {\r\n\t\t$gallery.attr('data-density', window.photos.length % parseInt($gallery.attr('data-density-step'), 10));\r\n\t}\r\n\r\n\tfunction handleOverlay(targetURL) {\r\n\t\tvar prevURL,\r\n\t\t\tnextURL,\r\n\t\t\ttargetIndex,\r\n\t\t\tprevIndex,\r\n\t\t\tnextIndex,\r\n\t\t\tlastIndex,\r\n\t\t\tarrayLength,\r\n\t\t\toverlaySources = {};\r\n\r\n\t\tcloseGalleryOverlay();\r\n\r\n\t\ttargetIndex = window.photos.map(function(e) {\r\n\t\t\treturn e.Src;\r\n\t\t}).indexOf(targetURL);\r\n\r\n\t\tarrayLength = window.photos.length;\r\n\t\tlastIndex = arrayLength - 1;\r\n\r\n\t\tif(targetIndex === 0) {\r\n\t\t\tprevIndex = lastIndex;\r\n\t\t\tnextIndex = targetIndex + 1;\r\n\t\t} else if (targetIndex === lastIndex) {\r\n\t\t\tprevIndex = targetIndex - 1;\r\n\t\t\tnextIndex = 0;\r\n\t\t} else {\r\n\t\t\tprevIndex = targetIndex - 1;\r\n\t\t\tnextIndex = targetIndex + 1;\r\n\t\t}\r\n\r\n\t\tprevURL = window.photos[prevIndex].Src;\r\n\t\tnextURL = window.photos[nextIndex].Src;\r\n\r\n\t\toverlaySources.currentURL = targetURL;\r\n\t\toverlaySources.prevURL = prevURL;\r\n\t\toverlaySources.nextURL = nextURL;\r\n\r\n\t\tif ($hbOverlayWrapper.length > 0) {\r\n\t\t\t$hbOverlayWrapper.html(hb.getTpl('image-overlay')(overlaySources));\r\n\t\t\topenGalleryOverlay();\r\n\t\t\thandleGestures();\r\n\r\n\t\t\tif($galleryOverlay.attr('data-gallery-slideshow')) {\r\n\t\t\t\twindow.setTimeout(function () {\r\n\t\t\t\t\thandleOverlay(nextURL);\r\n\t\t\t\t}, $galleryOverlay.attr('data-gallery-slideshow'));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleGestures() {\r\n\t\tvar galleryOverlay,\r\n\t\t\tgalleryGestures;\r\n\r\n\r\n\t\tgalleryOverlay = document.getElementById('gallery-overlay');\r\n\t\tgalleryGestures = new Hammer(galleryOverlay);\r\n\r\n\t\tgalleryGestures.get('swipe').set({ threshold: 10 });\r\n\r\n\t\tgalleryGestures.on('swipeleft swiperight', function(ev) {\r\n\t\t\tif(ev.type === 'swipeleft' && !isGallerySlideshowActive()) {\r\n\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-prev-url]').attr('data-overlay-prev-url'));\r\n\t\t\t}\r\n\r\n\t\t\tif(ev.type === 'swiperight' && !isGallerySlideshowActive()) {\r\n\t\t\t\thandleOverlay($galleryOverlay.find('[data-overlay-next-url]').attr('data-overlay-next-url'));\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction closeGalleryOverlay() {\r\n\t\t$galleryOverlay.removeClass('gallery-overlay--visible');\r\n\t\t$galleryOverlay.addClass('gallery-overlay--hidden');\r\n\t\t$body.css('overflow', '');\r\n\t}\r\n\r\n\tfunction openGalleryOverlay() {\r\n\t\t$galleryOverlay.addClass('gallery-overlay--show-controlls');\r\n\t\t$galleryOverlay.removeClass('gallery-overlay--hidden');\r\n\t\t$galleryOverlay.addClass('gallery-overlay--visible');\r\n\t\t$body.css('overflow', 'hidden');\r\n\t\twindow.setTimeout(function () {\r\n\t\t\t$galleryOverlay.removeClass('gallery-overlay--show-controlls');\r\n\t\t}, 1100);\r\n\t}\r\n\r\n\tfunction isGalleryOverlayActive() {\r\n\t\treturn $galleryOverlay.hasClass('gallery-overlay--visible');\r\n\t}\r\n\r\n\tfunction isGallerySlideshowActive() {\r\n\t\treturn $galleryOverlay.hasClass('gallery-overlay--slideshow');\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\treturn exports;\r\n}({\r\n\tperformance: require('../utils/performance'),\r\n\thandlebars: require('../utils/handlebars-helpers')\r\n}));\r\n\r\n\n},{\"../utils/handlebars-helpers\":14,\"../utils/performance\":20}],28:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\tisLoaderActive = false,\r\n\t\t$body;\r\n\r\n\tfunction init() {\r\n\t\tinitBinding();\r\n\t\tpressResultLoader();\r\n\t}\r\n\r\n\tfunction initBinding() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t}\r\n\r\n\tfunction showLoader() {\r\n\t\tif (isLoaderActive === false) {\r\n\t\t\t$body.attr('data-loader', 'visible');\r\n\t\t\tisLoaderActive = true;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hideLoader() {\r\n\t\tif (isLoaderActive === true) {\r\n\t\t\t$body.attr('data-loader', 'hidden');\r\n\t\t\tisLoaderActive = false;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction pressResultLoader() {\r\n\t\tvar moreText = $('[data-more-text]'),\r\n\t\t\tloadButton = $('[data-extend-content]');\r\n\r\n\t\tmoreText.hide();\r\n\r\n\t\tloadButton.click(function(){\r\n\t\t\tmoreText.show();\r\n\t\t\t$(this).remove();\r\n\t\t});\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init,\r\n\t\tshowLoader: showLoader,\r\n\t\thideLoader: hideLoader\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('../utils/performance')\r\n\t}\r\n));\r\n\r\n\n},{\"../utils/performance\":20}],29:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$html,\r\n\t\t$window,\r\n\t\t$body,\r\n\t\t$header,\r\n\t\t$subNavigation,\r\n\t\tcurrentSubnavigationId = false,\r\n\t\tclassNames = {\r\n\t\t\thtmlActive: 'html--header-active',\r\n\t\t\tsubNavigationActive: 'header--subnavigation-active',\r\n\t\t\tpageContentScrolled: 'header--scrolling'\r\n\t\t};\r\n\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\r\n\t\tcheckForLoginRequest();\r\n\t\thandleResize();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$html = dep.performance.getCachedDom().$html;\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$header = $body.find('[data-header]');\r\n\t\t$subNavigation = $header.find('[data-subnavigation]');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$window.on({\r\n\t\t\tscroll: function() {\r\n\t\t\t\tvar className = classNames.pageContentScrolled;\r\n\r\n\t\t\t\tif ($(this).scrollTop() > 0) {\r\n\t\t\t\t\t$header.addClass(className);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$header.removeClass(className);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tresize: function() {\r\n\t\t\t\tclearTimeout(window.resizedFinished);\r\n\t\t\t\twindow.resizedFinished = setTimeout(function(){\r\n\t\t\t\t\thandleResize();\r\n\t\t\t\t}, 300);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$header.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\tif ($header.attr('data-active')) {\r\n\t\t\t\t\tclosePanel();\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttogglePanel('mobile-nav');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, '[data-toggle=\"mobile-nav\"]');\r\n\r\n\t\t$header.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\ttogglePanel('account');\r\n\t\t\t}\r\n\t\t}, '[data-toggle=\"account\"]');\r\n\r\n\t\t$header.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\ttogglePanel('search');\r\n\t\t\t}\r\n\t\t}, '[data-toggle=\"search\"]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function (e) {\r\n\t\t\t\thandleBodyClick(e);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction handleResize() {\r\n\t\tdetachBindings();\r\n\t\tif ($window.width() > 1024) {\r\n\t\t\tinitDesktopBindings();\r\n\t\t} else {\r\n\t\t\tinitTouchBindings();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction detachBindings() {\r\n\t\tclosePanel();\r\n\t\t$header.off('click', '[data-subnavigation] [data-subnavigation-target]');\r\n\t\t$header.off('mouseenter', '[data-main-navigation] ul li');\r\n\t\t$header.off('mouseleave');\r\n\t}\r\n\r\n\tfunction initDesktopBindings() {\r\n\t\t$header.on({\r\n\t\t\tmouseenter: function () {\r\n\t\t\t\ttoggleSubnavigation($(this), false);\r\n\t\t\t}\r\n\t\t}, '[data-main-navigation] ul li');\r\n\r\n\t\t$header.on({\r\n\t\t\tmouseleave: function () {\r\n\t\t\t\tcloseSubNavigation();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction initTouchBindings() {\r\n\t\t$header.on({\r\n\t\t\tclick: function () {\r\n\t\t\t\ttoggleSubnavigation($(this), true);\r\n\t\t\t}\r\n\t\t}, '[data-subnavigation] [data-subnavigation-target]');\r\n\t}\r\n\r\n\tfunction handleBodyClick(e) {\r\n\t\tif (!$header.is(e.target) && $header.has(e.target).length === 0) {\r\n\t\t\tclosePanel();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction checkForLoginRequest() {\r\n\t\tif ($.trim($body.find('[data-form=\"login\"] input[name=\"Redirect\"]').val()) !== '') {\r\n\t\t\topenPanel('account');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction toggleSubnavigation($obj, isMobile) {\r\n\t\tvar id,\r\n\t\t\t$subNavigationItem;\r\n\r\n\t\tif ($obj && $obj.attr('data-subnavigation-target')) {\r\n\t\t\tid = $obj.attr('data-subnavigation-target').toLowerCase();\r\n\t\t\t$subNavigationItem = $subNavigation.find('[data-subnavigation-id=\"' + id + '\"]');\r\n\r\n\t\t\tif ($subNavigationItem.length > 0) {\r\n\r\n\t\t\t\tif (isMobile) {\r\n\t\t\t\t\t$obj.parent().siblings().find('[data-subnavigation-target]').removeClass('active');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$obj.siblings().removeClass('active');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$subNavigationItem.siblings().removeClass('active');\r\n\r\n\t\t\t\tif (currentSubnavigationId === false || currentSubnavigationId !== id) {\r\n\t\t\t\t\topenSubNavigation($obj, $subNavigationItem, isMobile);\r\n\t\t\t\t\tcurrentSubnavigationId = id;\r\n\t\t\t\t} else if (isMobile) {\r\n\t\t\t\t\tcloseSubNavigation(isMobile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tcloseSubNavigation(isMobile);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction openSubNavigation($obj, $subNavigationItem, isMobile) {\r\n\t\tif (!isMobile) {\r\n\t\t\t$header.attr('data-active', 'subnavigation');\r\n\t\t}\r\n\t\t$subNavigationItem.addClass('active');\r\n\t\t$obj.addClass('active');\r\n\t}\r\n\r\n\tfunction closeSubNavigation(isMobile) {\r\n\t\tif ($header.attr('data-active') === 'subnavigation' && !isMobile) {\r\n\t\t\t$header.attr('data-active', null);\r\n\t\t}\r\n\t\t$header.find('[data-subnavigation-id]').removeClass('active');\r\n\t\t$header.find('[data-subnavigation-target]').removeClass('active');\r\n\t\tcurrentSubnavigationId = false;\r\n\t}\r\n\r\n\tfunction togglePanel(name) {\r\n\t\tif ($header.attr('data-active') !== name) {\r\n\t\t\topenPanel(name);\r\n\t\t} else {\r\n\t\t\tclosePanel();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction openPanel(name) {\r\n\t\t$header.attr('data-active', name);\r\n\t\t$html.addClass(classNames.htmlActive);\r\n\t}\r\n\r\n\tfunction closePanel() {\r\n\t\t$header.attr('data-active', null);\r\n\t\t$html.removeClass(classNames.htmlActive);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('../utils/performance')\r\n\t}\r\n));\r\n\r\n\n},{\"../utils/performance\":20}],30:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$window,\r\n $participants;\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitBindings();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n $participants = $body.find('[data-participants]');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$participants.on({\r\n\t\t\tclick: function (e) {\r\n e.preventDefault();\r\n\t\t\t\ttoggleParticipantInfo($(e.currentTarget).closest('[data-participant-info]'));\r\n\t\t\t}\r\n\t\t}, '[data-participant-info] [data-participant-info-toggle]');\r\n\t}\r\n\r\n function toggleParticipantInfo($target) {\r\n if ($window.outerWidth() > 768) {\r\n $participants.find('[data-participant-info]').attr('data-participant-info', 'hidden');\r\n } else {\r\n $participants.find('[data-participant-info]').not($target).attr('data-participant-info', 'hidden');\r\n $target.attr('data-participant-info', $target.attr('data-participant-info') === 'hidden' ? 'visible' : 'hidden');\r\n $target[0].scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./../utils/performance')\r\n\t}\r\n));\r\n\r\n\n},{\"./../utils/performance\":20}],31:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\t'use strict';\r\n\r\n\tvar exports,\r\n\t\t$body,\r\n\t\t$partners,\r\n\t\t$partnersInner,\r\n\t\t$partnerItem,\r\n\t\tpartnerItemClone,\r\n\t\tcountPartnerItems,\r\n\t\tdiff,\r\n\t\tcurrentTime;\r\n\r\n\r\n\tfunction init() {\r\n\t\tinitDOMElements();\r\n\t\tinitPartnerLogos();\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\r\n\t\t$partners = $body.find('[data-partners]');\r\n\t\t$partnersInner = $partners;\r\n\t\t$partnerItem = $partnersInner.find('.partners__logo');\r\n\t}\r\n\r\n\tfunction initPartnerLogos() {\r\n\t\tcountPartnerItems = $partnerItem.length;\r\n\t\tdiff = countPartnerItems * 120 - $partners.width();\r\n\r\n\t\tif (diff > 0) {\r\n\t\t\tpartnerItemClone = $partnerItem.clone();\r\n\t\t\t$partnersInner.append(partnerItemClone);\r\n\t\t\t$partnerItem = $partnersInner.find('.partners__logo');\r\n\t\t\tcountPartnerItems = $partnerItem.length;\r\n\t\t\tconsole.log(diff);\r\n\t\t\t$partnersInner.css({width: countPartnerItems * 120});\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tcurrentTime = new Date();\r\n\t\t\t\tmovePartnerLogos();\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction movePartnerLogos() {\r\n\t\tvar dif = new Date().getTime() - currentTime.getTime(),\r\n\t\t\tvalue = dif / 16.66;\r\n\r\n\t\t$partnersInner.css({transform: 'translateX(-' + value + 'px)'});\r\n\r\n\t\tif(value > $partnersInner.width() / 2) {\r\n\t\t\tcurrentTime = new Date();\r\n\t\t}\r\n\r\n\t\trequestAnimationFrame(movePartnerLogos);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\r\n\r\n\treturn exports;\r\n\r\n}(\r\n\t{\r\n\t\tperformance: require('./../utils/performance')\r\n\t}\r\n));\r\n\n},{\"./../utils/performance\":20}],32:[function(require,module,exports){\nmodule.exports = (function () {\r\n\tvar exports,\r\n\t\t$pageContent,\r\n\t\t$sideBar,\r\n\t\tsidebarLayoutSettings = {\r\n\t\t\tminHeight: 600,\r\n\t\t\t// Standard classes for all image grid items\r\n\t\t\timageClasses: ['grid__item', 'image-content__image'],\r\n\t\t\tlayoutPattern: ['full', 'half', 'half'],\r\n\t\t\t// Image type specific classes\r\n\t\t\tpatternClasses: {\r\n\t\t\t\tfull: 'one-whole',\r\n\t\t\t\thalf: 'one-half'\r\n\t\t\t},\r\n\t\t\timageWidthToHeightRatio: 1\r\n\t\t},\r\n\t\tlayout = [];\r\n\r\n\r\n\tfunction init() {\r\n\t\t$(function() {\r\n\t\t\tif ($('[data-image-only-sidebar]').length && window.imageOnlySidebarSources) {\r\n\t\t\t\tinitDOMElements();\r\n\t\t\t\tinitLayout();\r\n\t\t\t\tappendImages();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$pageContent = $('.page .two-thirds');\r\n\t\t$sideBar = $('[data-image-only-sidebar]');\r\n\t}\r\n\r\n\tfunction initLayout() {\r\n\t\tvar availableHeight,\r\n\t\t\ti,\r\n\t\t\tminSidebarHeight = sidebarLayoutSettings.minHeight,\r\n\t\t\tpattern = sidebarLayoutSettings.layoutPattern,\r\n\t\t\tpatternLength = pattern.length,\r\n\t\t\timageType,\r\n\t\t\timageHeight,\r\n\t\t\tscreenEstateAvailable = true;\r\n\r\n\t\tavailableHeight = $pageContent.height() - $sideBar.height();\r\n\r\n\t\t// Set a minimum height explicitly so a few images are always rendered\r\n\t\tif (availableHeight < minSidebarHeight) {\r\n\t\t\tavailableHeight = minSidebarHeight;\r\n\t\t}\r\n\r\n\t\t// Display images in pattern until there is enough space\r\n\t\twhile (screenEstateAvailable) {\r\n\t\t\tfor (i = 0; i < patternLength; i++) {\r\n\t\t\t\timageType = pattern[i];\r\n\r\n\t\t\t\timageHeight = getFullSizeRelativeHeight(getRatio(imageType));\r\n\r\n\t\t\t\tif (imageHeight < availableHeight) {\r\n\t\t\t\t\tlayout.push(imageType);\r\n\r\n\t\t\t\t\t// Don't deduct height if the current image and the next image type are both type 'half' 'cause they fit on same line\r\n\t\t\t\t\tif (imageType !== pattern[i + 1]) {\r\n\t\t\t\t\t\tavailableHeight -= imageHeight;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscreenEstateAvailable = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction appendImages() {\r\n\t\tvar i,\r\n\t\t\tvalue,\r\n\t\t\tj,\r\n\t\t\tel,\r\n\t\t\timageGridItems = document.createDocumentFragment(),\r\n\t\t\timgClasses = sidebarLayoutSettings.imageClasses,\r\n\t\t\tptrnClasses = sidebarLayoutSettings.patternClasses,\r\n\t\t\tgridItem,\r\n\t\t\timg;\r\n\r\n\t\tfor (i = 0; i < layout.length; i++) {\r\n\t\t\tif (!imageOnlySidebarSources[i]) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tvalue = layout[i];\r\n\r\n\t\t\tgridItem = document.createElement('div');\r\n\r\n\t\t\t// Add image type specific class\r\n\t\t\tgridItem.className = ptrnClasses[value];\r\n\t\t\t// Add all standard classes\r\n\t\t\tfor (j = 0; j < imgClasses.length; j++) {\r\n\t\t\t\tel = imgClasses[j];\r\n\t\t\t\tgridItem.classList.add(el);\r\n\t\t\t}\r\n\r\n\t\t\timg = document.createElement('img');\r\n\t\t\t// Set image source from preloaded list\r\n\t\t\timg.setAttribute('src', imageOnlySidebarSources[i]);\r\n\t\t\timg.setAttribute('alt', '');\r\n\r\n\t\t\tgridItem.appendChild(img);\r\n\t\t\timageGridItems.appendChild(gridItem);\r\n\t\t}\r\n\r\n\t\t$sideBar.find('[data-image-grid]').append(imageGridItems);\r\n\t}\r\n\r\n\tfunction getRatio(size) {\r\n\t\tvar ratio;\r\n\r\n\t\tswitch (size) {\r\n\t\tcase 'full':\r\n\t\t\tratio = 1;\r\n\t\t\tbreak;\r\n\t\tcase 'half':\r\n\t\t\tratio = 1 / 2;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn ratio;\r\n\t}\r\n\r\n\tfunction getFullSizeRelativeHeight(ratio) {\r\n\t\tvar fullSizeImageWidth = $sideBar.width(),\r\n\t\t\tfullSizeImageHeight = sidebarLayoutSettings.imageWidthToHeightRatio;\r\n\r\n\t\treturn parseInt(fullSizeImageWidth / fullSizeImageHeight * ratio, 10);\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\treturn exports;\r\n}());\r\n\n},{}],33:[function(require,module,exports){\nmodule.exports = (function () {\r\n\tvar exports;\r\n\r\n\r\n\tfunction init() {\r\n\t\tsetGuestImages();\r\n\t}\r\n\r\n\tfunction setGuestImages() {\r\n\t\tif (window.outerWidth > 534) {\r\n\t\t\t$('[data-who-goes-img]').each(function(){\r\n\t\t\t\t$(this).attr('src', $(this).data('src'));\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t$('[data-who-goes-img]').each(function(i, v){\r\n\t\t\t\tif (i < 5) {\r\n\t\t\t\t\t$(v).attr('src', $(v).data('src'));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t$(window).scroll(function(){\r\n\t\t\t\t$('[data-who-goes-img]').each(function(i, v){\r\n\t\t\t\t\tif (i >= 5 && isInViewport($('[data-who-goes-img]')[i-1])) {\r\n\t\t\t\t\t\t$(v).attr('src', $(v).data('src'));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction isInViewport(element) {\r\n\t\tvar rect = element.getBoundingClientRect();\r\n\r\n\t\treturn rect.bottom >= 0 && rect.top <= window.innerHeight && rect.right >= 0 && rect.left <= window.innerWidth;\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\treturn exports;\r\n}());\r\n\n},{}],34:[function(require,module,exports){\nmodule.exports = (function (dep) {\r\n\tvar $window,\r\n\t\t$body,\r\n\t\t$page,\r\n\t\t$yearbookSlider,\r\n\t\tyearbookAPIParams,\r\n\t\tpageIndex = 0,\r\n\t\t$eventPromise,\r\n\t\tnumOfSliderItems,\r\n\t\tindexOfActiveEl,\r\n\t\tsliderInstance,\r\n\t\tverificationToken;\r\n\r\n\tfunction init() {\r\n\t\tif ($('[data-event-yearbook]').length > 0) {\r\n\t\t\tinitDOMElements();\r\n\t\t\t$page.addClass('page--gray');\r\n\t\t\tinitBindings();\r\n\t\t\tloadImages();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction initDOMElements() {\r\n\t\t$window = dep.performance.getCachedDom().$window;\r\n\t\t$body = dep.performance.getCachedDom().$body;\r\n\t\t$page = $('.page');\r\n\t\t$yearbookSlider = $('[data-yearbook-gallery]');\r\n\t\tverificationToken = $body.attr('data-verification-token');\r\n\t}\r\n\r\n\tfunction initBindings() {\r\n\t\t$body.on({\r\n\t\t\tkeydown: function(e) {\r\n\t\t\t\tif (e.keyCode === 37) {\r\n\t\t\t\t\tshowPreviousSliderItem();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (e.keyCode === 39) {\r\n\t\t\t\t\tshowNextSliderItem();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function() {\r\n\t\t\t\tshowPreviousSliderItem();\r\n\t\t\t}\r\n\t\t}, '[data-yearbook-pager-prev]');\r\n\r\n\t\t$body.on({\r\n\t\t\tclick: function() {\r\n\t\t\t\tshowNextSliderItem();\r\n\t\t\t}\r\n\t\t}, '[data-yearbook-pager-next]');\r\n\r\n\t\t$window.on({\r\n\t\t\tresize: function() {\r\n\t\t\t\tadjustSliderHeight();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction loadImages(recalculate) {\r\n\t\tconfigWebAPI();\r\n\r\n\t\t$eventPromise = $.ajax(yearbookAPIParams);\r\n\r\n\t\t$.when($eventPromise).then(function(data) {\r\n\t\t\tappendImages(data);\r\n\r\n\t\t\tinitSlider(indexOfActiveEl, recalculate);\r\n\r\n\t\t\tnumOfSliderItems = $('.unslider-carousel > li').length;\r\n\t\t\tpageIndex++;\r\n\t\t});\r\n\t}\r\n\r\n\tfunction configWebAPI() {\r\n\t\tyearbookAPIParams = {\r\n\t\t\ttype: 'POST',\r\n\t\t\turl: $yearbookSlider.data('yearbook-api'),\r\n\t\t\tdata: JSON.stringify({\r\n\t\t\t\tImageFolderID: $yearbookSlider.data('folder-id'),\r\n\t\t\t\tPageSize: 10,\r\n\t\t\t\tPageIndex: pageIndex\r\n\t\t\t}),\r\n\t\t\theaders: {\r\n\t\t\t\t__RequestVerificationToken: verificationToken\r\n\t\t\t},\r\n\t\t\tcontentType: 'application/json',\r\n\t\t\tdataType: 'json'\r\n\t\t};\r\n\t}\r\n\r\n\tfunction initSlider(index, recalculate) {\r\n\t\tsliderInstance = $yearbookSlider.unslider({\r\n\t\t\tnav: false,\r\n\t\t\tarrows: false,\r\n\t\t\t// Index is set to previous slide on reinitialization to apply move animation to next slide instead of jumping to it\r\n\t\t\tindex: index ? index - 1 : 'first',\r\n\t\t\tkeys: false\r\n\t\t});\r\n\r\n\t\tlazyLoadActiveImage();\r\n\t\tadjustSliderHeight();\r\n\r\n\t\t// After recalculation moving to next slide so move animation is applied\r\n\t\tif (recalculate) {\r\n\t\t\tsliderInstance.unslider('calculateSlides');\r\n\t\t\t$yearbookSlider.unslider('next');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction appendImages(data) {\r\n\t\t$.each( data.Images, function( i, item ) {\r\n\t\t\t$('.my-slider ul').append('
  • ');\r\n\t\t});\r\n\t}\r\n\r\n\tfunction adjustSliderHeight() {\r\n\t\t$('.unslider').css('height', $('.yearbook__wrapper').outerHeight() + 'px');\r\n\t}\r\n\r\n\tfunction lazyLoadActiveImage() {\r\n\t\tvar $el = $('.unslider-active img');\r\n\r\n\t\t$el.attr('src', $el.data('src'));\r\n\t}\r\n\r\n\tfunction showPreviousSliderItem() {\r\n\t\tif (!$yearbookSlider.find('li')[0].classList.contains('unslider-active')) {\r\n\t\t\t$yearbookSlider.unslider('prev');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction showNextSliderItem() {\r\n\t\t$yearbookSlider.unslider('next');\r\n\t\tlazyLoadActiveImage();\r\n\r\n\t\tindexOfActiveEl= $('.unslider-active').index();\r\n\r\n\t\tif (numOfSliderItems - indexOfActiveEl < 3) {\r\n\t\t\tloadImages('recalculate');\r\n\t\t}\r\n\t}\r\n\r\n\texports = {\r\n\t\tinit: init\r\n\t};\r\n\r\n\treturn exports;\r\n}({\r\n\tperformance: require('../utils/performance')\r\n}));\r\n\r\n\n},{\"../utils/performance\":20}]},{},[2])\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzb3VyY2UvanMvbW9kdWxlL2FwcC5qcyIsInNvdXJjZS9qcy9tb2R1bGUvc291cmNlLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9hbmFseXRpY3MuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL2Nvb2tpZS1sYXllci5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvY29va2llLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9jdXN0b20tc2VsZWN0Ym94LmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9kaXNjdXNzaW9uLWhhbmRsaW5nLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9mb3JtLWV2ZW50LWhhbmRsaW5nLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9nZW5lcmFsLWZvcm0taGFuZGxpbmcuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL2dlbmVyYWwtcGFnZXItaGFuZGxpbmcuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL2dlbmVyaWMtcGFnZXItaGFuZGxpbmcuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL2dlbmVyaWMtc2VhcmNoLWhhbmRsaW5nLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9nZW5lcmljLXNvcnQtaGFuZGxpbmcuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL2hhbmRsZWJhcnMtaGVscGVycy5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvaGlzdG9yeS5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvaWRlYS1oYW5kbGluZy5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvaW1hZ2UtdXBsb2FkLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9saW5rZWRpbi1jb25uZWN0LmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9saW5rZWRpbi1pbXBvcnQuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL3BlcmZvcm1hbmNlLmpzIiwic291cmNlL2pzL21vZHVsZS91dGlscy9xdW90ZXMuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL3Jlc3VsdC1oYW5kbGluZy5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvc29jaWFsbWVkaWEuanMiLCJzb3VyY2UvanMvbW9kdWxlL3V0aWxzL3N2Zy5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdXRpbHMvdmlkZW8uanMiLCJzb3VyY2UvanMvbW9kdWxlL3ZpZXdzL2JveC1jYXJvdXNlbC5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdmlld3MvZ2FsbGVyeS5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdmlld3MvZ2VuZXJhbC1sb2FkZXIuanMiLCJzb3VyY2UvanMvbW9kdWxlL3ZpZXdzL25hdmlnYXRpb24uanMiLCJzb3VyY2UvanMvbW9kdWxlL3ZpZXdzL3BhcnRpY2lwYW50cy12aWV3LmpzIiwic291cmNlL2pzL21vZHVsZS92aWV3cy9wYXJ0bmVycy1jYXJvdXNlbC5qcyIsInNvdXJjZS9qcy9tb2R1bGUvdmlld3Mvc2lkZWJhci1pbWFnZS1sb2FkZXIuanMiLCJzb3VyY2UvanMvbW9kdWxlL3ZpZXdzL3dob2dvZXMtbG9hZGVyLmpzIiwic291cmNlL2pzL21vZHVsZS92aWV3cy95ZWFyYm9vay1wYWdlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoZGVwKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdGlzSW5zdGFudGlhdGVkO1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0ZGVwLnBlcmZvcm1hbmNlLmluaXQoKTtcclxuXHRcdGRlcC5hbmFseXRpY3MuaW5pdCgpO1xyXG5cdFx0ZGVwLnN2Zy5pbml0KCk7XHJcblx0XHRkZXAuaGFuZGxlYmFyc0hlbHBlcnMuaW5pdCgpO1xyXG5cdFx0ZGVwLmhpc3RvcnkuaW5pdCgpO1xyXG5cclxuXHRcdGRlcC5uYXZpZ2F0aW9uLmluaXQoKTtcclxuXHRcdGRlcC52aWRlby5pbml0KCk7XHJcblx0XHRkZXAucXVvdGVzLmluaXQoKTtcclxuXHRcdGRlcC5wYXJ0bmVyQ2Fyb3VzZWwuaW5pdCgpO1xyXG5cclxuXHRcdGRlcC5jdXN0b21TZWxlY3RCb3guaW5pdCgpO1xyXG5cclxuXHRcdGRlcC5nZW5lcmljU2VhcmNoLmluaXQoKTtcclxuXHRcdGRlcC5nZW5lcmljUGFnZXIuaW5pdCgpO1xyXG5cclxuXHRcdGRlcC5wYXJ0aWNpcGFudHNWaWV3LmluaXQoKTtcclxuXHRcdGRlcC5yZXN1bHRIYW5kbGluZy5pbml0KCk7XHJcblxyXG5cdFx0ZGVwLmlkZWFIYW5kbGluZy5pbml0KCk7XHJcblx0XHRkZXAuc29jaWFsTWVkaWEuaW5pdCgpO1xyXG5cclxuXHRcdGRlcC5pbWFnZVVwbG9hZC5pbml0KCk7XHJcblx0XHRkZXAuZm9ybUhhbmRsaW5nLmluaXQoKTtcclxuXHRcdGRlcC5mb3JtRXZlbnRIYW5kbGluZy5pbml0KCk7XHJcblx0XHRkZXAuc2lkZUJhckltYWdlTG9hZGVyLmluaXQoKTtcclxuXHJcblx0XHRkZXAueWVhcmJvb2tQYWdlci5pbml0KCk7XHJcblx0XHRkZXAuZ2VuZXJhbExvYWRlci5pbml0KCk7XHJcblx0XHRkZXAuZ2VuZXJhbFBhZ2VyLmluaXQoKTtcclxuXHRcdGRlcC53aG9Hb2VzTG9hZGVyLmluaXQoKTtcclxuXHRcdGRlcC5nYWxsZXJ5LmluaXQoKTtcclxuXHJcblx0XHRkZXAuY29va2llUG9saWN5LmluaXQoKTtcclxuXHRcdGRlcC5saW5rZWRpbkltcG9ydC5pbml0KCk7XHJcblxyXG5cdFx0ZGVwLmJveENhcm91c2VsLmluaXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge307XHJcblx0ZXhwb3J0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICghaXNJbnN0YW50aWF0ZWQpIHtcclxuXHRcdFx0aXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG5cdFx0XHRpbml0KCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnJWMgW01vZHVsZSAtIEFwcF0gLSBBbHJlYWR5IGNyZWF0ZWQgYW4gaW5zdGFuY2UhICcsICdiYWNrZ3JvdW5kOiAjZWE0MTE4OyBjb2xvcjogI2ZmZicpO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRhbmFseXRpY3M6IHJlcXVpcmUoJy4vdXRpbHMvYW5hbHl0aWNzJyksXHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi91dGlscy9wZXJmb3JtYW5jZScpLFxyXG5cdFx0c3ZnOiByZXF1aXJlKCcuL3V0aWxzL3N2ZycpLFxyXG5cdFx0aGFuZGxlYmFyc0hlbHBlcnM6IHJlcXVpcmUoJy4vdXRpbHMvaGFuZGxlYmFycy1oZWxwZXJzJyksXHJcblx0XHRuYXZpZ2F0aW9uOiByZXF1aXJlKCcuL3ZpZXdzL25hdmlnYXRpb24nKSxcclxuXHRcdHZpZGVvOiByZXF1aXJlKCcuL3V0aWxzL3ZpZGVvJyksXHJcblx0XHRxdW90ZXM6IHJlcXVpcmUoJy4vdXRpbHMvcXVvdGVzJyksXHJcblx0XHRjdXN0b21TZWxlY3RCb3g6IHJlcXVpcmUoJy4vdXRpbHMvY3VzdG9tLXNlbGVjdGJveCcpLFxyXG5cdFx0cGFydGljaXBhbnRzVmlldzogcmVxdWlyZSgnLi92aWV3cy9wYXJ0aWNpcGFudHMtdmlldycpLFxyXG5cdFx0cmVzdWx0SGFuZGxpbmc6IHJlcXVpcmUoJy4vdXRpbHMvcmVzdWx0LWhhbmRsaW5nJyksXHJcblx0XHRzb2NpYWxNZWRpYTogcmVxdWlyZSgnLi91dGlscy9zb2NpYWxtZWRpYScpLFxyXG5cdFx0aW1hZ2VVcGxvYWQ6IHJlcXVpcmUoJy4vdXRpbHMvaW1hZ2UtdXBsb2FkJyksXHJcblx0XHRmb3JtSGFuZGxpbmc6IHJlcXVpcmUoJy4vdXRpbHMvZ2VuZXJhbC1mb3JtLWhhbmRsaW5nJyksXHJcblx0XHRmb3JtRXZlbnRIYW5kbGluZzogcmVxdWlyZSgnLi91dGlscy9mb3JtLWV2ZW50LWhhbmRsaW5nJyksXHJcblx0XHRzaWRlQmFySW1hZ2VMb2FkZXI6IHJlcXVpcmUoJy4vdmlld3Mvc2lkZWJhci1pbWFnZS1sb2FkZXInKSxcclxuXHRcdHllYXJib29rUGFnZXI6IHJlcXVpcmUoJy4vdmlld3MveWVhcmJvb2stcGFnZXInKSxcclxuXHRcdGdlbmVyYWxMb2FkZXI6IHJlcXVpcmUoJy4vdmlld3MvZ2VuZXJhbC1sb2FkZXInKSxcclxuXHRcdGdlbmVyYWxQYWdlcjogcmVxdWlyZSgnLi91dGlscy9nZW5lcmFsLXBhZ2VyLWhhbmRsaW5nJyksXHJcblx0XHRoaXN0b3J5OiByZXF1aXJlKCcuL3V0aWxzL2hpc3RvcnknKSxcclxuXHRcdGlkZWFIYW5kbGluZzogcmVxdWlyZSgnLi91dGlscy9pZGVhLWhhbmRsaW5nJyksXHJcblx0XHRwYXJ0bmVyQ2Fyb3VzZWw6IHJlcXVpcmUoJy4vdmlld3MvcGFydG5lcnMtY2Fyb3VzZWwnKSxcclxuXHRcdGJveENhcm91c2VsOiByZXF1aXJlKCcuL3ZpZXdzL2JveC1jYXJvdXNlbC5qcycpLFxyXG5cdFx0Z2FsbGVyeTogcmVxdWlyZSgnLi92aWV3cy9nYWxsZXJ5LmpzJyksXHJcblx0XHR3aG9Hb2VzTG9hZGVyOiByZXF1aXJlKCcuL3ZpZXdzL3dob2dvZXMtbG9hZGVyJyksXHJcblx0XHRjb29raWVQb2xpY3k6IHJlcXVpcmUoJy4vdXRpbHMvY29va2llLWxheWVyLmpzJyksXHJcblx0XHRsaW5rZWRpbkltcG9ydDogcmVxdWlyZSgnLi91dGlscy9saW5rZWRpbi1pbXBvcnQuanMnKSxcclxuXHRcdGdlbmVyaWNTZWFyY2g6IHJlcXVpcmUoJy4vdXRpbHMvZ2VuZXJpYy1zZWFyY2gtaGFuZGxpbmcnKSxcclxuXHRcdGdlbmVyaWNQYWdlcjogcmVxdWlyZSgnLi91dGlscy9nZW5lcmljLXBhZ2VyLWhhbmRsaW5nJylcclxuXHR9XHJcbikpO1xyXG4iLCJ2YXIgQXBwID0gcmVxdWlyZSgnLi9hcHAnKTtcclxuXHJcbndpbmRvdy5BcHAgPSBBcHA7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzLFxyXG5cdFx0JHdpbmRvdyxcclxuXHRcdCRib2R5LFxyXG5cdFx0JHN1Ym5hdkxpbmtzLFxyXG5cdFx0JHBhcnRpY2lwYW50c1RhYmxlLFxyXG5cdFx0JHBhcnRpY2lwYW50c1BhZ2VyLFxyXG5cdFx0JGRpc2N1c3Npb25zLFxyXG5cdFx0JGZhcVF1ZXN0aW9ucyxcclxuXHRcdHByb2ZpbGVTZWN0aW9uc0ZpbGxlZCA9IHt9LFxyXG5cdFx0dHJhY2tpbmdJZCxcclxuXHRcdGlzQW5hbHl0aWNzRW5hYmxlZCxcclxuXHRcdGFuYWx5dGljc1VSTCA9ICcvL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanMnLFxyXG5cdFx0Y2hlY2tUaWQ7XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHR0cmFja2luZ0lkID0gJ1VBLTE3NDEwODczLTEnO1xyXG5cdFx0aXNBbmFseXRpY3NFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoaXNBbmFseXRpY3NFbmFibGVkID09PSB0cnVlKSB7XHJcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmVUcnVzdENvbmZpcm0nLCBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdFx0XHRpbmplY3RHQSgpO1xyXG5cdFx0XHRcdGNoZWNrR2FMb2FkZWQoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkd2luZG93ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiR3aW5kb3c7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRzdWJuYXZMaW5rcyA9ICQoJ1tkYXRhLXN1Ym5hdmlnYXRpb24taWQ9XCJldmVudHNcIl0gW2RhdGEtd2l0aC1zdWJsZXZlbF0gYScpO1xyXG5cdFx0JHBhcnRpY2lwYW50c1RhYmxlID0gJCgnLnBhcnRpY2lwYW50cy10YWJsZScpO1xyXG5cdFx0JHBhcnRpY2lwYW50c1BhZ2VyID0gJCgnLnBhcnRpY2lwYW50cy10YWJsZS1wYWdlciAucGFnZXJfX2VsZW0nKTtcclxuXHRcdCRkaXNjdXNzaW9ucyA9ICQoJy5pZGVhc19fbGlzdCcpO1xyXG5cdFx0JGZhcVF1ZXN0aW9ucyA9ICQoJy5mYXFfX3F1ZXN0aW9uJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjaGVja0dhTG9hZGVkKCkge1xyXG5cdFx0aWYgKHdpbmRvdy5nYSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoY2hlY2tUaWQpO1xyXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0JCgnI2FuYWx5dGljc1NESycpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdGFuYWx5dGljc1VSTCA9ICcvanMvYW5hbHl0aWNzLmpzJztcclxuXHRcdFx0XHRpbmplY3RHQSgpO1xyXG5cdFx0XHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdFx0XHR9LCAxNTAwKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGluaXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHRcdHZhciBsaW5rVHlwZXNTZWxlY3RvcixcclxuXHRcdFx0bWFpbk5hdkxpbmtzU2VsZWN0b3IgPSAnW2RhdGEtbWFpbi1uYXZpZ2F0aW9uXSBhJyxcclxuXHRcdFx0Zm9vdGVyTGlua3NTZWxlY3RvciA9ICcuZm9vdGVyX19uYXZpZ2F0aW9uIGEnLFxyXG5cdFx0XHRzb2NpYWxMaW5rc1NlbGVjdG9yID0gJy5mb290ZXJfX3NvY2lhbCBhJyxcclxuXHRcdFx0cGFnZVRpdGxlU2VsZWN0b3IgPSAnLnBhZ2UgPiAucGlsbGFyYm94ID4gLmlubmVyID4gaDEnO1xyXG5cclxuXHRcdGxpbmtUeXBlc1NlbGVjdG9yID0gbWFpbk5hdkxpbmtzU2VsZWN0b3IgKyAnLCcgKyBmb290ZXJMaW5rc1NlbGVjdG9yICsgJywnICsgc29jaWFsTGlua3NTZWxlY3RvcjtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdHN1Ym1pdDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHR2YXIgJGZvcm0gPSAkKGUuY3VycmVudFRhcmdldCksXHJcblx0XHRcdFx0XHRnYUxhYmVsO1xyXG5cclxuXHRcdFx0XHRpZiAoJGZvcm0uZGF0YSgnaGVhZGVyLWRlc2t0b3AtZm9ybScpID09PSAnc2VhcmNoJykge1xyXG5cdFx0XHRcdFx0Ly8gU2V0IHNlYXJjaCB0ZXJtIGFzIEdBIGxhYmVsXHJcblx0XHRcdFx0XHRnYUxhYmVsID0gJGZvcm0uZmluZCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKS52YWwoKTtcclxuXHRcdFx0XHRcdCRmb3JtLmRhdGEoJ2dhLWxhYmVsJywgZ2FMYWJlbCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb2xsZWN0R0FEYXRhKCRmb3JtKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLWhlYWRlci1mb3JtXSwgW2RhdGEtaGVhZGVyLWRlc2t0b3AtZm9ybV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdHZhciBjYXRlZ29yeTtcclxuXHJcblx0XHRcdFx0aWYgKCQodGhpcykuaXMoc29jaWFsTGlua3NTZWxlY3RvcikpIHtcclxuXHRcdFx0XHRcdGNhdGVnb3J5ID0gJ1NvY2lhbCc7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNhdGVnb3J5ID0gJ05hdmlnYXRpb24nO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCQoZS5jdXJyZW50VGFyZ2V0KS5wYXJlbnQoKS5kYXRhKCdzdWJuYXZpZ2F0aW9uLXRhcmdldCcpID09PSAnZXZlbnRzJykge1xyXG5cdFx0XHRcdFx0dHJhY2tFdmVudChjYXRlZ29yeSwgJ0NsaWNrJywgY2F0ZWdvcnkgKyAnIGNsaWNrJyk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICgkKGUuY3VycmVudFRhcmdldCkuYXR0cigndGFyZ2V0JykgPT09ICdfYmxhbmsnKSB7XHJcblx0XHRcdFx0XHR0cmFja0V2ZW50KGNhdGVnb3J5LCAnQ2xpY2snLCBjYXRlZ29yeSArICcgY2xpY2snKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dHJhY2tFdmVudE9uTGluaygkKGUuY3VycmVudFRhcmdldCkuYXR0cignaHJlZicpLCBjYXRlZ29yeSwgJ0NsaWNrJywgY2F0ZWdvcnkgKyAnIGNsaWNrJyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cdFx0fSwgbGlua1R5cGVzU2VsZWN0b3IpO1xyXG5cclxuXHRcdCRzdWJuYXZMaW5rcy5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdHRyYWNrRXZlbnRPbkxpbmsoJChlLmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2hyZWYnKSwgJ05hdmlnYXRpb24nLCAnQ2xpY2snLCAnRHJvcGRvd24gbmF2aWdhdGlvbiBjbGljaycpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkd2luZG93Lm9uKHtcclxuXHRcdFx0c2Nyb2xsOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR2YXIgcGFnZTtcclxuXHJcblx0XHRcdFx0aWYgKCRwYXJ0aWNpcGFudHNUYWJsZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHBhZ2UgPSAnUGFydGljaXBhbnRzJztcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCRkaXNjdXNzaW9ucy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHBhZ2UgPSAnRGlzY3Vzc2lvbnMnO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHBhZ2UpIHtcclxuXHRcdFx0XHRcdHRyYWNrRXZlbnQocGFnZSwgJ1Njcm9sbCcsICdwYWdlIHNjcm9sbGVkJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR3aW5kb3cubWF0Y2hNZWRpYSgncHJpbnQnKS5hZGRMaXN0ZW5lcihmdW5jdGlvbihtcWwpIHtcclxuXHRcdFx0aWYgKG1xbC5tYXRjaGVzICYmICRwYXJ0aWNpcGFudHNUYWJsZS5sZW5ndGgpIHtcclxuXHRcdFx0XHR0cmFja0V2ZW50KCdQYXJ0aWNpcGFudHMnLCAnUHJpbnQnLCAnUHJpbnQgcGFnZScpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkcGFydGljaXBhbnRzVGFibGUub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCQodGhpcykuaXMoJy5wYXJ0aWNpcGFudHMtdGFibGUtLXNvY2lhbCBhJykpIHtcclxuXHRcdFx0XHRcdHRyYWNrRXZlbnQoJ1BhcnRpY2lwYW50cycsICdVc2VyIHByb2ZpbGUgdmlldycsICdDbGljayBvbiBwYXJ0aWNpcGFudHMgc29jaWFsIGFjY291bnQnKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dHJhY2tFdmVudCgnUGFydGljaXBhbnRzJywgJ1NvcnRpbmcnLCAnUGFydGljaXBhbnRzIHNvcnRpbmcnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1zZXQtZmlsdGVyXSwgLnBhcnRpY2lwYW50cy10YWJsZS0tc29jaWFsIGEnKTtcclxuXHJcblx0XHQkcGFydGljaXBhbnRzUGFnZXIub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dHJhY2tFdmVudCgnUGFydGljaXBhbnRzJywgJ1BhZ2VyIGNsaWNrJywgJ1BhZ2Ugc3RlcCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkZmFxUXVlc3Rpb25zLm9uKHtcclxuXHRcdFx0bW91c2Vkb3duOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR0cmFja0V2ZW50KCdGQVEgUGFnZScsICdDbGljaycsICdDbGljayBvbiBxdWVzdGlvbicpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHZhciAkZmllbGRzZXQgPSAkKHRoaXMpLFxyXG5cdFx0XHRcdFx0ZmllbGRUeXBlcyxcclxuXHRcdFx0XHRcdGFsbEZpZWxkc0ZpbGxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRpZiAocHJvZmlsZVNlY3Rpb25zRmlsbGVkWyQodGhpcykuZGF0YSgnZ2EtbGFiZWwnKV0pIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZpZWxkVHlwZXMgPSBbXHJcblx0XHRcdFx0XHQkZmllbGRzZXQuZmluZCgnaW5wdXQnKSxcclxuXHRcdFx0XHRcdCRmaWVsZHNldC5maW5kKCd0ZXh0YXJlYScpLFxyXG5cdFx0XHRcdFx0JGZpZWxkc2V0LmZpbmQoJ3NlbGVjdCcpXHJcblx0XHRcdFx0XTtcclxuXHJcblx0XHRcdFx0JC5lYWNoKGZpZWxkVHlwZXMsIGZ1bmN0aW9uKGksICRmaWVsZFR5cGUpIHtcclxuXHRcdFx0XHRcdCRmaWVsZFR5cGUuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCQodGhpcykudmFsKCkpIHtcclxuXHRcdFx0XHRcdFx0XHRhbGxGaWVsZHNGaWxsZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGFsbEZpZWxkc0ZpbGxlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCFhbGxGaWVsZHNGaWxsZWQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRpZiAoYWxsRmllbGRzRmlsbGVkKSB7XHJcblx0XHRcdFx0XHRwcm9maWxlU2VjdGlvbnNGaWxsZWRbJCh0aGlzKS5kYXRhKCdnYS1sYWJlbCcpXSA9IHRydWU7XHJcblx0XHRcdFx0XHRjb2xsZWN0R0FEYXRhKCRmaWVsZHNldCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtcHVibGljLXByb2ZpbGVdICwgW2RhdGEtY29udGFjdC1kZXRhaWxzXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0XHRpZiAoJChwYWdlVGl0bGVTZWxlY3RvcikudGV4dCgpLmluZGV4T2YoJ1ByZXNzJykgPiAtMSkge1xyXG5cdFx0XHRcdFx0aWYgKCQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCd0YXJnZXQnKSA9PT0gJ19ibGFuaycpIHtcclxuXHRcdFx0XHRcdFx0dHJhY2tFdmVudCgnUHJlc3MnLCAnQ2xpY2snLCAnUHJlc3MgbGluayBjbGlja2VkIGNsaWNrJyk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0cmFja0V2ZW50T25MaW5rKCQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdocmVmJyksICdQcmVzcycsICdDbGljaycsICdQcmVzcyBsaW5rIGNsaWNrZWQgY2xpY2snKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSwgcGFnZVRpdGxlU2VsZWN0b3IgKyAnKyBkaXYgLnRleHQtY29udGVudF9fZnVsbC1jb3B5IHAgYScpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluamVjdEdBKCkge1xyXG5cdFx0dmFyIGkgPSB3aW5kb3csXHJcblx0XHRcdHMgPSBkb2N1bWVudCxcclxuXHRcdFx0byA9ICdzY3JpcHQnLFxyXG5cdFx0XHRnID0gYW5hbHl0aWNzVVJMLFxyXG5cdFx0XHRyID0gJ2dhJyxcclxuXHRcdFx0YSwgbTtcclxuXHJcblx0XHRpZiAoIXRyYWNraW5nSWQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGkuR29vZ2xlQW5hbHl0aWNzT2JqZWN0ID0gcjtcclxuXHJcblx0XHRpW3JdID0gaVtyXSB8fCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdChpW3JdLnEgPSBpW3JdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKTtcclxuXHRcdH07XHJcblxyXG5cdFx0aVtyXS5sID0gbmV3IERhdGUoKTtcclxuXHJcblx0XHRhID0gcy5jcmVhdGVFbGVtZW50KG8pO1xyXG5cdFx0YS5pZCA9ICdhbmFseXRpY3NTREsnO1xyXG5cdFx0bSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07XHJcblxyXG5cdFx0YS5hc3luYyA9IDE7XHJcblx0XHRhLnNyYyA9IGc7XHJcblx0XHRtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pO1xyXG5cclxuXHRcdGdhKCdjcmVhdGUnLCB0cmFja2luZ0lkLCAnYXV0bycpO1xyXG5cdFx0Z2EoJ3JlcXVpcmUnLCAnZGlzcGxheWZlYXR1cmVzJyk7XHJcblx0XHRnYSgnc2VuZCcsICdwYWdldmlldycpO1xyXG5cdFx0Z2EoJ3JlcXVpcmUnLCAnbGlua2VyJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwYWdlVmlldyh1cmwpIHtcclxuXHRcdGlmICh3aW5kb3cuZ2EpIHtcclxuXHRcdFx0d2luZG93LmdhKCdzZW5kJywgJ3BhZ2V2aWV3JywgdXJsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbGxlY3RHQURhdGEoJG9iaikge1xyXG5cdFx0dmFyIHR5cGUgPSAkb2JqLmF0dHIoJ2RhdGEtZ2EtdHlwZScpIHx8IGZhbHNlLFxyXG5cdFx0XHRkYXRhO1xyXG5cclxuXHRcdGlmICh0eXBlID09PSAnZXZlbnQnKSB7XHJcblx0XHRcdGRhdGEgPSB7fTtcclxuXHRcdFx0ZGF0YS5jYXRlZ29yeSA9ICRvYmouYXR0cignZGF0YS1nYS1jYXRlZ29yeScpO1xyXG5cdFx0XHRkYXRhLmFjdGlvbiA9ICRvYmouYXR0cignZGF0YS1nYS1hY3Rpb24nKTtcclxuXHRcdFx0ZGF0YS5sYWJlbCA9ICRvYmouYXR0cignZGF0YS1nYS1sYWJlbCcpO1xyXG5cdFx0XHR0cmFja0V2ZW50KGRhdGEuY2F0ZWdvcnksIGRhdGEuYWN0aW9uLCBkYXRhLmxhYmVsKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0cmFja0V2ZW50KGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0Z2EoJ3NlbmQnLCAnZXZlbnQnLCBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGdhKCdzZW5kJywgJ2V2ZW50JywgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignQW5hbHl0aWNzIGVycm9yIScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdHJhY2tFdmVudE9uTGluayh1cmwsIGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRnYSgnc2VuZCcsICdldmVudCcsIGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0aWYgKHdpbmRvdy5jb25zb2xlKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdBbmFseXRpY3MgZXJyb3IhJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0LFxyXG5cdFx0cGFnZVZpZXc6IHBhZ2VWaWV3LFxyXG5cdFx0Y29sbGVjdEdBRGF0YTogY29sbGVjdEdBRGF0YSxcclxuXHRcdHRyYWNrRXZlbnQ6IHRyYWNrRXZlbnQsXHJcblx0XHR0cmFja0V2ZW50T25MaW5rOiB0cmFja0V2ZW50T25MaW5rXHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi9wZXJmb3JtYW5jZS5qcycpXHJcblx0fVxyXG4pKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdCRsYXllcjtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGluaXRET01FbGVtZW50cygpO1xyXG5cdFx0aW5pdEJpbmRpbmdzKCk7XHJcblx0XHRjaGVja0Nvb2tpZUxheWVyKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRsYXllciA9ICRib2R5LmZpbmQoJ1tkYXRhLWNvb2tpZS1sYXllcl0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRoaWRlQ29va2llTGF5ZXIoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLWNvb2tpZS1hZ3JlZV0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNoZWNrQ29va2llTGF5ZXIoKSB7XHJcblxyXG5cdFx0aWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuXHRcdFx0aWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RyZWFtLWNvb2tpZS1wb2xpY3knKSA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHNob3dDb29raWVMYXllcigpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJlbW92ZUNvb2tpZUxheWVyKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoaWRlQ29va2llTGF5ZXIoKSB7XHJcblx0XHRpZiAod2luZG93LmxvY2FsU3RvcmFnZSkge1xyXG5cdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0cmVhbS1jb29raWUtcG9saWN5JywgMSk7XHJcblx0XHR9XHJcblx0XHQkbGF5ZXIucmVtb3ZlQ2xhc3MoJ2Nvb2tpZS1wb2xpY3ktLXNob3cnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dDb29raWVMYXllcigpIHtcclxuXHRcdCRsYXllci5hZGRDbGFzcygnY29va2llLXBvbGljeS0tc2hvdycpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVtb3ZlQ29va2llTGF5ZXIoKSB7XHJcblx0XHQkbGF5ZXIucmVtb3ZlKCk7XHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdFxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKVxyXG5cdH1cclxuKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzO1xyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVDb29raWUobmFtZSwgdmFsdWUsIGV4cGlyYXRpb25EYXRlKSB7XHJcblx0XHR2YXIgZGF0ZSxcclxuXHRcdFx0ZXhwaXJlcyxcclxuXHRcdFx0c3BsaXREYXRlO1xyXG5cclxuXHRcdGlmIChleHBpcmF0aW9uRGF0ZSkge1xyXG5cdFx0XHRzcGxpdERhdGUgPSBleHBpcmF0aW9uRGF0ZS5zcGxpdCgnLycpO1xyXG5cdFx0XHRkYXRlID0gbmV3IERhdGUoc3BsaXREYXRlWzJdLCBzcGxpdERhdGVbMV0sIHNwbGl0RGF0ZVswXSk7XHJcblx0XHRcdGV4cGlyZXMgPSAnOyBleHBpcmVzPScgKyBkYXRlLnRvVVRDU3RyaW5nKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRleHBpcmVzID0gJyc7XHJcblx0XHR9XHJcblx0XHRkb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUkkobmFtZSkgKyAnPScgKyBlbmNvZGVVUkkodmFsdWUpICsgZXhwaXJlcyArJzsgcGF0aD0vJztcclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRjcmVhdGVDb29raWU6IGNyZWF0ZUNvb2tpZVxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzO1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0JCgnW2RhdGEtc2VsZWN0Ym94XScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG5cdFx0XHQkKHRoaXMpLmRhdGEoJ2N1c3RvbS1zZWxlY3Rib3gnLCBuZXcgU2VsZWN0Qm94KCQodGhpcyksIHtcclxuXHRcdFx0XHRoaWRlU2VsZWN0ZWQ6IGZhbHNlXHJcblx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi9wZXJmb3JtYW5jZScpXHJcblx0fVxyXG4pKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdCRkaXNjdXNzaW9ucyxcclxuXHRcdGJyb3dzZXJVcmwsXHJcblx0XHRwYWdlVXJsLFxyXG5cdFx0c2VydmljZVVSTCxcclxuXHRcdHBhZ2VJRCxcclxuXHRcdGV2ZW50SUQsXHJcblx0XHRpZGVhSUQsXHJcblx0XHRpZGVhVGl0bGUsXHJcblx0XHRpZGVhRGVzY3JpcHRpb24sXHJcblx0XHRwYWdlSW5kZXgsXHJcblx0XHRwYWdlU2l6ZSxcclxuXHRcdHNvcnREYXRhID0ge30sXHJcblx0XHRzb3J0UXVlcnlTdHJpbmcsXHJcblx0XHRsb2FkZXJDbGFzcyxcclxuXHRcdGxvYWRlclRpZCxcclxuXHRcdGxvYWRlckRlbGF5ID0gMTUwLFxyXG5cdFx0aGIsXHJcblx0XHQkaGJXcmFwcGVyLFxyXG5cdFx0JHBhZ2VyLFxyXG5cdFx0JGlkZWFUaXRsZSxcclxuXHRcdGlkZWFUaXRsZU1heExlbmd0aCA9IDE0MCxcclxuXHRcdCRkaXNjdXNzaW9uUHJvbWlzZSxcclxuXHRcdCRlZGl0UHJvbWlzZSxcclxuXHRcdCRyZW1vdmVQcm9taXNlLFxyXG5cdFx0JGxpa2VQcm9taXNlLFxyXG5cdFx0aXNBY3Rpdml0aWVzID0gZmFsc2UsXHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbjtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGluaXRET01FbGVtZW50cygpO1xyXG5cdFx0aW5pdEJpbmRpbmdzKCk7XHJcblxyXG5cdFx0bG9hZGVyQ2xhc3MgPSBkZXAuZ2VuZXJhbExvYWRlcjtcclxuXHRcdGhiID0gZGVwLmhhbmRsZWJhcnM7XHJcblxyXG5cdFx0aWYgKCRkaXNjdXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGlmKCRkaXNjdXNzaW9ucy5hdHRyKCdkYXRhLWFjdGl2aXR5JykpIHtcclxuXHRcdFx0XHRpc0FjdGl2aXRpZXMgPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNlcnZpY2VVUkwgPSAkZGlzY3Vzc2lvbnMuYXR0cignZGF0YS1zZXJ2aWNlLXVybCcpO1xyXG5cdFx0XHRwYWdlSUQgPSAkZGlzY3Vzc2lvbnMuYXR0cignZGF0YS1kaXNjdXNzaW9uLXBhZ2UtaWQnKTtcclxuXHRcdFx0ZXZlbnRJRCA9ICRkaXNjdXNzaW9ucy5hdHRyKCdkYXRhLWV2ZW50LWlkJyk7XHJcblx0XHRcdHBhZ2VJbmRleCA9ICRkaXNjdXNzaW9ucy5hdHRyKCdkYXRhLXBhZ2UtaW5kZXgnKTtcclxuXHRcdFx0cGFnZVVybCA9ICRkaXNjdXNzaW9ucy5hdHRyKCdkYXRhLXBhZ2V1cmwnKTtcclxuXHJcblx0XHRcdHNvcnRIYW5kbGluZygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkZGlzY3Vzc2lvbnMgPSAkKCdbZGF0YS1kaXNjdXNzaW9uc10nKTtcclxuXHRcdCRwYWdlciA9ICRib2R5LmZpbmQoJ1tkYXRhLXBhZ2VyXScpO1xyXG5cdFx0JGlkZWFUaXRsZSA9ICQoJyNpZGVhLXRpdGxlJyk7XHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbiA9ICRib2R5LmF0dHIoJ2RhdGEtdmVyaWZpY2F0aW9uLXRva2VuJyk7XHJcblxyXG5cdFx0cGFnZVNpemUgPSAwO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjaGFuZ2U6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRwYWdlSW5kZXggPSAxO1xyXG5cdFx0XHRcdHNvcnRIYW5kbGluZygpO1xyXG5cdFx0XHRcdHNlbmRSZXF1ZXN0KCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICcjZGlzY3Vzc2lvbi1zb3J0Jyk7XHJcblxyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHR2YXIgdGl0bGVBcnJheTtcclxuXHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGlkZWFJRCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1pZGVhXScpLmF0dHIoJ2RhdGEtaWRlYS1pZCcpO1xyXG5cdFx0XHRcdGlkZWFUaXRsZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1pZGVhXScpLmZpbmQoJ1tkYXRhLWlkZWEtdGl0bGVdJykudGV4dCgpO1xyXG5cdFx0XHRcdHRpdGxlQXJyYXkgPSBpZGVhVGl0bGUuc3BsaXQoJ3wnKTtcclxuXHRcdFx0XHRpZGVhVGl0bGUgPSB0aXRsZUFycmF5WzBdO1xyXG5cdFx0XHRcdGlkZWFEZXNjcmlwdGlvbiA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1pZGVhXScpLmZpbmQoJ1tkYXRhLWlkZWEtZGVzY3JpcHRpb25dJykudGV4dCgpO1xyXG5cdFx0XHRcdGVkaXRJZGVhKGV2ZW50SUQsIHBhZ2VJRCwgaWRlYUlELCBpZGVhVGl0bGUsIGlkZWFEZXNjcmlwdGlvbik7XHJcblxyXG5cdFx0XHRcdGlmIChpZGVhVGl0bGUubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0bGltaXRJZGVhVGl0bGVMZW5ndGgoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1lZGl0LWlkZWFdJyk7XHJcblxyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0Y3JlYXRlSWRlYShldmVudElELCBwYWdlSUQpO1xyXG5cdFx0XHRcdGlmICgkaWRlYVRpdGxlLnZhbCgpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdCQoJ1tkYXRhLW92ZXJsYXldICNpZGVhLXRpdGxlJykudmFsKCcnKTtcclxuXHRcdFx0XHRcdCQoJ1tkYXRhLW92ZXJsYXldICNpZGVhLXRleHQnKS52YWwoJycpO1xyXG5cdFx0XHRcdFx0bGltaXRJZGVhVGl0bGVMZW5ndGgoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1zdGFydC1pZGVhXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0a2V5dXA6IGxpbWl0SWRlYVRpdGxlTGVuZ3RoXHJcblx0XHR9LCAnI2lkZWEtdGl0bGUnKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRpZGVhSUQgPSAkKGUuY3VycmVudFRhcmdldCkucGFyZW50cygpLmZpbmQoJyNpZGVhLWlkJykudmFsKCk7XHJcblx0XHRcdFx0ZXZlbnRJRCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5wYXJlbnRzKCkuZmluZCgnI2V2ZW50LWlkJykudmFsKCk7XHJcblx0XHRcdFx0cGFnZUlEID0gJChlLmN1cnJlbnRUYXJnZXQpLnBhcmVudHMoKS5maW5kKCcjcm9vdC1pZCcpLnZhbCgpO1xyXG5cdFx0XHRcdHJlbW92ZUlkZWEoZXZlbnRJRCwgcGFnZUlELCBpZGVhSUQpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtcmVtb3ZlLWlkZWFdJyk7XHJcblxyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHR2YXIgJHRoaXNJZGVhLFxyXG5cdFx0XHRcdFx0JHRvZ2dsZUxpa2U7XHJcblxyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0JHRoaXNJZGVhID0gJChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWlkZWFdJyk7XHJcblx0XHRcdFx0JHRvZ2dsZUxpa2UgPSAkdGhpc0lkZWEuZmluZCgnW2RhdGEtbGlrZWRdJyk7XHJcblx0XHRcdFx0aWRlYUlEID0gJHRoaXNJZGVhLmF0dHIoJ2RhdGEtaWRlYS1pZCcpO1xyXG5cclxuXHRcdFx0XHRpZiAoJHRvZ2dsZUxpa2UuYXR0cignZGF0YS1saWtlZCcpID09PSAnbGlrZWQnKSB7XHJcblx0XHRcdFx0XHQkdG9nZ2xlTGlrZS5hdHRyKCdkYXRhLWxpa2VkJywgJ3VuLWxpa2VkJyk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdCR0b2dnbGVMaWtlLmF0dHIoJ2RhdGEtbGlrZWQnLCAnbGlrZWQnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bGlrZUlkZWEoZXZlbnRJRCwgcGFnZUlELCBpZGVhSUQpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtbGlrZWFibGU9XCJsaWtlYWJsZVwiXSBbZGF0YS1saWtlZF0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRzZW5kRWRpdCgnc3VibWl0Jyk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1zdWJtaXQtaWRlYV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRzZW5kRWRpdCgnZWRpdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtc3VibWl0LWVkaXRlZC1pZGVhXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZGVhSUQgPSAkKGUuY3VycmVudFRhcmdldCkuY2xvc2VzdCgnW2RhdGEtaWRlYV0nKS5hdHRyKCdkYXRhLWlkZWEtaWQnKTtcclxuXHRcdFx0XHQkKCdbZGF0YS1vdmVybGF5XScpLmFkZENsYXNzKCdzaG93IHNob3ctLXJlbW92ZScpO1xyXG5cdFx0XHRcdCQoJ1tkYXRhLW92ZXJsYXldICNldmVudC1pZCcpLnZhbCgneycgKyBldmVudElEICsgJ30nKTtcclxuXHRcdFx0XHQkKCdbZGF0YS1vdmVybGF5XSAjcm9vdC1pZCcpLnZhbCgneycgKyBwYWdlSUQgKyAnfScpO1xyXG5cdFx0XHRcdCQoJ1tkYXRhLW92ZXJsYXldICNpZGVhLWlkJykudmFsKGlkZWFJRCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1kZWxldGUtaWRlYV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0JCgnW2RhdGEtb3ZlcmxheV0nKS5yZW1vdmVDbGFzcygnc2hvdyBzaG93LS1zdWJtaXQgc2hvdy0tZWRpdCBzaG93LS1yZW1vdmUnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLWNsb3NlXSwgW2RhdGEtY2FuY2VsXScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlSWRlYShldmVudElkLCBwYWdlSUQpIHtcclxuXHRcdCQoJ1tkYXRhLW92ZXJsYXldICNldmVudC1pZCcpLnZhbCgneycgKyBldmVudElkICsgJ30nKTtcclxuXHRcdCQoJ1tkYXRhLW92ZXJsYXldICNyb290LWlkJykudmFsKCd7JyArIHBhZ2VJRCArICd9Jyk7XHJcblx0XHQkKCdbZGF0YS1vdmVybGF5XScpLmFkZENsYXNzKCdzaG93IHNob3ctLXN1Ym1pdCcpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZWRpdElkZWEoZXZlbnRJZCwgcGFnZUlkLCBpZGVhSWQsIGlkZWFUaXRsZSwgaWRlYURlc2NyaXB0aW9uKSB7XHJcblx0XHQkKCdbZGF0YS1vdmVybGF5XSAjZXZlbnQtaWQnKS52YWwoJ3snICsgZXZlbnRJZCArICd9Jyk7XHJcblx0XHQkKCdbZGF0YS1vdmVybGF5XSAjcm9vdC1pZCcpLnZhbCgneycgKyBwYWdlSWQgKyAnfScpO1xyXG5cdFx0JCgnW2RhdGEtb3ZlcmxheV0gI2lkZWEtaWQnKS52YWwoaWRlYUlkKTtcclxuXHRcdCQoJ1tkYXRhLW92ZXJsYXldICNpZGVhLXRpdGxlJykudmFsKGlkZWFUaXRsZSk7XHJcblx0XHQkKCdbZGF0YS1vdmVybGF5XSAjaWRlYS10ZXh0JykudmFsKGlkZWFEZXNjcmlwdGlvbik7XHJcblx0XHQkKCdbZGF0YS1vdmVybGF5XScpLmFkZENsYXNzKCdzaG93IHNob3ctLWVkaXQnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGxpbWl0SWRlYVRpdGxlTGVuZ3RoKGUpIHtcclxuXHRcdHZhciB0aXRsZUxlbmd0aCxcclxuXHRcdFx0Y2hhcnNMZWZ0LFxyXG5cdFx0XHRpZGVhVGl0bGUsXHJcblx0XHRcdCRpZGVhVGl0bGVIaW50ID0gJCgnW2RhdGEtb3ZlcmxheV0uc2hvdyBbZm9yPVwiaWRlYS10aXRsZVwiXSAuaGVscGVyLXRleHQnKTtcclxuXHJcblx0XHRpZGVhVGl0bGUgPSBlID8gJChlLnRhcmdldCkudmFsKCkgOiAkaWRlYVRpdGxlLnZhbCgpO1xyXG5cclxuXHRcdHRpdGxlTGVuZ3RoID0gaWRlYVRpdGxlLmxlbmd0aDtcclxuXHRcdGNoYXJzTGVmdCA9IGlkZWFUaXRsZU1heExlbmd0aCAtIHRpdGxlTGVuZ3RoO1xyXG5cclxuXHRcdGlmIChjaGFyc0xlZnQgPD0gMCkge1xyXG5cdFx0XHQkaWRlYVRpdGxlLnZhbChpZGVhVGl0bGUuc3Vic3RyKDAsIGlkZWFUaXRsZU1heExlbmd0aCkpO1xyXG5cdFx0XHRjaGFyc0xlZnQgPSAwO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyc0xlZnQgPT09IGlkZWFUaXRsZU1heExlbmd0aCkge1xyXG5cdFx0XHQkaWRlYVRpdGxlSGludC50ZXh0KCcoaW4gJyArIGlkZWFUaXRsZU1heExlbmd0aCArICcgY2hhcmFjdGVycyknKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdCRpZGVhVGl0bGVIaW50LnRleHQoJygnICsgY2hhcnNMZWZ0ICsgJyBjaGFyYWN0ZXInICsgKGNoYXJzTGVmdCA+IDEgPyAncycgOiAnJykgKyAnIGxlZnQpICcpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVtb3ZlSWRlYShldmVudElkLCBwYWdlSWQsIGlkZWFJZCkge1xyXG5cdFx0dmFyIHVybCxcclxuXHRcdFx0bWV0aG9kLFxyXG5cdFx0XHRyZW1vdmVEYXRhO1xyXG5cclxuXHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdHNob3dEZWxheWVkTG9hZGVyKCk7XHJcblx0XHRjbGVhclByZXZpb3VzRWRpdFByb21pc2UoKTtcclxuXHJcblx0XHRpZihpc0FjdGl2aXRpZXMpIHtcclxuXHRcdFx0dXJsID0gJy9hcGkvc3RyZWFtL2FjdGl2aXRpZXMvZGVsZXRlJztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHVybCA9ICcvYXBpL3N0cmVhbS9kaXNjdXNzaW9ucy9kZWxldGUnO1xyXG5cdFx0fVxyXG5cdFx0bWV0aG9kID0gJ3Bvc3QnO1xyXG5cdFx0cmVtb3ZlRGF0YSA9IHtFdmVudElkOiBldmVudElkLCBSb290SWQ6IHBhZ2VJZCwgSWRlYUlkOiBpZGVhSWR9O1xyXG5cclxuXHRcdCRyZW1vdmVQcm9taXNlID0gJC5hamF4KHtcclxuXHRcdFx0dHlwZTogbWV0aG9kLFxyXG5cdFx0XHR1cmw6IHVybCxcclxuXHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkocmVtb3ZlRGF0YSksXHJcblx0XHRcdGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXHJcblx0XHRcdGRhdGFUeXBlOiAnanNvbicsXHJcblx0XHRcdGhlYWRlcnM6IHtcclxuXHRcdFx0XHRfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogdmVyaWZpY2F0aW9uVG9rZW5cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JC53aGVuKCRyZW1vdmVQcm9taXNlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHRcdFx0Ly8gaGlkZUxvYWRlcigpO1xyXG5cdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5Jc1N1Y2Nlc3MgPT09IHRydWUpIHtcclxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGxvY2F0aW9uLnJlbG9hZCgpO1xyXG5cdFx0XHRcdH0sIDEwMDApO1xyXG5cdFx0XHR9XHJcblx0XHR9LCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGxpa2VJZGVhKGV2ZW50SWQsIHBhZ2VJZCwgaWRlYUlkKSB7XHJcblx0XHR2YXIgdXJsLFxyXG5cdFx0XHRtZXRob2QsXHJcblx0XHRcdGxpa2VEYXRhO1xyXG5cclxuXHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdHNob3dEZWxheWVkTG9hZGVyKCk7XHJcblx0XHRjbGVhclByZXZpb3VzRWRpdFByb21pc2UoKTtcclxuXHJcblx0XHRpZihpc0FjdGl2aXRpZXMpIHtcclxuXHRcdFx0dXJsID0gJy9hcGkvc3RyZWFtL2FjdGl2aXRpZXMvdG9nZ2xlbGlrZSc7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR1cmwgPSAnL2FwaS9zdHJlYW0vZGlzY3Vzc2lvbnMvdG9nZ2xlbGlrZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0bWV0aG9kID0gJ3Bvc3QnO1xyXG5cdFx0bGlrZURhdGEgPSB7RXZlbnRJZDogZXZlbnRJZCwgUm9vdElkOiBwYWdlSWQsIElkZWFJZDogaWRlYUlkfTtcclxuXHJcblx0XHQkbGlrZVByb21pc2UgPSAkLmFqYXgoe1xyXG5cdFx0XHR0eXBlOiBtZXRob2QsXHJcblx0XHRcdHVybDogdXJsLFxyXG5cdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeShsaWtlRGF0YSksXHJcblx0XHRcdGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXHJcblx0XHRcdGRhdGFUeXBlOiAnanNvbicsXHJcblx0XHRcdGhlYWRlcnM6IHtcclxuXHRcdFx0XHRfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogdmVyaWZpY2F0aW9uVG9rZW5cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JC53aGVuKCRsaWtlUHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdC8vIGhpZGVMb2FkZXIoKTtcclxuXHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuSXNTdWNjZXNzID09PSB0cnVlKSB7XHJcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRsb2NhdGlvbi5yZWxvYWQoKTtcclxuXHRcdFx0XHR9LCAxMDAwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNlbmRFZGl0KHR5cGUpIHtcclxuXHRcdHZhciB1cmwsXHJcblx0XHRcdG1ldGhvZCxcclxuXHRcdFx0Zm9ybURhdGEsXHJcblx0XHRcdCRmb3JtO1xyXG5cclxuXHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdHNob3dEZWxheWVkTG9hZGVyKCk7XHJcblx0XHRjbGVhclByZXZpb3VzRWRpdFByb21pc2UoKTtcclxuXHJcblx0XHQkZm9ybSA9ICQoJ1tkYXRhLW92ZXJsYXldICMnICsgdHlwZSArICctaWRlYS1mb3JtJyk7XHJcblx0XHR1cmwgPSAkZm9ybS5hdHRyKCdhY3Rpb24nKTtcclxuXHRcdG1ldGhvZCA9ICRmb3JtLmF0dHIoJ21ldGhvZCcpO1xyXG5cdFx0Zm9ybURhdGEgPSBkZXAuZ2VuZXJhbEZvcm1IYW5kbGluZy5jcmVhdGVEYXRhT2JqZWN0KCRmb3JtLnNlcmlhbGl6ZUFycmF5KCkpO1xyXG5cclxuXHRcdGRlcC5nZW5lcmFsRm9ybUhhbmRsaW5nLnJlbW92ZUZvcm1FcnJvcnMoJGZvcm0pO1xyXG5cclxuXHRcdCRlZGl0UHJvbWlzZSA9ICQuYWpheCh7XHJcblx0XHRcdHR5cGU6IG1ldGhvZCxcclxuXHRcdFx0dXJsOiB1cmwsXHJcblx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhKSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJGVkaXRQcm9taXNlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHRcdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5Jc1N1Y2Nlc3MgPT09IHRydWUpIHtcclxuXHRcdFx0XHQkKCdbZGF0YS1vdmVybGF5XScpLnJlbW92ZUNsYXNzKCdzaG93IHNob3ctLWVkaXQnKTtcclxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGxvY2F0aW9uLnJlbG9hZCgpO1xyXG5cdFx0XHRcdH0sIDEwMDApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHJlc3VsdCAmJiByZXN1bHQuSXNTdWNjZXNzID09PSBmYWxzZSkge1xyXG5cclxuXHRcdFx0XHRpZiAocmVzdWx0LkdlbmVyaWNFcnJvcikge1xyXG5cdFx0XHRcdFx0ZGVwLmdlbmVyYWxGb3JtSGFuZGxpbmcuaGFuZGxlR2VuZXJpY0Vycm9yKCRmb3JtLCByZXN1bHQuR2VuZXJpY0Vycm9yKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChyZXN1bHQuZmllbGRlcnJvcnMpIHtcclxuXHRcdFx0XHRcdGRlcC5nZW5lcmFsRm9ybUhhbmRsaW5nLmhhbmRsZUZvcm1FcnJvcnMoJGZvcm0sIHJlc3VsdC5maWVsZGVycm9ycyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIXJlc3VsdC5maWVsZGVycm9ycyAmJiAhcmVzdWx0LkdlbmVyaWNFcnJvcikge1xyXG5cdFx0XHRcdFx0ZGVwLmdlbmVyYWxGb3JtSGFuZGxpbmcuaGFuZGxlR2VuZXJpY0Vycm9yKCRmb3JtLCAnU2VydmljZSBlcnJvciEgUGxlYXNlIHRyeSBhZ2FpbiEnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0JCgnW2RhdGEtb3ZlcmxheV0nKS5yZW1vdmVDbGFzcygnc2hvdyBzaG93LS1lZGl0Jyk7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc29ydEhhbmRsaW5nKCkge1xyXG5cdFx0dmFyIHBhZ2VyVXJsQmFzZSxcclxuXHRcdFx0cGFnZXJVcmw7XHJcblxyXG5cdFx0c29ydERhdGEuRGlzY3Vzc2lvbnNQYWdlSWQgPSAneycgKyBwYWdlSUQgKyAnfSc7XHJcblx0XHRzb3J0UXVlcnlTdHJpbmcgPSAnP0Rpc2N1c3Npb25zUGFnZUlkPXsnICsgcGFnZUlEICsgJ30nO1xyXG5cdFx0c29ydERhdGEuUGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG5cdFx0c29ydERhdGEuUGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuXHRcdC8vIHNvcnRRdWVyeVN0cmluZyArPSAnJlBhZ2VTaXplPScgKyBwYWdlU2l6ZTtcclxuXHJcblx0XHRpZigkKCcjZGlzY3Vzc2lvbi1zb3J0JykubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQkLmVhY2goJCgnI2Rpc2N1c3Npb24tc29ydCBvcHRpb246c2VsZWN0ZWQnKS52YWwoKS5zcGxpdCgvXFx8LyksIGZ1bmN0aW9uIChpLCB2YWwpIHtcclxuXHRcdFx0XHRpZiAoaSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0c29ydERhdGEuU29ydEJ5ID0gdmFsO1xyXG5cdFx0XHRcdFx0c29ydFF1ZXJ5U3RyaW5nICs9ICcmU29ydEJ5PScgKyB2YWw7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChpID09PSAxKSB7XHJcblx0XHRcdFx0XHRzb3J0RGF0YS5Tb3J0RGVzYyA9IHZhbCAhPT0gJ2FzYyc7XHJcblx0XHRcdFx0XHRzb3J0UXVlcnlTdHJpbmcgKz0gJyZTb3J0RGVzYz0nO1xyXG5cdFx0XHRcdFx0c29ydFF1ZXJ5U3RyaW5nICs9IHZhbCAhPT0gJ2FzYyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNvcnREYXRhLlNvcnRCeSA9ICdkYXRlJztcclxuXHRcdFx0c29ydFF1ZXJ5U3RyaW5nICs9ICcmU29ydEJ5PWRhdGUnO1xyXG5cdFx0XHRzb3J0RGF0YS5Tb3J0RGVzYyA9IHRydWU7XHJcblx0XHRcdHNvcnRRdWVyeVN0cmluZyArPSAnJlNvcnREZXNjPXRydWUnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgkcGFnZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRwYWdlclVybEJhc2UgPSAkYm9keS5maW5kKCdbZGF0YS1wYWdlcl0nKS5hdHRyKCdkYXRhLXBhZ2VyLXVybCcpLnNwbGl0KCc/JylbMF07XHJcblx0XHRcdHBhZ2VyVXJsID0gcGFnZXJVcmxCYXNlICsgc29ydFF1ZXJ5U3RyaW5nO1xyXG5cdFx0XHQkcGFnZXIuYXR0cignZGF0YS1wYWdlci11cmwnLCBwYWdlclVybCk7XHJcblx0XHRcdCRwYWdlci5hdHRyKCdkYXRhLXBhZ2VyLXBhZ2V1cmwnLCBwYWdlclVybCk7XHJcblx0XHRcdCRwYWdlci5hdHRyKCdkYXRhLXBhZ2VyLWN1cnJlbnRwYWdlJywgcGFnZUluZGV4KTtcclxuXHRcdH1cclxuXHJcblx0XHRzb3J0UXVlcnlTdHJpbmcgKz0gJyZQYWdlSW5kZXg9JyArIHBhZ2VJbmRleDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNlbmRSZXF1ZXN0KGRhdGEsIGZyb21IaXN0b3J5KSB7XHJcblx0XHR2YXIgcHVzaFN0YXRlT2JqID0ge30sXHJcblx0XHRcdHRvdGFsUGFnZXM7XHJcblxyXG5cdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0c2hvd0RlbGF5ZWRMb2FkZXIoKTtcclxuXHRcdGNsZWFyUHJldmlvdXNQcm9taXNlKCk7XHJcblxyXG5cdFx0JGhiV3JhcHBlciA9ICRib2R5LmZpbmQoJ1tkYXRhLWhiLXdyYXBwZXI9XCJkaXNjdXNzaW9uLWl0ZW1cIl0nKTtcclxuXHJcblx0XHRicm93c2VyVXJsID0gcGFnZVVybC5zcGxpdCgnPycpWzBdO1xyXG5cdFx0aWYgKGJyb3dzZXJVcmwgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRicm93c2VyVXJsICs9IHNvcnRRdWVyeVN0cmluZztcclxuXHRcdH1cclxuXHJcblx0XHRzb3J0RGF0YS5QYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcblxyXG5cdFx0aWYgKGZyb21IaXN0b3J5ID09PSB0cnVlKSB7XHJcblx0XHRcdHNvcnREYXRhID0gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQkZGlzY3Vzc2lvblByb21pc2UgPSAkLmFqYXgoe1xyXG5cdFx0XHR0eXBlOiAnZ2V0JyxcclxuXHRcdFx0dXJsOiBzZXJ2aWNlVVJMLFxyXG5cdFx0XHRkYXRhOiBzb3J0RGF0YSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJGRpc2N1c3Npb25Qcm9taXNlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHRcdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0XHRpZiAocmVzdWx0ICYmIHJlc3VsdC5Jc1N1Y2Nlc3MgPT09IHRydWUpIHtcclxuXHJcblx0XHRcdFx0dG90YWxQYWdlcyA9IE1hdGguY2VpbChyZXN1bHQuVG90YWwgLyByZXN1bHQuUGFnZVNpemUpO1xyXG5cclxuXHRcdFx0XHRpZiAoJHBhZ2VyLmxlbmd0aCA+IDApIHtcclxuXHJcblx0XHRcdFx0XHQkcGFnZXIuYXR0cignZGF0YS1wYWdlci10b3RhbHBhZ2VzJywgdG90YWxQYWdlcyk7XHJcblx0XHRcdFx0XHQkcGFnZXIuYXR0cignZGF0YS1wYWdlci1jdXJyZW50cGFnZScsIHJlc3VsdC5QYWdlSW5kZXgpO1xyXG5cclxuXHRcdFx0XHRcdGlmIChyZXN1bHQuUGFnZVNpemUgPj0gcmVzdWx0LlRvdGFsKSB7XHJcblx0XHRcdFx0XHRcdCRwYWdlci5jc3Moe2Rpc3BsYXk6ICdub25lJ30pO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKCRwYWdlci5oYXNDbGFzcygncGFnZXItLWhpZGRlbicpKSB7XHJcblx0XHRcdFx0XHRcdFx0JHBhZ2VyLnJlbW92ZUNsYXNzKCdwYWdlci0taGlkZGVuJyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdCRwYWdlci5maW5kKCdbZGF0YS1wYWdlci1pbmRleGVzXScpLmh0bWwoZGVwLmdlbmVyYWxQYWdlci5jcmVhdGVQYWdlcnModG90YWxQYWdlcywgcmVzdWx0LlBhZ2VJbmRleCwgcGFnZVVybCkpO1xyXG5cdFx0XHRcdFx0XHRkZXAuZ2VuZXJhbFBhZ2VyLnNldFBhZ2VyU3RhdGVzKCRwYWdlciwgcmVzdWx0LlBhZ2VJbmRleCwgdG90YWxQYWdlcyk7XHJcblx0XHRcdFx0XHRcdC8vICRwYWdlci5maW5kKCdbZGF0YS1wYWdlXScpLmZpcnN0KCkuYWRkQ2xhc3MoJ3N0ZXBwZXItLWFjdGl2ZScpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3MoJ3N0ZXBwZXItLWFjdGl2ZScpO1xyXG5cdFx0XHRcdFx0XHQkcGFnZXIuY3NzKHtkaXNwbGF5OiAnYmxvY2snfSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAod2luZG93Lmhpc3RvcnkgJiYgZnJvbUhpc3RvcnkgIT09IHRydWUpIHtcclxuXHRcdFx0XHRcdHB1c2hTdGF0ZU9iai50eXBlID0gJ2Rpc2N1c3Npb24tbGlzdCc7XHJcblx0XHRcdFx0XHRwdXNoU3RhdGVPYmouc29ydERhdGEgPSBzb3J0RGF0YTtcclxuXHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShwdXNoU3RhdGVPYmosIGRvY3VtZW50LnRpdGxlLCBicm93c2VyVXJsKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICgkaGJXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdCRoYldyYXBwZXIuaHRtbChoYi5nZXRUcGwoJ2Rpc2N1c3Npb24taXRlbScpKHJlc3VsdCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ2p1bXAnKTtcclxuXHJcblx0XHRcdH1cclxuXHRcdH0sIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbGVhclByZXZpb3VzUHJvbWlzZSgpIHtcclxuXHRcdGlmICgkZGlzY3Vzc2lvblByb21pc2UgJiYgJGRpc2N1c3Npb25Qcm9taXNlLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuXHRcdFx0JGRpc2N1c3Npb25Qcm9taXNlLmFib3J0KCk7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNFZGl0UHJvbWlzZSgpIHtcclxuXHRcdGlmICgkZWRpdFByb21pc2UgJiYgJGVkaXRQcm9taXNlLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuXHRcdFx0JGVkaXRQcm9taXNlLmFib3J0KCk7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhpZGVMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGRlcC5nZW5lcmFsTG9hZGVyLmhpZGVMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dEZWxheWVkTG9hZGVyKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KGxvYWRlclRpZCk7XHJcblx0XHRsb2FkZXJUaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0bG9hZGVyQ2xhc3Muc2hvd0xvYWRlcigpO1xyXG5cdFx0fSwgbG9hZGVyRGVsYXkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKSxcclxuXHRcdHBhcnRpY2lwYW50c1ZpZXc6IHJlcXVpcmUoJy4uL3ZpZXdzL3BhcnRpY2lwYW50cy12aWV3JyksXHJcblx0XHRoYW5kbGViYXJzOiByZXF1aXJlKCcuL2hhbmRsZWJhcnMtaGVscGVycycpLFxyXG5cdFx0Z2VuZXJhbExvYWRlcjogcmVxdWlyZSgnLi4vdmlld3MvZ2VuZXJhbC1sb2FkZXInKSxcclxuXHRcdGdlbmVyYWxQYWdlcjogcmVxdWlyZSgnLi9nZW5lcmFsLXBhZ2VyLWhhbmRsaW5nJyksXHJcblx0XHRnZW5lcmFsRm9ybUhhbmRsaW5nOiByZXF1aXJlKCcuL2dlbmVyYWwtZm9ybS1oYW5kbGluZycpXHJcblx0fVxyXG4pKTtcclxuXHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoZGVwKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdCRib2R5LFxyXG5cdFx0JGV2ZW50UHJvbWlzZSxcclxuXHRcdCRmb3JtLFxyXG5cdFx0JGZvcm1FbGVtZW50LFxyXG5cdFx0JHBob25lRWxlbWVudCxcclxuXHRcdHByb2ZpbGVJRCxcclxuXHRcdHVybCxcclxuXHRcdG1ldGhvZCxcclxuXHRcdGNoZWNrZWRBY3Rpdml0ZXMsXHJcblx0XHRsb2FkZXJUaWQsXHJcblx0XHRsb2FkZXJEZWxheSA9IDE1MCxcclxuXHRcdGxvYWRlckNsYXNzLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW47XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRsb2FkZXJDbGFzcyA9IGRlcC5nZW5lcmFsTG9hZGVyO1xyXG5cdFx0dXJsID0gJy9hcGkvc3RyZWFtL3Byb2ZpbGUvZ2V0cHJvZmlsZSc7XHJcblx0XHRtZXRob2QgPSAnUE9TVCc7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkZm9ybSA9ICQoJ1tkYXRhLWZvcm1dJyk7XHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbiA9ICRib2R5LmF0dHIoJ2RhdGEtdmVyaWZpY2F0aW9uLXRva2VuJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNoYW5nZTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHByb2ZpbGVJRCA9ICQoJ29wdGlvbjpzZWxlY3RlZCcsIHRoaXMpLnZhbCgpO1xyXG5cdFx0XHRcdGV2ZW50Q2hhbmdlZEJ5VXNlcihwcm9maWxlSUQpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnI0V2ZW50SUQnKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0JCgnW2RhdGEtb3ZlcmxheV0nKS5yZW1vdmVDbGFzcygnc2hvdyBzaG93LS1zdWJtaXQgc2hvdy0tZWRpdCBzaG93LS1yZW1vdmUnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLW9rXScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZXZlbnRDaGFuZ2VkQnlVc2VyKGlkKSB7XHJcblx0XHR2YXIgZGF0YTtcclxuXHJcblx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHRzaG93RGVsYXllZExvYWRlcigpO1xyXG5cdFx0dXBkYXRlRXZlbnRJRChpZCk7XHJcblxyXG5cdFx0ZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtFdmVudFByb2ZpbGVJRDogaWR9KTtcclxuXHJcblx0XHQkZXZlbnRQcm9taXNlID0gJC5hamF4KHtcclxuXHRcdFx0dXJsOiB1cmwsXHJcblx0XHRcdHR5cGU6IG1ldGhvZCxcclxuXHRcdFx0ZGF0YTogZGF0YSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJGV2ZW50UHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LklzU3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdHVwZGF0ZUZvcm1GaWVsZHMocmVzdWx0LlByb2ZpbGVEYXRhKTtcclxuXHRcdFx0XHR1cGRhdGVDYW5jZWxBdHRlbmRhbmNlTGluayhyZXN1bHQuUHJvZmlsZURhdGEuQ2FuY2VsQXR0ZW5kYW5jZVVybCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHJcblx0XHR9LCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZUV2ZW50SUQoaWQpIHtcclxuXHRcdCQoJyNFdmVudFByb2ZpbGVJRCcpLnZhbChpZCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVGb3JtRmllbGRzKHByb2ZpbGVEYXRhKSB7XHJcblx0XHR2YXIgc2VsZWN0Ym94O1xyXG5cclxuXHRcdCRmb3JtID0gJCgnW2RhdGEtZm9ybV0nKTtcclxuXHJcblx0XHRyZW1vdmVBY3Rpdml0aWVzKCk7XHJcblx0XHRnZXRDaGVja2VkQWN0aXZpdGVzKHByb2ZpbGVEYXRhKTtcclxuXHJcblx0XHQkLmVhY2gocHJvZmlsZURhdGEsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcblx0XHRcdGlmIChrZXkubWF0Y2goL1Bob25lL2lnKSkge1xyXG5cdFx0XHRcdHVwZGF0ZVBob25lRmllbGRzKGtleSwgdmFsdWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ0tub3duUGFydGljaXBhbnRzJykge1xyXG5cdFx0XHRcdHNlbGVjdGJveCA9ICQoJyMnICsga2V5KS5kYXRhKCdjdXN0b20tc2VsZWN0Ym94Jyk7XHJcblx0XHRcdFx0c2VsZWN0Ym94LmFkZEl0ZW0odmFsdWUsIHRydWUsIHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ0lzTmV3c2xldHRlcicpIHtcclxuXHRcdFx0XHQkKCcjJyArIGtleSkucHJvcCgnY2hlY2tlZCcsIHZhbHVlKTtcclxuXHRcdFx0fSBlbHNlIGlmIChrZXkubWF0Y2goL0NvbHVtbkFjdGl2aXRpZXMvaWcpKSB7XHJcblx0XHRcdFx0JC5lYWNoKHZhbHVlLCBmdW5jdGlvbiAoaywgdikge1xyXG5cdFx0XHRcdFx0Y3JlYXRlQWN0aXZpdHkoa2V5LCB2Lk5hbWUsIHYuVmFsdWUsIGNoZWNrZWRBY3Rpdml0ZXMpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCRmb3JtRWxlbWVudCA9ICRmb3JtLmZpbmQoJ1tkYXRhLWZvcm0tZWxlbWVudD1cIicgKyBrZXkgKyAnXCJdJyk7XHJcblx0XHRcdFx0JGZvcm1FbGVtZW50LmZpbmQoJ2lucHV0JykudmFsKHZhbHVlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVDYW5jZWxBdHRlbmRhbmNlTGluayh1cmwpIHtcclxuXHRcdCRmb3JtLmZpbmQoJ1tkYXRhLWNhbmNlbC1ldmVudC11cmxdJykuYXR0cignaHJlZicsIHVybCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVQaG9uZUZpZWxkcyhrZXksIHBob25lRGF0YSkge1xyXG5cdFx0JHBob25lRWxlbWVudCA9ICQoJ1tkYXRhLWZvcm0tZWxlbWVudD1cIicgKyBrZXkgKyAnXCJdJyk7XHJcblxyXG5cdFx0JC5lYWNoKHBob25lRGF0YSwgZnVuY3Rpb24gKGssIHYpIHtcclxuXHRcdFx0aWYoayA9PT0gJ1ByZWZpeCcpIHtcclxuXHRcdFx0XHQkcGhvbmVFbGVtZW50LmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLnZhbCh2KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihrID09PSAnUGhvbmVOdW1iZXInKSB7XHJcblx0XHRcdFx0JHBob25lRWxlbWVudC5maW5kKCdpbnB1dCcpLnZhbCh2KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW1vdmVBY3Rpdml0aWVzKCkge1xyXG5cdFx0JCgnW2RhdGEtY29sdW1uXScpLmh0bWwoJycpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlQWN0aXZpdHkoY29sdW1uTmFtZSwgYWN0aXZpdHlOYW1lLCBhY3Rpdml0eUlELCBjaGVja2VkQWN0aXZpdGVzKSB7XHJcblx0XHR2YXIgYWN0aXZpdHlIVE1MID0gJycsXHJcblx0XHRcdHJldHVyblZhbHVlID0gdHJ1ZTtcclxuXHJcblx0XHQkLmVhY2goY2hlY2tlZEFjdGl2aXRlcywgZnVuY3Rpb24oIGksIHZhbCApIHtcclxuXHRcdFx0aWYodmFsID09PSBhY3Rpdml0eUlEKSB7XHJcblx0XHRcdFx0YWN0aXZpdHlIVE1MID0gJzxkaXYgY2xhc3M9XCJibG9jayBmb3JtLWVsZW1lbnQgZm9ybS1lbGVtZW50LS1jaGVja2JveFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIicgKyBhY3Rpdml0eUlEICsnXCIgbmFtZT1cIkFjdGl2aXR5W11cIiB2YWx1ZT1cIicgKyBhY3Rpdml0eUlEICsnXCIgY2hlY2tlZD1cImNoZWNrZWRcIj48bGFiZWwgZm9yPVwiJyArIGFjdGl2aXR5SUQgKydcIj4nICsgYWN0aXZpdHlOYW1lICsgJzxpIGNsYXNzPVwiaWNvbi13cmFwcGVyIGljb24td3JhcHBlciBpY29uLWNoZWNrIFwiPjxzdmcgdmlld0JveD1cIjAgMCAyNTYgMjU2XCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tY2hlY2tcIj48L3VzZT48L3N2Zz48L2k+PC9sYWJlbD48L2Rpdj4nO1xyXG5cdFx0XHRcdHJldHVyblZhbHVlID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YWN0aXZpdHlIVE1MID0gJzxkaXYgY2xhc3M9XCJibG9jayBmb3JtLWVsZW1lbnQgZm9ybS1lbGVtZW50LS1jaGVja2JveFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIicgKyBhY3Rpdml0eUlEICsnXCIgbmFtZT1cIkFjdGl2aXR5W11cIiB2YWx1ZT1cIicgKyBhY3Rpdml0eUlEICsnXCI+PGxhYmVsIGZvcj1cIicgKyBhY3Rpdml0eUlEICsnXCI+JyArIGFjdGl2aXR5TmFtZSArICc8aSBjbGFzcz1cImljb24td3JhcHBlciBpY29uLXdyYXBwZXIgaWNvbi1jaGVjayBcIj48c3ZnIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWNoZWNrXCI+PC91c2U+PC9zdmc+PC9pPjwvbGFiZWw+PC9kaXY+JztcclxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHRydWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdCQoJ1tkYXRhLWNvbHVtbj0nKyBjb2x1bW5OYW1lICsnXScpLmFwcGVuZChhY3Rpdml0eUhUTUwpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0Q2hlY2tlZEFjdGl2aXRlcyhkYXRhKSB7XHJcblx0XHQkLmVhY2goZGF0YSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuXHRcdFx0aWYgKGtleSA9PT0gJ0FjdGl2aXRpZXMnKSB7XHJcblx0XHRcdFx0Y2hlY2tlZEFjdGl2aXRlcyA9IHZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhpZGVMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGRlcC5nZW5lcmFsTG9hZGVyLmhpZGVMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dEZWxheWVkTG9hZGVyKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KGxvYWRlclRpZCk7XHJcblx0XHRsb2FkZXJUaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0bG9hZGVyQ2xhc3Muc2hvd0xvYWRlcigpO1xyXG5cdFx0fSwgbG9hZGVyRGVsYXkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJyksXHJcblx0XHRnZW5lcmFsTG9hZGVyOiByZXF1aXJlKCcuLi92aWV3cy9nZW5lcmFsLWxvYWRlcicpXHJcblx0fVxyXG4pKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHRsb2FkZXJUaWQsXHJcblx0XHRsb2FkZXJEZWxheSA9IDE1MCxcclxuXHRcdCRib2R5LFxyXG5cdFx0JGZvcm1Qcm9taXNlLFxyXG5cdFx0JGxvYWRNb3JlUHJvbWlzZSxcclxuXHRcdGhiLFxyXG5cdFx0bG9hZGVyQ2xhc3MsXHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbjtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGxvYWRlckNsYXNzID0gZGVwLmdlbmVyYWxMb2FkZXI7XHJcblx0XHRoYiA9IGRlcC5oYW5kbGViYXJzO1xyXG5cdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRpbml0QmluZGluZ3MoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRET01FbGVtZW50cygpIHtcclxuXHRcdCRib2R5ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiRib2R5O1xyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW4gPSAkYm9keS5hdHRyKCdkYXRhLXZlcmlmaWNhdGlvbi10b2tlbicpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRzdWJtaXQ6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdHByZXBhcmVGb3JtKCQodGhpcykpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtZm9ybV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGtleXVwOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0Y2hlY2tQYXNzd29yZCgkKHRoaXMpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXBhc3N3b3JkLWNoZWNrXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0a2V5dXA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRjaGVja1Bhc3N3b3JkSWRlbnRpdHkoJCh0aGlzKSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1wYXNzd29yZC1jaGVjay1pZGVudGl0eV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRsb2FkTW9yZUNvbnRlbnQoJCh0aGlzKSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1sb2FkLW1vcmVdJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsb2FkTW9yZUNvbnRlbnQoJGVsZW0pIHtcclxuXHRcdHZhciB0ZW1wbGF0ZUlkID0gJGVsZW0uYXR0cignZGF0YS1sb2FkLW1vcmUtdHBsJykgfHwgZmFsc2UsXHJcblx0XHRcdHRhcmdldCA9ICRlbGVtLmF0dHIoJ2RhdGEtbG9hZC1tb3JlLXRhcmdldCcpIHx8IGZhbHNlLFxyXG5cdFx0XHR1cmwgPSAkZWxlbS5hdHRyKCdkYXRhLWxvYWQtbW9yZS11cmwnKSxcclxuXHRcdFx0JGxvYWRNb3JlQ29udGVudFdyYXBwZXIsXHJcblx0XHRcdGxvYWRlckRhdGEgPSB7fSxcclxuXHRcdFx0c2tpcEluZGV4ID0gcGFyc2VJbnQoJGVsZW0uYXR0cignZGF0YS1sb2FkLW1vcmUtc2tpcCcpLCAxMCk7XHJcblxyXG5cdFx0aWYgKCRlbGVtLmRhdGEoJ2xvYWRlckRhdGEnKSA9PT0gdW5kZWZpbmVkICYmIHRhcmdldCA9PT0gJ2V2ZW50LWxpc3QnKSB7XHJcblx0XHRcdGxvYWRlckRhdGEucGFnZVNpemUgPSA0O1xyXG5cdFx0XHRsb2FkZXJEYXRhLnBhZ2VJbmRleCA9IHNraXBJbmRleDtcclxuXHRcdH0gZWxzZSBpZiAoJGVsZW0uZGF0YSgnbG9hZGVyRGF0YScpID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0bG9hZGVyRGF0YS5wYWdlU2l6ZSA9IDQ7XHJcblx0XHRcdGxvYWRlckRhdGEucGFnZUluZGV4ID0gMDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxvYWRlckRhdGEgPSAkZWxlbS5kYXRhKCdsb2FkZXJEYXRhJyk7XHJcblx0XHRcdGxvYWRlckRhdGEucGFnZUluZGV4ICs9IGxvYWRlckRhdGEucGFnZVNpemU7XHJcblx0XHR9XHJcblxyXG5cdFx0JGVsZW0uZGF0YSgnbG9hZGVyRGF0YScsIGxvYWRlckRhdGEpO1xyXG5cclxuXHRcdGlmICh0YXJnZXQgIT09IGZhbHNlKSB7XHJcblx0XHRcdCRsb2FkTW9yZUNvbnRlbnRXcmFwcGVyID0gJGJvZHkuZmluZCgnW2RhdGEtbG9hZC1tb3JlLWlkPVwiJyArIHRhcmdldCArICdcIl0nKTtcclxuXHRcdH1cclxuXHJcblx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHRzaG93RGVsYXllZExvYWRlcigpO1xyXG5cdFx0Y2xlYXJQcmV2aW91c0xvYWRNb3JlUHJvbWlzZSgpO1xyXG5cclxuXHRcdCRsb2FkTW9yZVByb21pc2UgPSAkLmFqYXgoe1xyXG5cdFx0XHR1cmw6IHVybCxcclxuXHRcdFx0dHlwZTogJ3Bvc3QnLFxyXG5cdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeShsb2FkZXJEYXRhKSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJGxvYWRNb3JlUHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LklzU3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdGlmIChyZXN1bHQuVXBjb21pbmdFdmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0JChoYi5nZXRUcGwoJ3VwY29taW5nLWV2ZW50LWxpc3QtaXRlbScpKHJlc3VsdCkpLmluc2VydEFmdGVyKCQoJ1tkYXRhLWxvYWQtdXBjb21pbmctZXZlbnQtbGlzdF0nKS5maW5kKCcuc3RyZWFtLWxpc3RfX2l0ZW0nKS5sYXN0KCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdC5QcmV2aW91c0V2ZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRpZiAoJCgnW2RhdGEtbG9hZC1wcmV2aW91cy1ldmVudC1saXN0XScpLmZpbmQoJy5zdHJlYW0tbGlzdF9faXRlbScpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHQkKCdbZGF0YS1wcmV2aW91cy1ldmVudHNdJykuc2hvdygpO1xyXG5cdFx0XHRcdFx0XHQkKGhiLmdldFRwbCgncHJldmlvdXMtZXZlbnQtbGlzdC1pdGVtJykocmVzdWx0KSkuYXBwZW5kVG8oJCgnW2RhdGEtbG9hZC1wcmV2aW91cy1ldmVudC1saXN0XScpKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdCQoaGIuZ2V0VHBsKCdwcmV2aW91cy1ldmVudC1saXN0LWl0ZW0nKShyZXN1bHQpKS5pbnNlcnRBZnRlcigkKCdbZGF0YS1sb2FkLXByZXZpb3VzLWV2ZW50LWxpc3RdJykuZmluZCgnLnN0cmVhbS1saXN0X19pdGVtJykubGFzdCgpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0ZW1wbGF0ZUlkICE9PSBmYWxzZSAmJiAkbG9hZE1vcmVDb250ZW50V3JhcHBlci5sZW5ndGggPiAwICYmICQoJ3NjcmlwdCcpLmRhdGEoJ3RwbCcpID09PSB0ZW1wbGF0ZUlkKSB7XHJcblx0XHRcdFx0XHQkKGhiLmdldFRwbCh0ZW1wbGF0ZUlkKShyZXN1bHQpKS5pbnNlcnRBZnRlcigkbG9hZE1vcmVDb250ZW50V3JhcHBlci5maW5kKCcuc3RyZWFtLWxpc3RfX2l0ZW0nKS5sYXN0KCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdC5IYXNNb3JlID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0JGVsZW0uaGlkZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9LCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkaW5wdXQpIHtcclxuXHRcdHZhciB2YWwgPSAkaW5wdXQudmFsKCksXHJcblx0XHRcdGlzVmFsaWQgPSB0cnVlLFxyXG5cdFx0XHQkZm9ybUVsZW1lbnQsXHJcblx0XHRcdHJlID0gLyg/PS4qXFxkKSg/PS4qW2Etel0pKD89LipbQS1aXSkuezgsfS87XHJcblxyXG5cdFx0JGZvcm1FbGVtZW50ID0gJGlucHV0LnBhcmVudHMoJ1tkYXRhLWZvcm0tZWxlbWVudF0nKS5maXJzdCgpO1xyXG5cdFx0JGZvcm1FbGVtZW50LmZpbmQoJ1tkYXRhLXZhbGlkYXRpb24tb2tdJykuY3NzKHtkaXNwbGF5OiAnbm9uZSd9KTtcclxuXHRcdCRmb3JtRWxlbWVudC5maW5kKCdbZGF0YS12YWxpZGF0aW9uLWVycm9yXScpLmNzcyh7ZGlzcGxheTogJ25vbmUnfSk7XHJcblxyXG5cdFx0aWYgKCFyZS50ZXN0KHZhbCkgJiYgdmFsICE9PSAnJykge1xyXG5cdFx0XHRpc1ZhbGlkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbCAhPT0gJycpIHtcclxuXHRcdFx0aWYgKGlzVmFsaWQpIHtcclxuXHRcdFx0XHQkZm9ybUVsZW1lbnQuZmluZCgnW2RhdGEtdmFsaWRhdGlvbi1va10nKS5jc3Moe2Rpc3BsYXk6ICdibG9jayd9KTtcclxuXHRcdFx0XHQkZm9ybUVsZW1lbnQuZmluZCgnW2RhdGEtdmFsaWRhdGlvbi1lcnJvcl0nKS5jc3Moe2Rpc3BsYXk6ICdub25lJ30pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCRmb3JtRWxlbWVudC5maW5kKCdbZGF0YS12YWxpZGF0aW9uLW9rXScpLmNzcyh7ZGlzcGxheTogJ25vbmUnfSk7XHJcblx0XHRcdFx0JGZvcm1FbGVtZW50LmZpbmQoJ1tkYXRhLXZhbGlkYXRpb24tZXJyb3JdJykuY3NzKHtkaXNwbGF5OiAnYmxvY2snfSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjaGVja1Bhc3N3b3JkSWRlbnRpdHkoJGlucHV0KSB7XHJcblx0XHR2YXIgdmFsID0gJGlucHV0LnZhbCgpLFxyXG5cdFx0XHR0YXJnZXRWYWwsXHJcblx0XHRcdCR0YXJnZXQsXHJcblx0XHRcdCRmb3JtLFxyXG5cdFx0XHRpc1ZhbGlkID0gdHJ1ZSxcclxuXHRcdFx0JGZvcm1FbGVtZW50O1xyXG5cclxuXHRcdCRmb3JtID0gJGlucHV0LnBhcmVudHMoJ1tkYXRhLWZvcm1dJykuZmlyc3QoKTtcclxuXHRcdCRmb3JtRWxlbWVudCA9ICRpbnB1dC5wYXJlbnRzKCdbZGF0YS1mb3JtLWVsZW1lbnRdJykuZmlyc3QoKTtcclxuXHRcdCRmb3JtRWxlbWVudC5maW5kKCdbZGF0YS12YWxpZGF0aW9uLW9rXScpLmNzcyh7ZGlzcGxheTogJ25vbmUnfSk7XHJcblx0XHQkZm9ybUVsZW1lbnQuZmluZCgnW2RhdGEtdmFsaWRhdGlvbi1lcnJvcl0nKS5jc3Moe2Rpc3BsYXk6ICdub25lJ30pO1xyXG5cclxuXHRcdCR0YXJnZXQgPSAkZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwiJyArICRpbnB1dC5hdHRyKCdkYXRhLXBhc3N3b3JkLWNoZWNrLWlkZW50aXR5JykgKyAnXCJdJyk7XHJcblx0XHR0YXJnZXRWYWwgPSAkdGFyZ2V0LnZhbCgpO1xyXG5cclxuXHRcdGlmICh0YXJnZXRWYWwgIT09IHZhbCAmJiB0YXJnZXRWYWwgIT09ICcnKSB7XHJcblx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGFyZ2V0VmFsICE9PSAnJykge1xyXG5cdFx0XHRpZiAoaXNWYWxpZCkge1xyXG5cdFx0XHRcdCRmb3JtRWxlbWVudC5maW5kKCdbZGF0YS12YWxpZGF0aW9uLW9rXScpLmNzcyh7ZGlzcGxheTogJ2Jsb2NrJ30pO1xyXG5cdFx0XHRcdCRmb3JtRWxlbWVudC5maW5kKCdbZGF0YS12YWxpZGF0aW9uLWVycm9yXScpLmNzcyh7ZGlzcGxheTogJ25vbmUnfSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JGZvcm1FbGVtZW50LmZpbmQoJ1tkYXRhLXZhbGlkYXRpb24tb2tdJykuY3NzKHtkaXNwbGF5OiAnbm9uZSd9KTtcclxuXHRcdFx0XHQkZm9ybUVsZW1lbnQuZmluZCgnW2RhdGEtdmFsaWRhdGlvbi1lcnJvcl0nKS5jc3Moe2Rpc3BsYXk6ICdibG9jayd9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHByZXBhcmVGb3JtKCRmb3JtKSB7XHJcblx0XHR2YXIgdXJsID0gJGZvcm0uYXR0cignYWN0aW9uJykgfHwgZmFsc2UsXHJcblx0XHRcdG1ldGhvZCA9ICRmb3JtLmF0dHIoJ21ldGhvZCcpLnRvTG93ZXJDYXNlKCkgfHwgJ3Bvc3QnLFxyXG5cdFx0XHRmb3JtRGF0YSA9IGNyZWF0ZURhdGFPYmplY3QoJGZvcm0uc2VyaWFsaXplQXJyYXkoKSk7XHJcblxyXG5cdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0c2hvd0RlbGF5ZWRMb2FkZXIoKTtcclxuXHRcdGNsZWFyUHJldmlvdXNQcm9taXNlKCk7XHJcblxyXG5cdFx0JGZvcm0uZmluZCgnaW5wdXRbdHlwZT1cInRlbFwiXScpLmNsb3Nlc3QoJ1tkYXRhLWZvcm0tZWxlbWVudF0nKS5hdHRyKCdkYXRhLWZpZWxkLXR5cGUnLCAncGhvbmUnKTtcclxuXHJcblx0XHRpZiAoZm9ybURhdGEgJiYgdXJsKSB7XHJcblx0XHRcdHNlbmRGb3JtKHVybCwgbWV0aG9kLCBmb3JtRGF0YSwgJGZvcm0pO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNlbmRGb3JtKHVybCwgbWV0aG9kLCBmb3JtRGF0YSwgJGZvcm0pIHtcclxuXHJcblx0XHRyZW1vdmVGb3JtRXJyb3JzKCRmb3JtKTtcclxuXHJcblx0XHQkZm9ybVByb21pc2UgPSAkLmFqYXgoe1xyXG5cdFx0XHR1cmw6IHVybCxcclxuXHRcdFx0dHlwZTogbWV0aG9kLFxyXG5cdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeShmb3JtRGF0YSksXHJcblx0XHRcdGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXHJcblx0XHRcdGRhdGFUeXBlOiAnanNvbicsXHJcblx0XHRcdGhlYWRlcnM6IHtcclxuXHRcdFx0XHRfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogdmVyaWZpY2F0aW9uVG9rZW5cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JC53aGVuKCRmb3JtUHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LklzU3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cclxuXHRcdFx0XHQkKCdbZGF0YS1zYXZlLW1lc3NhZ2VdJykudGV4dChyZXN1bHQuUmVzcG9uc2VNZXNzYWdlKTtcclxuXHRcdFx0XHQkKCdbZGF0YS1vdmVybGF5PVwicHJvZmlsZS1zYXZlLXN1Y2Nlc3NcIl0nKS5hZGRDbGFzcygnc2hvdycpO1xyXG5cclxuXHRcdFx0XHRpZiAocmVzdWx0LkF1dG9Mb2dpbkNvb2tpZU5hbWUpIHtcclxuXHRcdFx0XHRcdGRlcC5jb29raWUuY3JlYXRlQ29va2llKHJlc3VsdC5BdXRvTG9naW5Db29raWVOYW1lLCByZXN1bHQuQXV0b0xvZ2luQ29va2llVmFsdWUsIHJlc3VsdC5BdXRvTG9naW5Db29raWVFeHApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdC5SZWRpcmVjdFVybCAmJiByZXN1bHQuUmVkaXJlY3RVcmwgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRoYW5kbGVSZWRpcmVjdChyZXN1bHQuUmVkaXJlY3RVcmwpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0JGZvcm0udHJpZ2dlcignZm9ybS1zdWNjZXNzJyk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKHJlc3VsdCAmJiByZXN1bHQuSXNTdWNjZXNzID09PSBmYWxzZSkge1xyXG5cclxuXHRcdFx0XHRpZiAocmVzdWx0LkdlbmVyaWNFcnJvcikge1xyXG5cdFx0XHRcdFx0aGFuZGxlR2VuZXJpY0Vycm9yKCRmb3JtLCByZXN1bHQuR2VuZXJpY0Vycm9yKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChyZXN1bHQuZmllbGRlcnJvcnMpIHtcclxuXHRcdFx0XHRcdGhhbmRsZUZvcm1FcnJvcnMoJGZvcm0sIHJlc3VsdC5maWVsZGVycm9ycyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIXJlc3VsdC5maWVsZGVycm9ycyAmJiAhcmVzdWx0LkdlbmVyaWNFcnJvcikge1xyXG5cdFx0XHRcdFx0aGFuZGxlR2VuZXJpY0Vycm9yKCRmb3JtLCAnU2VydmljZSBlcnJvciEgUGxlYXNlIHRyeSBhZ2FpbiEnKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0sIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdCh1cmwpIHtcclxuXHRcdGlmICh1cmwpIHtcclxuXHRcdFx0d2luZG93LmxvY2F0aW9uID0gdXJsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaGlkZUxvYWRlcigpIHtcclxuXHRcdGNsZWFyVGltZW91dChsb2FkZXJUaWQpO1xyXG5cdFx0ZGVwLmdlbmVyYWxMb2FkZXIuaGlkZUxvYWRlcigpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2hvd0RlbGF5ZWRMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGxvYWRlclRpZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRsb2FkZXJDbGFzcy5zaG93TG9hZGVyKCk7XHJcblx0XHR9LCBsb2FkZXJEZWxheSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbGVhclByZXZpb3VzUHJvbWlzZSgpIHtcclxuXHRcdGlmICgkZm9ybVByb21pc2UgJiYgJGZvcm1Qcm9taXNlLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuXHRcdFx0JGZvcm1Qcm9taXNlLmFib3J0KCk7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNMb2FkTW9yZVByb21pc2UoKSB7XHJcblx0XHRpZiAoJGxvYWRNb3JlUHJvbWlzZSAmJiAkbG9hZE1vcmVQcm9taXNlLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuXHRcdFx0JGxvYWRNb3JlUHJvbWlzZS5hYm9ydCgpO1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW1vdmVGb3JtRXJyb3JzKCRmb3JtKSB7XHJcblx0XHQkZm9ybS5maW5kKCdbZGF0YS1mb3JtLWVsZW1lbnRdJykucmVtb3ZlQ2xhc3MoJ2Zvcm0tZWxlbWVudC0taGFzLWVycm9yJyk7XHJcblx0XHQkZm9ybS5maW5kKCdbZGF0YS12YWxpZGF0aW9uLW9rXScpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcblx0XHQkZm9ybS5maW5kKCdbZGF0YS12YWxpZGF0aW9uLWVycm9yXScpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoYW5kbGVGb3JtRXJyb3JzKCRmb3JtLCBlcnJvcnMpIHtcclxuXHRcdHZhciAkZWxlbWVudCxcclxuXHRcdFx0JGZpcnN0RXJyb3IsXHJcblx0XHRcdGVycm9ySXRlbTtcclxuXHJcblx0XHQkLmVhY2goZXJyb3JzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG5cdFx0XHRlcnJvckl0ZW0gPSB2YWx1ZTtcclxuXHRcdFx0JGVsZW1lbnQgPSAkZm9ybS5maW5kKCdbZGF0YS1mb3JtLWVsZW1lbnQ9XCInICsgZXJyb3JJdGVtLmtleSArICdcIl0nKTtcclxuXHRcdFx0JGVsZW1lbnQuYWRkQ2xhc3MoJ2Zvcm0tZWxlbWVudC0taGFzLWVycm9yJykuZmluZCgnLmZvcm0tZWxlbWVudF9fZXJyb3InKS50ZXh0KGVycm9ySXRlbS52YWx1ZSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRpZiAoZXJyb3JzKSB7XHJcblx0XHRcdCRmaXJzdEVycm9yID0gJGZvcm0uZmluZCgnW2RhdGEtZm9ybS1lbGVtZW50XS5mb3JtLWVsZW1lbnQtLWhhcy1lcnJvcicpLmZpcnN0KCk7XHJcblx0XHRcdCQod2luZG93KS5zY3JvbGxUb3AoJGZpcnN0RXJyb3Iub2Zmc2V0KCkudG9wKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoYW5kbGVHZW5lcmljRXJyb3IoJGZvcm0sIGVycm9yKSB7XHJcblx0XHR2YXIgJGVsZW1lbnQ7XHJcblxyXG5cdFx0aWYgKCRmb3JtLmZpbmQoJ1tkYXRhLWZvcm0tZWxlbWVudD1cIkdlbmVyaWNFcnJvclwiXScpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0JGVsZW1lbnQgPSAkZm9ybS5maW5kKCdbZGF0YS1mb3JtLWVsZW1lbnQ9XCJHZW5lcmljRXJyb3JcIl0nKTtcclxuXHRcdFx0JGVsZW1lbnQuYWRkQ2xhc3MoJ2Zvcm0tZWxlbWVudC0taGFzLWVycm9yJykuZmluZCgnLmZvcm0tZWxlbWVudF9fZXJyb3InKS50ZXh0KGVycm9yKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoJGZvcm0uZGF0YSgnZm9ybScpID09PSAnbG9naW4nKSB7XHJcblx0XHRcdGRlcC5hbmFseXRpY3MudHJhY2tFdmVudCgnTG9naW4nLCAnTG9naW4gZXJyb3InLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVEYXRhT2JqZWN0KHNyYykge1xyXG5cdFx0dmFyIHNob3J0TmFtZSxcclxuXHRcdFx0Zm9ybWF0dGVkRGF0YSA9IHt9LFxyXG5cdFx0XHRoYXNOZXdzbGV0dGVyID0gZmFsc2U7XHJcblxyXG5cdFx0JC5lYWNoKHNyYywgZnVuY3Rpb24gKGssIHYpIHtcclxuXHRcdFx0aWYgKHYubmFtZS5tYXRjaCgvXFxbXFxdL2lnKSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdHNob3J0TmFtZSA9IHYubmFtZS5yZXBsYWNlKC9cXFtcXF0vaWcsICcnKTtcclxuXHRcdFx0XHRpZiAoZm9ybWF0dGVkRGF0YVtzaG9ydE5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdGZvcm1hdHRlZERhdGFbc2hvcnROYW1lXSA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3JtYXR0ZWREYXRhW3Nob3J0TmFtZV0ucHVzaCh2LnZhbHVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3JtYXR0ZWREYXRhW3YubmFtZV0gPSB2LnZhbHVlO1xyXG5cclxuXHRcdFx0XHRpZiAodi5uYW1lID09PSAnSXNOZXdzbGV0dGVyJykge1xyXG5cdFx0XHRcdFx0aWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHYubmFtZSkuY2hlY2tlZCkge1xyXG5cdFx0XHRcdFx0XHRmb3JtYXR0ZWREYXRhW3YubmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JC5lYWNoKGZvcm1hdHRlZERhdGEsIGZ1bmN0aW9uIChrLCB2KSB7XHJcblxyXG5cdFx0XHRpZiAoJC5pc0FycmF5KHYpKSB7XHJcblx0XHRcdFx0Zm9ybWF0dGVkRGF0YVtrXSA9IHYuam9pbignfCcpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoayA9PT0gJ0lzTmV3c2xldHRlcicpIHtcclxuXHRcdFx0XHRoYXNOZXdzbGV0dGVyID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKCFoYXNOZXdzbGV0dGVyKSB7XHJcblx0XHRcdGZvcm1hdHRlZERhdGEuSXNOZXdzbGV0dGVyID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZvcm1hdHRlZERhdGE7XHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdHByZXBhcmVGb3JtOiBwcmVwYXJlRm9ybSxcclxuXHRcdGNyZWF0ZURhdGFPYmplY3Q6IGNyZWF0ZURhdGFPYmplY3QsXHJcblx0XHRoYW5kbGVGb3JtRXJyb3JzOiBoYW5kbGVGb3JtRXJyb3JzLFxyXG5cdFx0aGFuZGxlR2VuZXJpY0Vycm9yOiBoYW5kbGVHZW5lcmljRXJyb3IsXHJcblx0XHRyZW1vdmVGb3JtRXJyb3JzOiByZW1vdmVGb3JtRXJyb3JzXHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi9wZXJmb3JtYW5jZScpLFxyXG5cdFx0Z2VuZXJhbExvYWRlcjogcmVxdWlyZSgnLi4vdmlld3MvZ2VuZXJhbC1sb2FkZXInKSxcclxuXHRcdGNvb2tpZTogcmVxdWlyZSgnLi9jb29raWUnKSxcclxuXHRcdGhhbmRsZWJhcnM6IHJlcXVpcmUoJy4vaGFuZGxlYmFycy1oZWxwZXJzJyksXHJcblx0XHRhbmFseXRpY3M6IHJlcXVpcmUoJy4vYW5hbHl0aWNzJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHRsb2FkZXJUaWQsXHJcblx0XHRsb2FkZXJEZWxheSA9IDE1MCxcclxuXHRcdGdsb2JhbFBhZ2VyU2l6ZSA9IDcsXHJcblx0XHQkYm9keSxcclxuXHRcdCRwYWdlclByb21pc2UsXHJcblx0XHQkcGFnZXIsXHJcblx0XHRoYixcclxuXHRcdGxvYWRlckNsYXNzLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW47XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRsb2FkZXJDbGFzcyA9IGRlcC5nZW5lcmFsTG9hZGVyO1xyXG5cdFx0aGIgPSBkZXAuaGFuZGxlYmFycztcclxuXHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkcGFnZXIgPSAkYm9keS5maW5kKCdbZGF0YS1wYWdlcl0nKTtcclxuXHRcdHZlcmlmaWNhdGlvblRva2VuID0gJGJvZHkuYXR0cignZGF0YS12ZXJpZmljYXRpb24tdG9rZW4nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRwcmVwYXJlUGFnZVJlcXVlc3QoJCh0aGlzKSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1wYWdlcl0gW2RhdGEtcGFnZV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRwcmVwYXJlUGFnZVJlcXVlc3QoJCh0aGlzKSwgLTEpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtcGFnZXJdIFtkYXRhLXBhZ2VyLXByZXZdOm5vdCgucGFnZXJfX2VsZW0tLWluYWN0aXZlKScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdHByZXBhcmVQYWdlUmVxdWVzdCgkKHRoaXMpLCAxKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXBhZ2VyXSBbZGF0YS1wYWdlci1uZXh0XTpub3QoLnBhZ2VyX19lbGVtLS1pbmFjdGl2ZSknKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHByZXBhcmVQYWdlUmVxdWVzdCgkcGFnZXJJdGVtLCBkaXJlY3Rpb24pIHtcclxuXHRcdHZhciBzZXJ2aWNlVXJsLFxyXG5cdFx0XHRzZWxlY3RlZFBhZ2UsXHJcblx0XHRcdHRvdGFsUGFnZXMsXHJcblx0XHRcdGN1cnJlbnRQYWdlLFxyXG5cdFx0XHRoYW5kbGViYXJzSWQ7XHJcblxyXG5cdFx0aWYgKCRwYWdlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHNlcnZpY2VVcmwgPSAkcGFnZXIuYXR0cignZGF0YS1wYWdlci11cmwnKTtcclxuXHRcdFx0Y3VycmVudFBhZ2UgPSBwYXJzZUludCgkcGFnZXIuYXR0cignZGF0YS1wYWdlci1jdXJyZW50cGFnZScpLCAxMCk7XHJcblx0XHRcdHRvdGFsUGFnZXMgPSBwYXJzZUludCgkcGFnZXIuYXR0cignZGF0YS1wYWdlci10b3RhbHBhZ2VzJyksIDEwKTtcclxuXHJcblx0XHRcdGlmIChkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHNlbGVjdGVkUGFnZSA9IGN1cnJlbnRQYWdlICsgKGRpcmVjdGlvbiA9PT0gLTEgPyAtMSA6IDEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNlbGVjdGVkUGFnZSA9ICRwYWdlckl0ZW0uYXR0cignZGF0YS1wYWdlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChzZWxlY3RlZFBhZ2UgPCAwKSB7XHJcblx0XHRcdFx0c2VsZWN0ZWRQYWdlID0gMDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHNlbGVjdGVkUGFnZSA+IHRvdGFsUGFnZXMpIHtcclxuXHRcdFx0XHRzZWxlY3RlZFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRoYW5kbGViYXJzSWQgPSAkcGFnZXIuYXR0cignZGF0YS1oYW5kbGViYXJzLWlkJykgfHwgZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHNlcnZpY2VVcmwgJiYgY3VycmVudFBhZ2UgIT09IHNlbGVjdGVkUGFnZSkge1xyXG5cdFx0XHRzaG93RGVsYXllZExvYWRlcigpO1xyXG5cdFx0XHRzZW5kUmVxdWVzdChzZXJ2aWNlVXJsLCBzZWxlY3RlZFBhZ2UsIGhhbmRsZWJhcnNJZCk7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2VuZFJlcXVlc3QodXJsLCBpbmRleCwgdGVtcGxhdGVJZCwgZnJvbUhpc3RvcnkpIHtcclxuXHRcdHZhciBkYXRhID0ge30sXHJcblx0XHRcdHBhZ2VVcmwsXHJcblx0XHRcdHRvdGFsUGFnZXMsXHJcblx0XHRcdGJyb3dzZXJVcmwgPSB1cmwuc3BsaXQoJz8nKVsxXSB8fCAnJyxcclxuXHRcdFx0cHVzaFN0YXRlT2JqID0ge30sXHJcblx0XHRcdGN1cnJlbnRQYWdlID0gcGFyc2VJbnQoJHBhZ2VyLmF0dHIoJ2RhdGEtcGFnZXItY3VycmVudHBhZ2UnKSwgMTApLFxyXG5cdFx0XHQkaGJXcmFwcGVyO1xyXG5cclxuXHRcdHBhZ2VVcmwgPSAkcGFnZXIuYXR0cignZGF0YS1wYWdlci1wYWdldXJsJyk7XHJcblxyXG5cdFx0aWYgKHRlbXBsYXRlSWQgIT09IGZhbHNlKSB7XHJcblx0XHRcdCRoYldyYXBwZXIgPSAkYm9keS5maW5kKCdbZGF0YS1oYi13cmFwcGVyPVwiJyArIHRlbXBsYXRlSWQgKyAnXCJdJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGF0YS5wYWdlaW5kZXggPSBpbmRleDtcclxuXHJcblx0XHQkcGFnZXJQcm9taXNlID0gJC5hamF4KHtcclxuXHRcdFx0dHlwZTogJ2dldCcsXHJcblx0XHRcdHVybDogdXJsLFxyXG5cdFx0XHRkYXRhOiBkYXRhLFxyXG5cdFx0XHRjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRoZWFkZXJzOiB7XHJcblx0XHRcdFx0X19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46IHZlcmlmaWNhdGlvblRva2VuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJHBhZ2VyUHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LklzU3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cclxuXHRcdFx0XHRpZiAoYnJvd3NlclVybCA9PT0gJycpIHtcclxuXHRcdFx0XHRcdGJyb3dzZXJVcmwgPSAnP3BhZ2VpbmRleD0nICsgcmVzdWx0LlBhZ2VJbmRleDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YnJvd3NlclVybCA9ICc/JyArIGJyb3dzZXJVcmw7XHJcblx0XHRcdFx0XHRicm93c2VyVXJsICs9ICcmcGFnZWluZGV4PScgKyByZXN1bHQuUGFnZUluZGV4O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHdpbmRvdy5oaXN0b3J5ICYmIGZyb21IaXN0b3J5ICE9PSB0cnVlKSB7XHJcblxyXG5cdFx0XHRcdFx0cHVzaFN0YXRlT2JqLnR5cGUgPSAncGFnZXInO1xyXG5cdFx0XHRcdFx0cHVzaFN0YXRlT2JqLnBhZ2VyVXJsID0gdXJsO1xyXG5cdFx0XHRcdFx0cHVzaFN0YXRlT2JqLnRlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkO1xyXG5cdFx0XHRcdFx0cHVzaFN0YXRlT2JqLmN1cnJlbnRJbmRleCA9IHJlc3VsdC5QYWdlSW5kZXg7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJlc3VsdC5QYWdlSW5kZXggIT09IGN1cnJlbnRQYWdlKSB7XHJcblx0XHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShwdXNoU3RhdGVPYmosIGRvY3VtZW50LnRpdGxlLCBicm93c2VyVXJsKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0LlRvdGFsIC8gcmVzdWx0LlBhZ2VTaXplKTtcclxuXHJcblx0XHRcdFx0JHBhZ2VyLmZpbmQoJ1tkYXRhLXBhZ2VyLWluZGV4ZXNdJykuaHRtbChjcmVhdGVQYWdlcnModG90YWxQYWdlcywgcmVzdWx0LCBwYWdlVXJsKSk7XHJcblxyXG5cdFx0XHRcdHNldFBhZ2VyU3RhdGVzKCRwYWdlciwgcmVzdWx0LlBhZ2VJbmRleCwgdG90YWxQYWdlcyk7XHJcblxyXG5cdFx0XHRcdGlmICh0ZW1wbGF0ZUlkICE9PSBmYWxzZSAmJiAkaGJXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdCRoYldyYXBwZXIuaHRtbChoYi5nZXRUcGwodGVtcGxhdGVJZCkocmVzdWx0KSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQkYm9keS5zY3JvbGxUb3AoMCk7XHJcblxyXG5cdFx0fSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldFBhZ2VyU3RhdGVzKCRwYWdlck9iaiwgcGFnZUluZGV4LCB0b3RhbFBhZ2VzKSB7XHJcblx0XHQkcGFnZXJPYmouYXR0cignZGF0YS1wYWdlci1jdXJyZW50cGFnZScsIHBhZ2VJbmRleCk7XHJcblx0XHQkcGFnZXJPYmouZmluZCgnW2RhdGEtcGFnZXItcHJldl0nKS5yZW1vdmVDbGFzcygncGFnZXJfX2VsZW0tLWluYWN0aXZlJyk7XHJcblx0XHQkcGFnZXJPYmouZmluZCgnW2RhdGEtcGFnZXItbmV4dF0nKS5yZW1vdmVDbGFzcygncGFnZXJfX2VsZW0tLWluYWN0aXZlJyk7XHJcblxyXG5cdFx0aWYgKHBhZ2VJbmRleCA8IDIpIHtcclxuXHRcdFx0JHBhZ2VyT2JqLmZpbmQoJ1tkYXRhLXBhZ2VyLXByZXZdJykuYWRkQ2xhc3MoJ3BhZ2VyX19lbGVtLS1pbmFjdGl2ZScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChwYWdlSW5kZXggPiB0b3RhbFBhZ2VzIC0gMSkge1xyXG5cdFx0XHQkcGFnZXJPYmouZmluZCgnW2RhdGEtcGFnZXItbmV4dF0nKS5hZGRDbGFzcygncGFnZXJfX2VsZW0tLWluYWN0aXZlJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0JHBhZ2VyT2JqLmZpbmQoJ1tkYXRhLXBhZ2VdJykucmVtb3ZlQ2xhc3MoJ3N0ZXBwZXItLWFjdGl2ZScpLmJsdXIoKTtcclxuXHRcdCRwYWdlck9iai5maW5kKCdbZGF0YS1wYWdlPVwiJyArIHBhZ2VJbmRleCArICdcIl0nKS5hZGRDbGFzcygnc3RlcHBlci0tYWN0aXZlJyk7XHJcblxyXG5cdFx0JHBhZ2VyT2JqLmZpbmQoJ1tkYXRhLXBhZ2VyLW1vYmlsLWluZGV4XScpLmh0bWwocGFnZUluZGV4ICsgJy8nICsgdG90YWxQYWdlcyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVQYWdlcnModG90YWxQYWdlcywgcGFnZSwgcGFnZVVybCkge1xyXG5cdFx0dmFyIHN0ZXBzU3RhcnQsXHJcblx0XHRcdGN1cnJlbnRQYWdlLFxyXG5cdFx0XHRhY3R1YWxQYWdlclNpemUsXHJcblx0XHRcdG5leHRNb3JlU3RlcCxcclxuXHRcdFx0cHJldk1vcmVTdGVwLFxyXG5cdFx0XHRwYWdlckh0bWwgPSAnJyxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdHNlbGVjdGVkWWVhclF1ZXJ5UGFyYW0gPSBwYWdlLlNlbGVjdGVkWWVhciA/ICcmeWVhcj0nICsgcGFnZS5TZWxlY3RlZFllYXIgOiAnJztcclxuXHJcblx0XHRjdXJyZW50UGFnZSA9IHBhZ2UuUGFnZUluZGV4O1xyXG5cclxuXHRcdGlmIChjdXJyZW50UGFnZSA+IHRvdGFsUGFnZXMpIHtcclxuXHRcdFx0Y3VycmVudFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHN0ZXBzU3RhcnQgPSBjdXJyZW50UGFnZSAtIE1hdGguY2VpbCgoZ2xvYmFsUGFnZXJTaXplIC0gMSkgLyAyKTtcclxuXHJcblx0XHRpZiAoc3RlcHNTdGFydCA+IHRvdGFsUGFnZXMgLSBnbG9iYWxQYWdlclNpemUgKyAxKSB7XHJcblx0XHRcdHN0ZXBzU3RhcnQgPSB0b3RhbFBhZ2VzIC0gZ2xvYmFsUGFnZXJTaXplICsgMTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc3RlcHNTdGFydCA8IDEpIHtcclxuXHRcdFx0c3RlcHNTdGFydCA9IDE7XHJcblx0XHR9XHJcblxyXG5cdFx0YWN0dWFsUGFnZXJTaXplID0gTWF0aC5taW4oZ2xvYmFsUGFnZXJTaXplLCB0b3RhbFBhZ2VzKTtcclxuXHRcdG5leHRNb3JlU3RlcCA9IGN1cnJlbnRQYWdlICsgYWN0dWFsUGFnZXJTaXplO1xyXG5cclxuXHRcdGlmIChuZXh0TW9yZVN0ZXAgPiB0b3RhbFBhZ2VzKSB7XHJcblx0XHRcdG5leHRNb3JlU3RlcCA9IHRvdGFsUGFnZXM7XHJcblx0XHR9XHJcblxyXG5cdFx0cHJldk1vcmVTdGVwID0gY3VycmVudFBhZ2UgLSBhY3R1YWxQYWdlclNpemU7XHJcblxyXG5cdFx0aWYgKHByZXZNb3JlU3RlcCA8IDEpIHtcclxuXHRcdFx0cHJldk1vcmVTdGVwID0gMTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc3RlcHNTdGFydCA+IDEpIHtcclxuXHRcdFx0cGFnZXJIdG1sICs9ICc8YSBocmVmPVwiJyArIHBhZ2VVcmwgKyAocGFnZVVybC5tYXRjaCgvXFw/L2lnKSA9PT0gbnVsbCA/ICc/cGFnZWluZGV4PScgKyBwcmV2TW9yZVN0ZXAgKyBzZWxlY3RlZFllYXJRdWVyeVBhcmFtIDogJyZwYWdlaW5kZXg9JyArIHByZXZNb3JlU3RlcCArIHNlbGVjdGVkWWVhclF1ZXJ5UGFyYW0pICsgJ1wiIGRhdGEtcGFnZT1cIicgKyBwcmV2TW9yZVN0ZXAgKyAnXCIgY2xhc3M9XCJzdGVwcGVyXCI+Li4uPC9hPic7XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yIChpOyBpIDwgKHRvdGFsUGFnZXMgPiBnbG9iYWxQYWdlclNpemUgPyBnbG9iYWxQYWdlclNpemUgOiB0b3RhbFBhZ2VzKTsgaSsrKSB7XHJcblx0XHRcdHBhZ2VySHRtbCArPSAnPGEgaHJlZj1cIicgKyBwYWdlVXJsICsgKHBhZ2VVcmwubWF0Y2goL1xcPy9pZykgPT09IG51bGwgPyAnP3BhZ2VpbmRleD0nICsgcGFyc2VJbnQoc3RlcHNTdGFydCArIGksIDEwKSArIHNlbGVjdGVkWWVhclF1ZXJ5UGFyYW0gOiAnJnBhZ2VpbmRleD0nICsgcGFyc2VJbnQoc3RlcHNTdGFydCArIGksIDEwKSArIHNlbGVjdGVkWWVhclF1ZXJ5UGFyYW0pICsgJ1wiIGRhdGEtcGFnZT1cIicgKyBwYXJzZUludChzdGVwc1N0YXJ0ICsgaSwgMTApICsgJ1wiIGNsYXNzPVwic3RlcHBlciAnICsgKHBhcnNlSW50KHN0ZXBzU3RhcnQgKyBpLCAxMCkgPT09IGN1cnJlbnRQYWdlID8gJ3N0ZXBwZXItLWFjdGl2ZScgOiAnJykgKyAnXCI+JyArIHBhcnNlSW50KHN0ZXBzU3RhcnQgKyBpLCAxMCkgKyAnPC9hPic7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHN0ZXBzU3RhcnQgKyBnbG9iYWxQYWdlclNpemUgLSAxIDwgdG90YWxQYWdlcykge1xyXG5cdFx0XHRwYWdlckh0bWwgKz0gJzxhIGhyZWY9XCInICsgcGFnZVVybCArIChwYWdlVXJsLm1hdGNoKC9cXD8vaWcpID09PSBudWxsID8gJz9wYWdlaW5kZXg9JyArIG5leHRNb3JlU3RlcCArIHNlbGVjdGVkWWVhclF1ZXJ5UGFyYW0gOiAnJnBhZ2VpbmRleD0nICsgbmV4dE1vcmVTdGVwICsgc2VsZWN0ZWRZZWFyUXVlcnlQYXJhbSkgKyAnXCIgZGF0YS1wYWdlPVwiJyArIG5leHRNb3JlU3RlcCArICdcIiBjbGFzcz1cInN0ZXBwZXJcIj4uLi48L2E+JztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGFnZXJIdG1sO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhpZGVMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGRlcC5nZW5lcmFsTG9hZGVyLmhpZGVMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dEZWxheWVkTG9hZGVyKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KGxvYWRlclRpZCk7XHJcblx0XHRsb2FkZXJUaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0bG9hZGVyQ2xhc3Muc2hvd0xvYWRlcigpO1xyXG5cdFx0fSwgbG9hZGVyRGVsYXkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRzZW5kUmVxdWVzdDogc2VuZFJlcXVlc3QsXHJcblx0XHRjcmVhdGVQYWdlcnM6IGNyZWF0ZVBhZ2VycyxcclxuXHRcdHNldFBhZ2VyU3RhdGVzOiBzZXRQYWdlclN0YXRlc1xyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKSxcclxuXHRcdGdlbmVyYWxMb2FkZXI6IHJlcXVpcmUoJy4uL3ZpZXdzL2dlbmVyYWwtbG9hZGVyJyksXHJcblx0XHRoYW5kbGViYXJzOiByZXF1aXJlKCcuL2hhbmRsZWJhcnMtaGVscGVycycpXHJcblx0fVxyXG4pKTtcclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzLFxyXG5cdFx0JGJvZHksXHJcblx0XHQkaGJXcmFwcGVyLFxyXG5cdFx0JHBhZ2VyLFxyXG5cdFx0aGIsXHJcblx0XHRzZXR0aW5ncztcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGhiID0gZGVwLmhhbmRsZWJhcnM7XHJcblxyXG5cdFx0aW5pdFNldHRpbmdzKCk7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFNldHRpbmdzKCkge1xyXG5cdFx0c2V0dGluZ3MgPSB7XHJcblx0XHRcdHNpemU6IDEwLFxyXG5cdFx0XHR0b3RhbDogMCxcclxuXHRcdFx0YWN0aXZlOiAwLFxyXG5cdFx0XHRwYWdlc1RvU2hvdzogOCxcclxuXHRcdFx0aXNGaXJzdDogZmFsc2UsXHJcblx0XHRcdGlzTGFzdDogZmFsc2UsXHJcblx0XHRcdCRpbnB1dDogZmFsc2UsXHJcblx0XHRcdHNob3VsZERpc3BsYXk6IGZhbHNlXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkcGFnZXIgPSAkYm9keS5maW5kKCdbZGF0YS1nZW5lcmljLXBhZ2VyXScpO1xyXG5cdFx0JGhiV3JhcHBlciA9ICRwYWdlci5maW5kKCdbZGF0YS1oYi13cmFwcGVyPVwicGFnZXItdHBsXCJdJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHQkcGFnZXIub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0c2V0dGluZ3MuYWN0aXZlID0gcGFyc2VJbnQoJChlLmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtcGFnZScpLCAxMCk7XHJcblxyXG5cdFx0XHRcdGlmKHNldHRpbmdzLmlucHV0KSB7XHJcblx0XHRcdFx0XHRzZXR0aW5ncy5pbnB1dC52YWwoc2V0dGluZ3MuYWN0aXZlKTtcclxuXHRcdFx0XHRcdHNldHRpbmdzLmlucHV0LnRyaWdnZXIoJ3BhZ2VyLWNoYW5nZScpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0b25QYWdlckV2ZW50KCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1wYWdlXTpub3QoLmFjdGl2ZSknKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZVBhZ2VyKGRhdGEpIHtcclxuXHRcdCQuZXh0ZW5kKHNldHRpbmdzLCBkYXRhKTtcclxuXHJcblx0XHRpZihzZXR0aW5ncy5pbnB1dCkge1xyXG5cdFx0XHRzZXR0aW5ncy5pbnB1dC52YWwoc2V0dGluZ3MuYWN0aXZlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXBpbGUoKSB7XHJcblx0XHR2YXIgcGFnZXJEYXRhID0ge1xyXG5cdFx0XHRwYWdlczogW10sXHJcblx0XHRcdGFjdGl2ZTogc2V0dGluZ3MuYWN0aXZlLFxyXG5cdFx0XHRpc0ZpcnN0OiBzZXR0aW5ncy5hY3RpdmUgPT09IDEsXHJcblx0XHRcdGlzTGFzdDogc2V0dGluZ3MuYWN0aXZlID09PSBzZXR0aW5ncy50b3RhbFBhZ2VzLFxyXG5cdFx0XHRwcmV2OiBzZXR0aW5ncy5hY3RpdmUgLSAxLFxyXG5cdFx0XHRuZXh0OiBzZXR0aW5ncy5hY3RpdmUgKyAxLFxyXG5cdFx0XHRzdGFydDogc2V0dGluZ3MuYWN0aXZlIDwgTWF0aC5mbG9vcihzZXR0aW5ncy5wYWdlc1RvU2hvdyAvIDIpID8gMSA6IHNldHRpbmdzLmFjdGl2ZSAtIE1hdGguZmxvb3Ioc2V0dGluZ3MucGFnZXNUb1Nob3cgLyAyKSxcclxuXHRcdFx0dG90YWxQYWdlczogc2V0dGluZ3MudG90YWxQYWdlcyxcclxuXHRcdFx0c2hvdWxkRGlzcGxheTogc2V0dGluZ3Muc2hvdWxkRGlzcGxheVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRpO1xyXG5cclxuXHRcdHBhZ2VyRGF0YS5zdGFydCA9IE1hdGgubWluKHBhZ2VyRGF0YS5zdGFydCwgc2V0dGluZ3MudG90YWxQYWdlcyAtIHNldHRpbmdzLnBhZ2VzVG9TaG93KTtcclxuXHRcdHBhZ2VyRGF0YS5zdGFydCA9IE1hdGgubWF4KDEsIHBhZ2VyRGF0YS5zdGFydCk7XHJcblx0XHRwYWdlckRhdGEuZW5kID0gTWF0aC5taW4oc2V0dGluZ3MudG90YWxQYWdlcywgcGFnZXJEYXRhLnN0YXJ0ICsgc2V0dGluZ3MucGFnZXNUb1Nob3cpO1xyXG5cclxuXHRcdGZvcihpID0gcGFnZXJEYXRhLnN0YXJ0OyBpIDw9IHBhZ2VyRGF0YS5lbmQ7IGkrKykge1xyXG5cdFx0XHRwYWdlckRhdGEucGFnZXMucHVzaCh7XHJcblx0XHRcdFx0aW5kZXg6IGksXHJcblx0XHRcdFx0bnVtYmVyOiBpLFxyXG5cdFx0XHRcdGFjdGl2ZTogc2V0dGluZ3MuYWN0aXZlID09PSBpXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmKHBhZ2VyRGF0YS50b3RhbFBhZ2VzID4gc2V0dGluZ3MuYWN0aXZlICsgc2V0dGluZ3MucGFnZXNUb1Nob3cgLSAxKSB7XHJcblx0XHRcdHBhZ2VyRGF0YS5kb3RzID0gcGFnZXJEYXRhLmVuZDtcclxuXHRcdH1cclxuXHJcblx0XHQkaGJXcmFwcGVyLmh0bWwoaGIuZ2V0VHBsKCdwYWdlci10cGwnKShwYWdlckRhdGEpKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uUGFnZXJFdmVudCgpIHt9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0LFxyXG5cdFx0dXBkYXRlUGFnZXI6IHVwZGF0ZVBhZ2VyLFxyXG5cdFx0Y29tcGlsZTogY29tcGlsZSxcclxuXHRcdG9uUGFnZXJFdmVudDogb25QYWdlckV2ZW50XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi9wZXJmb3JtYW5jZScpLFxyXG5cdFx0Z2VuZXJhbExvYWRlcjogcmVxdWlyZSgnLi4vdmlld3MvZ2VuZXJhbC1sb2FkZXInKSxcclxuXHRcdGhhbmRsZWJhcnM6IHJlcXVpcmUoJy4vaGFuZGxlYmFycy1oZWxwZXJzJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdHNlcnZpY2VVUkwsXHJcblx0XHRmb3JtRWwsXHJcblx0XHQkcHJvbWlzZSxcclxuXHRcdGhiLFxyXG5cdFx0bG9hZGVyQ2xhc3MsXHJcblx0XHRsb2FkZXJUaWQsXHJcblx0XHRsb2FkZXJEZWxheSA9IDE1MCxcclxuXHRcdCRzZWFyY2hXcmFwcGVyLFxyXG5cdFx0JGZvcm0sXHJcblx0XHQkaGJXcmFwcGVyLFxyXG5cdFx0dG90YWxQYWdlcyxcclxuXHRcdHRwbCxcclxuXHRcdHJlc3BvbnNlS2V5LFxyXG5cdFx0aXNMb2FkTW9yZSA9IGZhbHNlLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW47XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdGxvYWRlckNsYXNzID0gZGVwLmdlbmVyYWxMb2FkZXI7XHJcblx0XHRoYiA9IGRlcC5oYW5kbGViYXJzO1xyXG5cclxuXHRcdGlmICgkc2VhcmNoV3JhcHBlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHNlcnZpY2VVUkwgPSAkc2VhcmNoV3JhcHBlci5hdHRyKCdkYXRhLXNlcnZpY2UtdXJsJyk7XHJcblx0XHRcdGZvcm1FbCA9ICRzZWFyY2hXcmFwcGVyLmZpbmQoJ1tkYXRhLWdlbmVyaWMtc2VhcmNoLWZvcm1dJyk7XHJcblx0XHRcdHRwbCA9ICRzZWFyY2hXcmFwcGVyLmF0dHIoJ2RhdGEtaGItdGVtcGxhdGUnKTtcclxuXHRcdFx0cmVzcG9uc2VLZXkgPSAkc2VhcmNoV3JhcHBlci5hdHRyKCdkYXRhLXJlc3BvbnNlLWtleScpO1xyXG5cdFx0XHRpc0xvYWRNb3JlID0gJHNlYXJjaFdyYXBwZXIuYXR0cignZGF0YS10eXBlJykgPT09ICdsb2FkLW1vcmUnO1xyXG5cclxuXHRcdFx0aWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggIT09ICcnKSB7XHJcblx0XHRcdFx0YXBwbHlRdWVyeVN0cmluZygpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNlbmRSZXF1ZXN0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRzZWFyY2hXcmFwcGVyID0gJGJvZHkuZmluZCgnW2RhdGEtZ2VuZXJpYy1zZWFyY2hdJyk7XHJcblx0XHQkZm9ybSA9ICRzZWFyY2hXcmFwcGVyLmZpbmQoJ1tkYXRhLWdlbmVyaWMtc2VhcmNoLWZvcm1dJyk7XHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbiA9ICRib2R5LmF0dHIoJ2RhdGEtdmVyaWZpY2F0aW9uLXRva2VuJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHQkZm9ybS5vbih7XHJcblx0XHRcdGNoYW5nZTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGZvcm1FbC5maW5kKCdbbmFtZT1cInBhZ2VpbmRleFwiXScpLnZhbCgxKTtcclxuXHRcdFx0XHRzZW5kUmVxdWVzdCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnaW5wdXQ6bm90KFtuYW1lPVwicGFnZWluZGV4XCJdKTpub3QoW25hbWU9XCJzb3J0YnlcIl0pOm5vdChbbmFtZT1cInNvcnRkZXNjXCJdKSwgc2VsZWN0Jyk7XHJcblxyXG5cdFx0JGZvcm0ub24oe1xyXG5cdFx0XHQncGFnZXItY2hhbmdlJzogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHNlbmRSZXF1ZXN0KCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdpbnB1dFtuYW1lPVwicGFnZWluZGV4XCJdJyk7XHJcblxyXG5cdFx0JHNlYXJjaFdyYXBwZXIub24oe1xyXG5cdFx0XHQnc2VuZC1yZXF1ZXN0JzogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHNlbmRSZXF1ZXN0KCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFNvcnRCaW5kaW5ncygpIHtcclxuXHRcdCRzZWFyY2hXcmFwcGVyLm9uKHtcclxuXHRcdFx0J3NvcnQtY2hhbmdlJzogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHNlbmRSZXF1ZXN0KCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaGlkZUxvYWRlcigpIHtcclxuXHRcdGNsZWFyVGltZW91dChsb2FkZXJUaWQpO1xyXG5cdFx0ZGVwLmdlbmVyYWxMb2FkZXIuaGlkZUxvYWRlcigpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2hvd0RlbGF5ZWRMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGxvYWRlclRpZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRsb2FkZXJDbGFzcy5zaG93TG9hZGVyKCk7XHJcblx0XHR9LCBsb2FkZXJEZWxheSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjb2xsZWN0Rm9ybURhdGEoKSB7XHJcblx0XHR2YXIgZm9ybURhdGEgPSB7fSxcclxuXHRcdFx0aW5wdXRzID0gZm9ybUVsLmZpbmQoJ2lucHV0LCBzZWxlY3QnKSxcclxuXHRcdFx0aW5wdXRzQXJyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW5wdXRzKTtcclxuXHJcblx0XHRpbnB1dHNBcnIuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xyXG5cdFx0XHRzd2l0Y2ggKGl0ZW0udHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgJ3RleHQnOlxyXG5cdFx0XHRcdGNhc2UgJ2VtYWlsJzpcclxuXHRcdFx0XHRjYXNlICd0ZWwnOlxyXG5cdFx0XHRcdGNhc2UgJ2hpZGRlbic6XHJcblx0XHRcdFx0XHRpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlICE9PSAnJykge1xyXG5cdFx0XHRcdFx0XHRmb3JtRGF0YVtpdGVtLm5hbWVdID0gaXRlbS52YWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdjaGVja2JveCc6XHJcblx0XHRcdFx0Y2FzZSAncmFkaW8nOlxyXG5cdFx0XHRcdFx0aWYgKGl0ZW0uY2hlY2tlZCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybURhdGFbaXRlbS5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9ybURhdGFbaXRlbS5uYW1lXSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9ybURhdGFbaXRlbS5uYW1lXSA9IGZvcm1EYXRhW2l0ZW0ubmFtZV0gKyAnfCcgKyBpdGVtLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlICdzZWxlY3QnOlxyXG5cdFx0XHRcdFx0aWYgKGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSAhPT0gJycpIHtcclxuXHRcdFx0XHRcdFx0Zm9ybURhdGFbaXRlbS5uYW1lXSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIGZvcm1EYXRhO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYnVpbGRRdWVyeVN0cmluZyhvYmplY3QpIHtcclxuXHRcdHZhciBxdWVyeVN0cmluZyA9IE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRpZiAob2JqZWN0W2tleV0gJiYgb2JqZWN0W2tleV0gIT09ICcnKSB7XHJcblx0XHRcdFx0aWYgKCFmb3JtRWwuZmluZCgnW25hbWU9XCInICsga2V5ICsgJ1wiXScpWzBdLmhhc0F0dHJpYnV0ZSgnZGF0YS1za2lwLWZyb20tcXVlcnknKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGtleSArICc9JyArIG9iamVjdFtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSkuZmlsdGVyKGZ1bmN0aW9uKGtleVZhbCkge1xyXG5cdFx0XHRyZXR1cm4ga2V5VmFsICE9PSB1bmRlZmluZWQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gcXVlcnlTdHJpbmcubGVuZ3RoID4gMCA/ICc/JyArIHF1ZXJ5U3RyaW5nLmpvaW4oJyYnKSA6ICcnO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZygpIHtcclxuXHRcdHZhciBxdWVyeVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsXHJcblx0XHRcdHF1ZXJpZXMsXHJcblx0XHRcdHF1ZXJ5T2JqID0ge307XHJcblxyXG5cdFx0aWYgKHF1ZXJ5U3RyaW5nICE9PSAnJykge1xyXG5cdFx0XHRxdWVyaWVzID0gcXVlcnlTdHJpbmcucmVwbGFjZSgnPycsICcnKS5zcGxpdCgnJicpO1xyXG5cclxuXHRcdFx0cXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbCkge1xyXG5cdFx0XHRcdGlmICh2YWwuc3BsaXQoJz0nKVsxXSAmJiB2YWwuc3BsaXQoJz0nKVsxXSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRxdWVyeU9ialt2YWwuc3BsaXQoJz0nKVswXV0gPSB2YWwuc3BsaXQoJz0nKVsxXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBxdWVyeU9iajtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFwcGx5UXVlcnlTdHJpbmcoKSB7XHJcblx0XHR2YXIgcXVlcnlPYmogPSBwYXJzZVF1ZXJ5U3RyaW5nKCksXHJcblx0XHRcdGVsLFxyXG5cdFx0XHRwcm9wO1xyXG5cclxuXHRcdGZvciAocHJvcCBpbiBxdWVyeU9iaikge1xyXG5cdFx0XHRpZiAocXVlcnlPYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuXHRcdFx0XHRlbCA9IGZvcm1FbC5maW5kKCdbbmFtZT1cIicgKyBwcm9wICsgJ1wiXScpO1xyXG5cclxuICAgICAgICBpZiAoZWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAoZWxbMF0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAnY2hlY2tib3gnIHx8IGVsWzBdLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3JhZGlvJykge1xyXG4gICAgICAgICAgICBxdWVyeU9ialtwcm9wXS5zcGxpdCgnfCcpLmZvckVhY2godGljayk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsWzBdLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcpIHtcclxuICAgICAgICAgICAgZWwudmFsKHF1ZXJ5T2JqW3Byb3BdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsLnZhbChxdWVyeU9ialtwcm9wXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gdGljayh2YWx1ZSkge1xyXG5cdFx0XHRmb3JtRWwuZmluZCgnW3ZhbHVlPVwiJyArIHZhbHVlICsgJ1wiXScpLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNlbmRSZXF1ZXN0KCkge1xyXG5cdFx0dmFyIGRhdGEgPSBjb2xsZWN0Rm9ybURhdGEoKSxcclxuXHRcdFx0cGFnZXJEYXRhLFxyXG5cdFx0XHRzb3J0RGF0YTtcclxuXHJcblx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHRzaG93RGVsYXllZExvYWRlcigpO1xyXG5cdFx0Y2xlYXJQcmV2aW91c1Byb21pc2UoKTtcclxuXHJcblx0XHR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIGJ1aWxkUXVlcnlTdHJpbmcoZGF0YSkpO1xyXG5cclxuXHRcdCRoYldyYXBwZXIgPSAkYm9keS5maW5kKCdbZGF0YS1oYi13cmFwcGVyPVwicmVzdWx0XCJdJyk7XHJcblx0XHQkcHJvbWlzZSA9ICQuYWpheCh7XHJcblx0XHRcdHR5cGU6ICdnZXQnLFxyXG5cdFx0XHR1cmw6IHNlcnZpY2VVUkwsXHJcblx0XHRcdGRhdGE6IGRhdGEsXHJcblx0XHRcdGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXHJcblx0XHRcdGRhdGFUeXBlOiAnanNvbicsXHJcblx0XHRcdGhlYWRlcnM6IHtcclxuXHRcdFx0XHRfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogdmVyaWZpY2F0aW9uVG9rZW5cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JC53aGVuKCRwcm9taXNlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHRcdFx0aGlkZUxvYWRlcigpO1xyXG5cclxuXHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuSXNTdWNjZXNzID09PSB0cnVlKSB7XHJcblxyXG5cdFx0XHRcdGlmIChyZXN1bHQuUGFnZUluZGV4ID09PSAwIHx8IHJlc3VsdC5QYWdlSW5kZXggPiAxICYmIHJlc3VsdFtyZXNwb25zZUtleV0ubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdFx0XHRmb3JtRWwuZmluZCgnW25hbWU9XCJwYWdlaW5kZXhcIl0nKS52YWwoMSk7XHJcblx0XHRcdFx0XHRmb3JtRWwuZmluZCgnW25hbWU9XCJwYWdlaW5kZXhcIl0nKS50cmlnZ2VyKCdwYWdlci1jaGFuZ2UnKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0LlRvdGFsIC8gcmVzdWx0LlBhZ2VTaXplKTtcclxuXHJcblx0XHRcdFx0cGFnZXJEYXRhID0ge1xyXG5cdFx0XHRcdFx0dG90YWw6IHJlc3VsdC5Ub3RhbCxcclxuXHRcdFx0XHRcdGFjdGl2ZTogcmVzdWx0LlBhZ2VJbmRleCxcclxuXHRcdFx0XHRcdHNpemU6IHJlc3VsdC5QYWdlU2l6ZSxcclxuXHRcdFx0XHRcdHRvdGFsUGFnZXM6IHRvdGFsUGFnZXMsXHJcblx0XHRcdFx0XHRzaG91bGREaXNwbGF5OiBwYXJzZUludChyZXN1bHQuVG90YWwsIDEwKSA+IHBhcnNlSW50KHJlc3VsdC5QYWdlU2l6ZSwgMTApLFxyXG5cdFx0XHRcdFx0aW5wdXQ6IGZvcm1FbC5maW5kKCdbbmFtZT1cInBhZ2VpbmRleFwiXScpXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRkZXAuZ2VuZXJpY1BhZ2VyLnVwZGF0ZVBhZ2VyKHBhZ2VyRGF0YSk7XHJcblx0XHRcdFx0ZGVwLmdlbmVyaWNQYWdlci5jb21waWxlKCk7XHJcblxyXG5cdFx0XHRcdGlmICgkaGJXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGlmIChpc0xvYWRNb3JlKSB7XHJcblx0XHRcdFx0XHRcdCRoYldyYXBwZXIuYXBwZW5kKGhiLmdldFRwbCh0cGwpKHJlc3VsdCkpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0JGhiV3JhcHBlci5odG1sKGhiLmdldFRwbCh0cGwpKHJlc3VsdCkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKGRhdGEuc29ydGJ5ICE9PSB1bmRlZmluZWQgJiYgZGF0YS5zb3J0ZGVzYyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRpZiAoZGVwLmdlbmVyaWNTb3J0LmlzU29ydEluaXQoKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0c29ydERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdFx0JHBhcmVudDogJHNlYXJjaFdyYXBwZXIsXHJcblx0XHRcdFx0XHRcdFx0c29ydGJ5OiBkYXRhLnNvcnRieSxcclxuXHRcdFx0XHRcdFx0XHRzb3J0ZGVzYzogZGF0YS5zb3J0ZGVzYyA9PT0gJ3RydWUnLFxyXG5cdFx0XHRcdFx0XHRcdCRzb3J0SW5wdXQ6IGZvcm1FbC5maW5kKCdbbmFtZT1cInNvcnRieVwiXScpLFxyXG5cdFx0XHRcdFx0XHRcdCRkZXNjSW5wdXQ6IGZvcm1FbC5maW5kKCdbbmFtZT1cInNvcnRkZXNjXCJdJylcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0ZGVwLmdlbmVyaWNTb3J0LmluaXQoc29ydERhdGEpO1xyXG5cdFx0XHRcdFx0XHRpbml0U29ydEJpbmRpbmdzKCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRkZXAuZ2VuZXJpY1NvcnQudXBkYXRlU2V0dGluZ3Moe1xyXG5cdFx0XHRcdFx0XHRcdHNvcnRieTogZGF0YS5zb3J0YnksXHJcblx0XHRcdFx0XHRcdFx0c29ydGRlc2M6IGRhdGEuc29ydGRlc2MgPT09ICd0cnVlJ1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0ZGVwLmdlbmVyaWNTb3J0LnVwZGF0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbGVhclByZXZpb3VzUHJvbWlzZSgpIHtcclxuXHRcdGlmICgkcHJvbWlzZSAmJiAkcHJvbWlzZS5yZWFkeVN0YXRlICE9PSA0KSB7XHJcblx0XHRcdCRwcm9taXNlLmFib3J0KCk7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi9wZXJmb3JtYW5jZScpLFxyXG5cdFx0aGFuZGxlYmFyczogcmVxdWlyZSgnLi9oYW5kbGViYXJzLWhlbHBlcnMnKSxcclxuXHRcdGdlbmVyYWxMb2FkZXI6IHJlcXVpcmUoJy4uL3ZpZXdzL2dlbmVyYWwtbG9hZGVyJyksXHJcblx0XHRnZW5lcmljUGFnZXI6IHJlcXVpcmUoJy4vZ2VuZXJpYy1wYWdlci1oYW5kbGluZycpLFxyXG5cdFx0Z2VuZXJpY1NvcnQ6IHJlcXVpcmUoJy4vZ2VuZXJpYy1zb3J0LWhhbmRsaW5nJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHRzZXR0aW5ncyA9IHtcclxuICAgICAgaW5pdDogZmFsc2VcclxuICAgIH07XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoZGF0YSkge1xyXG5cdFx0aW5pdFNldHRpbmdzKGRhdGEpO1xyXG5cdFx0dXBkYXRlKCk7XHJcblx0XHRpbml0QmluZGluZ3MoKTtcclxuXHRcdHNldHRpbmdzLmluaXQgPSB0cnVlO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFNldHRpbmdzKGRhdGEpIHtcclxuICAgICQuZXh0ZW5kKHNldHRpbmdzID0ge1xyXG4gICAgICAkcGFyZW50OiB1bmRlZmluZWQsXHJcblx0XHRcdHNvcnRieTogJycsXHJcblx0XHRcdHNvcnRkZXNjOiBmYWxzZSxcclxuXHRcdFx0JHNvcnRJbnB1dDogZmFsc2UsXHJcblx0XHRcdCRkZXNjSW5wdXQ6IGZhbHNlLFxyXG5cdFx0XHRpbml0OiBmYWxzZVxyXG5cdFx0fSwgZGF0YSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHRzZXR0aW5ncy4kcGFyZW50Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRzZXR0aW5ncy5zb3J0YnkgPSAkKGUuY3VycmVudFRhcmdldCkuYXR0cignZGF0YS1zb3J0Jyk7XHJcblx0XHRcdFx0c2V0dGluZ3Muc29ydGRlc2MgPSAkKGUuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoJ3NvcnQtLWFzYycpO1xyXG5cclxuXHRcdFx0XHRpZihzZXR0aW5ncy4kc29ydElucHV0KSB7XHJcblx0XHRcdFx0XHRzZXR0aW5ncy4kc29ydElucHV0LnZhbChzZXR0aW5ncy5zb3J0YnkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYoc2V0dGluZ3MuJGRlc2NJbnB1dCkge1xyXG5cdFx0XHRcdFx0c2V0dGluZ3MuJGRlc2NJbnB1dC52YWwoc2V0dGluZ3Muc29ydGRlc2MpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzZXR0aW5ncy4kcGFyZW50LnRyaWdnZXIoJ3NvcnQtY2hhbmdlJyk7XHJcblx0XHRcdFx0b25Tb3J0RXZlbnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXNvcnRdJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XHJcblx0XHRzZXR0aW5ncy4kcGFyZW50LmZpbmQoJ1tkYXRhLXNvcnRdLnNvcnQtLWFzYywgW2RhdGEtc29ydF0uc29ydC0tZGVzYycpLnJlbW92ZUNsYXNzKCdzb3J0LS1hc2Mgc29ydC0tZGVzYycpO1xyXG5cdFx0c2V0dGluZ3MuJHBhcmVudC5maW5kKCdbZGF0YS1zb3J0PVwiJyArIHNldHRpbmdzLnNvcnRieSArICdcIl0nKS5hZGRDbGFzcyhzZXR0aW5ncy5zb3J0ZGVzYyA/ICdzb3J0LS1kZXNjJyA6ICdzb3J0LS1hc2MnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzKGRhdGEpIHtcclxuXHRcdCQuZXh0ZW5kKHNldHRpbmdzLCBkYXRhKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGlzU29ydEluaXQoKSB7XHJcblx0XHRyZXR1cm4gc2V0dGluZ3MuaW5pdDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uU29ydEV2ZW50KCkge31cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRpc1NvcnRJbml0OiBpc1NvcnRJbml0LFxyXG5cdFx0dXBkYXRlOiB1cGRhdGUsXHJcblx0XHR1cGRhdGVTZXR0aW5nczogdXBkYXRlU2V0dGluZ3MsXHJcblx0XHRvblNvcnRFdmVudDogb25Tb3J0RXZlbnRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KCkpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdHRwbDtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdHRwbCA9IHt9O1xyXG5cclxuXHRcdGlmICh0eXBlb2YgSGFuZGxlYmFycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHJcblx0XHRcdHJlZ2lzdGVySGVscGVycygpO1xyXG5cclxuXHRcdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblxyXG5cdFx0XHQkYm9keS5maW5kKCdbZGF0YS10cGxdJykuZWFjaChmdW5jdGlvbiAoaywgdikge1xyXG5cdFx0XHRcdHZhciAkdGhpcyA9ICQodiksXHJcblx0XHRcdFx0XHRpZCA9ICR0aGlzLmF0dHIoJ2RhdGEtdHBsJyk7XHJcblxyXG5cdFx0XHRcdHRwbFtpZF0gPSBIYW5kbGViYXJzLmNvbXBpbGUoJHRoaXMuaHRtbCgpKTtcclxuXHJcblx0XHRcdFx0aWYgKGlkLmluZGV4T2YoJ3BhcnRpYWwvJykgPT09IDApIHtcclxuXHRcdFx0XHRcdEhhbmRsZWJhcnMucmVnaXN0ZXJQYXJ0aWFsKGlkLnNwbGl0KCcvJylbMV0sICR0aGlzLmh0bWwoKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZ2lzdGVySGVscGVycygpIHtcclxuXHJcblx0XHRIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd0b0xvd2VyQ2FzZScsIGZ1bmN0aW9uIHRvTG93ZXJDYXNlKHN0cikge1xyXG5cdFx0XHRyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdwZXInLCBmdW5jdGlvbiBwZXIodjEsIHYyKSB7XHJcblx0XHRcdHJldHVybiB2MSAvIHYyO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZXEnLCBmdW5jdGlvbiBlcSh2MSwgdjIsIG9wdGlvbnMpIHtcclxuXHRcdFx0aWYgKHYxID09PSB2Mikge1xyXG5cdFx0XHRcdHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdub3RlcScsIGZ1bmN0aW9uIG5vdGVxKHYxLCB2Miwgb3B0aW9ucykge1xyXG5cdFx0XHRpZiAodjEgIT09IHYyKSB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2VjaG9Kc29uJywgZnVuY3Rpb24gZWNob0pzb24odjEpIHtcclxuXHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYxKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lmQ29uZCcsIGZ1bmN0aW9uIGlmQ29uZCh2MSwgb3BlcmF0b3IsIHYyLCBvcHRpb25zKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcblx0XHRcdGNhc2UgJz09JzpcclxuXHRcdFx0Y2FzZSAnPT09JzpcclxuXHRcdFx0XHRyZXR1cm4gZXF1YWxpdHlDaGVjayh2MSwgdjIsIG9wdGlvbnMpO1xyXG5cdFx0XHRjYXNlICc8JzpcclxuXHRcdFx0Y2FzZSAnPD0nOlxyXG5cdFx0XHRjYXNlICc+JzpcclxuXHRcdFx0Y2FzZSAnPj0nOlxyXG5cdFx0XHRcdHJldHVybiBjb21wYXJlQ2hlY2sodjEsIHYyLCBvcHRpb25zLCBvcGVyYXRvcik7XHJcblx0XHRcdGNhc2UgJyYmJzpcclxuXHRcdFx0Y2FzZSAnfHwnOlxyXG5cdFx0XHRcdHJldHVybiBhbmRPckNoZWNrKHYxLCB2Miwgb3B0aW9ucywgb3BlcmF0b3IpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBlcXVhbGl0eUNoZWNrKHYxLCB2Miwgb3B0aW9ucykge1xyXG5cdFx0cmV0dXJuIHYxID09PSB2MiA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjb21wYXJlQ2hlY2sodjEsIHYyLCBvcHRpb25zLCBvcGVyYXRvcikge1xyXG5cdFx0c3dpdGNoIChvcGVyYXRvcikge1xyXG5cdFx0Y2FzZSAnPCc6XHJcblx0XHRcdHJldHVybiB2MSA8IHYyID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuXHRcdGNhc2UgJzw9JzpcclxuXHRcdFx0cmV0dXJuIHYxIDw9IHYyID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuXHRcdGNhc2UgJz4nOlxyXG5cdFx0XHRyZXR1cm4gdjEgPiB2MiA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcblx0XHRjYXNlICc+PSc6XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhbmRPckNoZWNrKHYxLCB2Miwgb3B0aW9ucywgb3BlcmF0b3IpIHtcclxuXHRcdHN3aXRjaCAob3BlcmF0b3IpIHtcclxuXHRcdGNhc2UgJyYmJzpcclxuXHRcdFx0cmV0dXJuIHYxICYmIHYyID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuXHRcdGNhc2UgJ3x8JzpcclxuXHRcdFx0cmV0dXJuIHYxIHx8IHYyID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRwbChpZCkge1xyXG5cdFx0cmV0dXJuIHRwbFtpZF07XHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdHJlZ2lzdGVySGVscGVyczogcmVnaXN0ZXJIZWxwZXJzLFxyXG5cdFx0Z2V0VHBsOiBnZXRUcGxcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHM7XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHR3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUudHlwZSkge1xyXG5cdFx0XHRcdHN3aXRjaCAoZXZlbnQuc3RhdGUudHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgJ3BhZ2VyJzpcclxuXHRcdFx0XHRcdGRlcC5nZW5lcmFsUGFnZXIuc2VuZFJlcXVlc3QoZXZlbnQuc3RhdGUucGFnZXJVcmwsIGV2ZW50LnN0YXRlLmN1cnJlbnRJbmRleCwgZXZlbnQuc3RhdGUudGVtcGxhdGVJZCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlICdkaXNjdXNzaW9uLWxpc3QnOlxyXG5cdFx0XHRcdFx0ZGVwLmRpc2N1c3Npb25zSGFuZGxpbmcuc2VuZFJlcXVlc3QoZXZlbnQuc3RhdGUuc29ydERhdGEsIHRydWUpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdGdlbmVyYWxQYWdlcjogcmVxdWlyZSgnLi9nZW5lcmFsLXBhZ2VyLWhhbmRsaW5nJyksXHJcblx0XHRkaXNjdXNzaW9uc0hhbmRsaW5nOiByZXF1aXJlKCcuL2Rpc2N1c3Npb24taGFuZGxpbmcnKVxyXG5cdH1cclxuKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8qIGVzbGludC1kaXNhYmxlICovXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdCRpZGVhQ29udGFpbmVyLFxyXG5cdFx0JHNlYXJjaFdyYXBwZXIsXHJcblx0XHQkb3ZlcmxheSxcclxuXHRcdGxvYWRlckNsYXNzLFxyXG5cdFx0bG9hZGVyVGlkLFxyXG5cdFx0bG9hZGVyRGVsYXkgPSAxNTAsXHJcblx0XHRzZXR0aW5ncyA9IHt9LFxyXG5cdFx0aGIsXHJcblx0XHRwcm9taXNlLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW47XHJcblx0LyogZXNsaW50LWVuYWJsZSAqL1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblxyXG5cdFx0bG9hZGVyQ2xhc3MgPSBkZXAuZ2VuZXJhbExvYWRlcjtcclxuXHRcdGhiID0gZGVwLmhhbmRsZWJhcnM7XHJcblxyXG5cdFx0aWYgKCRpZGVhQ29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0aW5pdFNldHRpbmdzKCk7XHJcblx0XHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdFx0XHRpbml0T3ZlcmxheUJpbmRpbmdzKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRzZWFyY2hXcmFwcGVyID0gJGJvZHkuZmluZCgnW2RhdGEtZ2VuZXJpYy1zZWFyY2hdJyk7XHJcblx0XHQkb3ZlcmxheSA9ICRib2R5LmZpbmQoJ1tkYXRhLW92ZXJsYXldJyk7XHJcblx0XHQkaWRlYUNvbnRhaW5lciA9ICQoJ1tkYXRhLWlkZWEtaGFuZGxlcl0nKTtcclxuXHRcdHZlcmlmaWNhdGlvblRva2VuID0gJGJvZHkuYXR0cignZGF0YS12ZXJpZmljYXRpb24tdG9rZW4nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRTZXR0aW5ncygpIHtcclxuXHRcdHNldHRpbmdzID0ge1xyXG5cdFx0XHRsaWtlRW5kcG9pbnQ6ICRpZGVhQ29udGFpbmVyLmF0dHIoJ2RhdGEtbGlrZS1zZXJ2aWNlLXVybCcpXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JGlkZWFDb250YWluZXIub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0b25JZGVhQWN0aW9uKCQoZS5jdXJyZW50VGFyZ2V0KSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1pZGVhLWFjdGlvbl0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRPdmVybGF5QmluZGluZ3MoKSB7XHJcblx0XHQkb3ZlcmxheS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHQkb3ZlcmxheS5yZW1vdmVDbGFzcygnc2hvdycpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtY2xvc2Utb3ZlcmxheV0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uSWRlYUFjdGlvbigkdGFyZ2V0KSB7XHJcblx0XHR2YXIgdHlwZSA9ICR0YXJnZXQuYXR0cignZGF0YS1pZGVhLWFjdGlvbicpO1xyXG5cclxuXHRcdHN3aXRjaCh0eXBlKSB7XHJcblx0XHRcdGNhc2UgJ2xpa2UnOlxyXG5cdFx0XHRcdGxpa2VJZGVhKCR0YXJnZXQpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdlZGl0JzpcclxuXHRcdFx0XHRjcmVhdGVPckVkaXRJZGVhKCR0YXJnZXQpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdyZW1vdmUnOlxyXG5cdFx0XHRcdHJlbW92ZUlkZWEoJHRhcmdldCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2NyZWF0ZSc6XHJcblx0XHRcdFx0Y3JlYXRlT3JFZGl0SWRlYSgkdGFyZ2V0KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGxpa2VJZGVhKCR0YXJnZXQpIHtcclxuXHRcdHZhciBkYXRhID0gJHRhcmdldC5hdHRyKCdkYXRhLWlkZWEtYWN0aW9uLWRhdGEnKSxcclxuXHRcdFx0JGFtb3VudCA9ICR0YXJnZXQuZmluZCgnc3BhbicpO1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uTGlrZVN1Y2Nlc3MoKSB7XHJcblx0XHRcdGlmICgkdGFyZ2V0Lmhhc0NsYXNzKCdkaXNjdXNzaW9uLWl0ZW1fX2xpa2UtLWxpa2VkJykpIHtcclxuXHRcdFx0XHQkdGFyZ2V0LnJlbW92ZUNsYXNzKCdkaXNjdXNzaW9uLWl0ZW1fX2xpa2UtLWxpa2VkJyk7XHJcblx0XHRcdFx0JGFtb3VudC50ZXh0KHBhcnNlSW50KCRhbW91bnQudGV4dCgpLCAxMCkgLSAxKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQkdGFyZ2V0LmFkZENsYXNzKCdkaXNjdXNzaW9uLWl0ZW1fX2xpa2UtLWxpa2VkJyk7XHJcblx0XHRcdFx0JGFtb3VudC50ZXh0KHBhcnNlSW50KCRhbW91bnQudGV4dCgpLCAxMCkgKyAxKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHNlbmRSZXF1ZXN0KHNldHRpbmdzLmxpa2VFbmRwb2ludCwgJ1BPU1QnLCBkYXRhLCBvbkxpa2VTdWNjZXNzLCBudWxsKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZU9yRWRpdElkZWEoJHRhcmdldCkge1xyXG5cdFx0dmFyIGRhdGEgPSBKU09OLnBhcnNlKCR0YXJnZXQuYXR0cignZGF0YS1pZGVhLWFjdGlvbi1kYXRhJykpLFxyXG5cdFx0XHQkZm9ybTtcclxuXHJcblx0XHRjb21waWxlT3ZlcmxheSgnZWRpdC1vdmVybGF5JywgZGF0YSk7XHJcblx0XHQkZm9ybSA9ICRvdmVybGF5LmZpbmQoJ1tkYXRhLWZvcm1dJyk7XHJcblx0XHRpbml0T3ZlcmxheUZvcm1CaW5kaW5ncygkZm9ybSwgJ2NyZWF0ZScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVtb3ZlSWRlYSgkdGFyZ2V0KSB7XHJcblx0XHR2YXIgZGF0YSA9IEpTT04ucGFyc2UoJHRhcmdldC5hdHRyKCdkYXRhLWlkZWEtYWN0aW9uLWRhdGEnKSksXHJcblx0XHRcdCRmb3JtO1xyXG5cclxuXHRcdGNvbXBpbGVPdmVybGF5KCdyZW1vdmUtb3ZlcmxheScsIGRhdGEpO1xyXG5cdFx0JGZvcm0gPSAkb3ZlcmxheS5maW5kKCdbZGF0YS1mb3JtXScpO1xyXG5cdFx0aW5pdE92ZXJsYXlGb3JtQmluZGluZ3MoJGZvcm0sICdyZW1vdmUnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRPdmVybGF5Rm9ybUJpbmRpbmdzKCRmb3JtLCB0eXBlKSB7XHJcblx0XHQkZm9ybS5vbih7XHJcblx0XHRcdCdmb3JtLXN1Y2Nlc3MnOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0Y2xvc2VPdmVybGF5KCk7XHJcblxyXG5cdFx0XHRcdGlmICh0eXBlID09PSAncmVtb3ZlJykge1xyXG5cdFx0XHRcdFx0JGlkZWFDb250YWluZXIuZmluZCgnW2RhdGEtaWRlYS1pZD1cIicgKyAkZm9ybS5maW5kKCdbbmFtZT1cIklkZWFJZFwiXScpLnZhbCgpICsgJ1wiXScpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpe1xyXG5cdFx0XHRcdFx0JHNlYXJjaFdyYXBwZXIudHJpZ2dlcignc2VuZC1yZXF1ZXN0Jyk7XHJcblx0XHRcdFx0fSwgNTAwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKCRmb3JtLmZpbmQoJ1ttYXhsZW5ndGhdJykubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQkZm9ybS5vbih7XHJcblx0XHRcdFx0a2V5dXA6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRsaW1pdElucHV0TGVuZ3RoKCQoZS5jdXJyZW50VGFyZ2V0KSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCAnW21heGxlbmd0aF0nKTtcclxuXHRcdFx0JGZvcm0uZmluZCgnW21heGxlbmd0aF0nKS50cmlnZ2VyKCdrZXl1cCcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gbGltaXRJbnB1dExlbmd0aCgkdGFyZ2V0KSB7XHJcblx0XHR2YXIgbWF4TGVuZ3RoID0gJHRhcmdldC5hdHRyKCdtYXhsZW5ndGgnKSxcclxuXHRcdFx0JHRpcDtcclxuXHJcblx0XHQkdGlwID0gJHRhcmdldC5jbG9zZXN0KCdbZGF0YS1mb3JtLWVsZW1lbnRdJykuZmluZCgnbGFiZWwgc3BhblttYXhsZW5ndGgtdGlwXScpO1xyXG5cdFx0JHRpcC50ZXh0KG1heExlbmd0aCAtICR0YXJnZXQudmFsKCkubGVuZ3RoKTtcclxuXHJcblx0XHRpZiAoJHRhcmdldC52YWwoKS5sZW5ndGggPj0gbWF4TGVuZ3RoKSB7XHJcblx0XHRcdCR0YXJnZXQudmFsKCR0YXJnZXQudmFsKCkuc3Vic3RyKDAsIG1heExlbmd0aCkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY29tcGlsZU92ZXJsYXkodHBsLCBkYXRhKSB7XHJcblx0XHQkb3ZlcmxheS5odG1sKGhiLmdldFRwbCh0cGwpKGRhdGEpKTtcclxuXHRcdCRvdmVybGF5LmFkZENsYXNzKCdzaG93Jyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbG9zZU92ZXJsYXkoKSB7XHJcblx0XHQkb3ZlcmxheS5yZW1vdmVDbGFzcygnc2hvdycpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2VuZFJlcXVlc3QodXJsLCBtZXRob2QsIGRhdGEsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xyXG5cdFx0aGlkZUxvYWRlcigpO1xyXG5cdFx0c2hvd0RlbGF5ZWRMb2FkZXIoKTtcclxuXHRcdGNsZWFyUGVuZGluZ1Byb21pc2UoKTtcclxuXHJcblx0XHRwcm9taXNlID0gJC5hamF4KHtcclxuXHRcdFx0dHlwZTogbWV0aG9kLFxyXG5cdFx0XHR1cmw6IHVybCxcclxuXHRcdFx0ZGF0YTogZGF0YSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4ocHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LklzU3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdHN1Y2Nlc3NDYWxsYmFjaygpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNsZWFyUGVuZGluZ1Byb21pc2UoKSB7XHJcblx0XHRpZiAocHJvbWlzZSAmJiBwcm9taXNlLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuXHRcdFx0cHJvbWlzZS5hYm9ydCgpO1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoaWRlTG9hZGVyKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KGxvYWRlclRpZCk7XHJcblx0XHRkZXAuZ2VuZXJhbExvYWRlci5oaWRlTG9hZGVyKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzaG93RGVsYXllZExvYWRlcigpIHtcclxuXHRcdGNsZWFyVGltZW91dChsb2FkZXJUaWQpO1xyXG5cdFx0bG9hZGVyVGlkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGxvYWRlckNsYXNzLnNob3dMb2FkZXIoKTtcclxuXHRcdH0sIGxvYWRlckRlbGF5KTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJyksXHJcblx0XHRoYW5kbGViYXJzOiByZXF1aXJlKCcuL2hhbmRsZWJhcnMtaGVscGVycycpLFxyXG5cdFx0Z2VuZXJhbExvYWRlcjogcmVxdWlyZSgnLi4vdmlld3MvZ2VuZXJhbC1sb2FkZXInKSxcclxuXHRcdGdlbmVyYWxGb3JtSGFuZGxpbmc6IHJlcXVpcmUoJy4vZ2VuZXJhbC1mb3JtLWhhbmRsaW5nJylcclxuXHR9XHJcbikpO1xyXG5cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkZG9jdW1lbnQsXHJcblx0XHQkY3JvcE92ZXJsYXksXHJcblx0XHQkY2FuY2VsQnRuLFxyXG5cdFx0JGNyb3BCdG4sXHJcblx0XHQkY2FudmFzLFxyXG5cdFx0JGNyb3BJbWFnZUNvbnRhaW5lcixcclxuXHRcdHNhdmVDcm9wcGVkSW1hZ2VTZXJ2aWNlLFxyXG5cdFx0dXBsb2FkSW1hZ2VTZXJ2aWNlLFxyXG5cdFx0bWV0aG9kLFxyXG5cdFx0JGZpbGVJbnB1dCxcclxuXHRcdCR1cGxvYWRDb250YWluZXIsXHJcblx0XHQkdXBsb2FkRXJyb3JNZXNzYWdlLFxyXG5cdFx0JGNyb3BFcnJvck1lc3NhZ2UsXHJcblx0XHQkaW1hZ2VQcmV2aWV3LFxyXG5cdFx0ZHJhZ2dlZENsYXNzID0gJ2RyYWctb3ZlcicsXHJcblx0XHRvdmVybGF5T3BlbmVkQ2xhc3MgPSAnc2hvdycsXHJcblx0XHQkcGhvdG9GaWVsZHNldCxcclxuXHRcdGVtYWlsQWRkcmVzcyxcclxuXHRcdFBJZCxcclxuXHRcdGxvYWRlclRpZCxcclxuXHRcdGxvYWRlckRlbGF5ID0gMTUwLFxyXG5cdFx0bG9hZGVyQ2xhc3MsXHJcblx0XHRpbWFnZUNyb3BTZXR0aW5ncyA9IHtcclxuXHRcdFx0d2lkdGg6IDI1MCxcclxuXHRcdFx0aGVpZ2h0OiAyNTBcclxuXHRcdH0sXHJcblx0XHRjb29yZGluYXRlcyA9IHt9LFxyXG5cdFx0YnV0dG9uc0hlaWdodCA9IDUxLFxyXG5cdFx0JHdpbmRvdyxcclxuXHRcdCR0b3BBdmF0YXIsXHJcblx0XHQkaW1hZ2VJZEZpZWxkLFxyXG5cdFx0JHNhdmVkSWRGaWVsZCxcclxuXHRcdHZlcmlmaWNhdGlvblRva2VuO1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0aWYgKCQoJ1tkYXRhLXVwbG9hZC1waG90b10nKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGxvYWRlckNsYXNzID0gZGVwLmdlbmVyYWxMb2FkZXI7XHJcblxyXG5cdFx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdFx0aW5pdFZhcmlhYmxlcygpO1xyXG5cdFx0XHRpbml0QmluZGluZ3MoKTtcclxuXHRcdFx0aW5pdEltYWdlVXBsb2FkKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcclxuXHRcdCRib2R5ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiRib2R5O1xyXG5cdFx0JHdpbmRvdyA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kd2luZG93O1xyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW4gPSAkYm9keS5hdHRyKCdkYXRhLXZlcmlmaWNhdGlvbi10b2tlbicpO1xyXG5cclxuXHRcdCRjcm9wT3ZlcmxheSA9ICQoJ1tkYXRhLWNyb3Atb3ZlcmxheV0nKTtcclxuXHRcdCRjYW5jZWxCdG4gPSAkY3JvcE92ZXJsYXkuZmluZCgnW2RhdGEtY2FuY2VsXScpO1xyXG5cdFx0JGNyb3BCdG4gPSAkY3JvcE92ZXJsYXkuZmluZCgnW2RhdGEtZG8tY3JvcF0nKTtcclxuXHRcdCRjcm9wSW1hZ2VDb250YWluZXIgPSAkY3JvcE92ZXJsYXkuZmluZCgnW2RhdGEtaW1hZ2UtY29udGFpbmVyXScpO1xyXG5cdFx0JGNhbnZhcyA9ICRjcm9wT3ZlcmxheS5maW5kKCdbZGF0YS1jcm9wLWNhbnZhc10nKVswXTtcclxuXHRcdCRjcm9wRXJyb3JNZXNzYWdlID0gJGNyb3BPdmVybGF5LmZpbmQoJ1tkYXRhLXNhdmUtY3JvcC1lcnJvcl0nKTtcclxuXHJcblx0XHQkZmlsZUlucHV0ID0gJCgnW2RhdGEtdXBsb2FkLXBob3RvXScpO1xyXG5cdFx0JHVwbG9hZENvbnRhaW5lciA9ICQoJ1tkYXRhLWRyYWctYXJlYV0nKTtcclxuXHJcblx0XHQkcGhvdG9GaWVsZHNldCA9ICQoJ1tkYXRhLWRyYWctYXJlYV0nKTtcclxuXHRcdCRpbWFnZVByZXZpZXcgPSAkKCcucHJvZmlsZV9faW1nIGltZycpO1xyXG5cdFx0JHVwbG9hZEVycm9yTWVzc2FnZSA9ICQoJ1tkYXRhLWltYWdlLXVwbG9hZC1lcnJvcl0nKTtcclxuXHRcdCR0b3BBdmF0YXIgPSAkKCcuaGVhZGVyX19hY2NvdW50IGltZycpO1xyXG5cdFx0JGltYWdlSWRGaWVsZCA9ICQoJyNJbWFnZUlkJyk7XHJcblx0XHQkc2F2ZWRJZEZpZWxkID0gJCgnI1NhdmVkSWQnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRWYXJpYWJsZXMoKSB7XHJcblx0XHRzYXZlQ3JvcHBlZEltYWdlU2VydmljZSA9ICRjcm9wT3ZlcmxheS5hdHRyKCdkYXRhLWNyb3Atb3ZlcmxheScpO1xyXG5cdFx0bWV0aG9kID0gJGNyb3BPdmVybGF5LmF0dHIoJ2RhdGEtbWV0aG9kJyk7XHJcblx0XHR1cGxvYWRJbWFnZVNlcnZpY2UgPSAkdXBsb2FkQ29udGFpbmVyLmF0dHIoJ2RhdGEtaW1hZ2Utc2VydmljZScpO1xyXG5cdFx0ZW1haWxBZGRyZXNzID0gJCgnW2RhdGEtdXNlci1lbWFpbF0nKS5sZW5ndGggPyAkKCdbZGF0YS11c2VyLWVtYWlsXScpLmZpbmQoJ3AnKS50ZXh0KCkudHJpbSgpIDogJCgnaW5wdXQjZW1haWxbdHlwZT1cImVtYWlsXCJdJykudmFsKCk7XHJcblx0XHRQSWQgPSAkKCdbZGF0YS1nbG9iYWxwcm9maWxlLWlkXScpLmRhdGEoJ2dsb2JhbHByb2ZpbGUtaWQnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHRcdCRkb2N1bWVudC5vbignZHJhZ292ZXInLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5kcm9wWm9uZVRpbWVvdXQ7XHJcblxyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRpZiAoIXRpbWVvdXQpIHtcclxuXHRcdFx0XHQkcGhvdG9GaWVsZHNldC5hZGRDbGFzcyhkcmFnZ2VkQ2xhc3MpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHdpbmRvdy5kcm9wWm9uZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHR3aW5kb3cuZHJvcFpvbmVUaW1lb3V0ID0gbnVsbDtcclxuXHRcdFx0XHQkcGhvdG9GaWVsZHNldC5yZW1vdmVDbGFzcyhkcmFnZ2VkQ2xhc3MpO1xyXG5cdFx0XHR9LCAxMDApO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0JGRvY3VtZW50Lm9uKCdkcm9wJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0dmFyIGRyb3BwZWRGaWxlcyA9IGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XHJcblxyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRpbml0SW1hZ2VVcGxvYWQoKTtcclxuXHJcblx0XHRcdCRmaWxlSW5wdXQuZmlsZXVwbG9hZCgnYWRkJywge1xyXG5cdFx0XHRcdGZpbGVzOiBkcm9wcGVkRmlsZXNcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQkY2FuY2VsQnRuLm9uKHtcclxuXHRcdFx0J2NsaWNrLmNsb3NlQ3JvcCc6IGNsb3NlXHJcblx0XHR9KTtcclxuXHJcblx0XHQkY3JvcEJ0bi5vbih7XHJcblx0XHRcdCdjbGljay5kQ3JvcCc6IGNyb3BcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEluaXRpYWxpemUgdGhlIGltYWdlIHVwbG9hZCBwbHVnaW4gaW5zdGFuY2UgZm9yIHRoZSBnYWxsZXJ5IGltYWdlc1xyXG5cdGZ1bmN0aW9uIGluaXRJbWFnZVVwbG9hZCgpIHtcclxuXHRcdCRmaWxlSW5wdXQuZmlsZXVwbG9hZCh7XHJcblx0XHRcdHVybDogdXBsb2FkSW1hZ2VTZXJ2aWNlLFxyXG5cdFx0XHRkcm9wWm9uZTogJHBob3RvRmllbGRzZXQsXHJcblx0XHRcdGNhbkRyYWc6IHRydWUsXHJcblx0XHRcdGRpc2FibGVWYWxpZGF0aW9uOiB0cnVlLFxyXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdGlmICghZGF0YS5yZXN1bHQuSXNTdWNjZXNzIHx8IGRhdGEucmVzdWx0Lkhhc0Vycm9ycykge1xyXG5cdFx0XHRcdFx0JHVwbG9hZEVycm9yTWVzc2FnZS50ZXh0KGRhdGEucmVzdWx0LkdlbmVyaWNFcnJvcik7XHJcblx0XHRcdFx0XHQkdXBsb2FkRXJyb3JNZXNzYWdlLnNob3coKTtcclxuXHRcdFx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdFx0XHRcdGlmIChkYXRhLlJlZGlyZWN0VXJsKSB7XHJcblx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZWRpcmVjdFVybDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aW1hZ2VDcm9wU2V0dGluZ3MuaW1hZ2UgPSBkYXRhLnJlc3VsdC5maWxlc1swXTtcclxuXHRcdFx0XHRcdHByZWxvYWRJbWFnZSgpO1xyXG5cdFx0XHRcdFx0c2V0U2l6ZSgpO1xyXG5cdFx0XHRcdFx0aW5zZXJ0SW1hZ2UoKTtcclxuXHRcdFx0XHRcdGluaXRKQ3JvcCgpO1xyXG5cdFx0XHRcdFx0b3BlbigpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuXHRcdFx0XHRpZiAoJHVwbG9hZEVycm9yTWVzc2FnZS5jc3MoJ2Rpc3BsYXknKSAhPT0gJ25vbmUnKSB7XHJcblx0XHRcdFx0XHQkdXBsb2FkRXJyb3JNZXNzYWdlLnNob3coKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0c2hvd0RlbGF5ZWRMb2FkZXIoKTtcclxuXHRcdFx0XHRkYXRhLnN1Ym1pdCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIEluc2V0IHRoZSBpbWFnZSB0byBiZSBjcm9wcGVkIGludG8gdGhlIGNyb3Atb3ZlcmxheVxyXG5cdGZ1bmN0aW9uIGluc2VydEltYWdlKCkge1xyXG5cdFx0JGNyb3BJbWFnZUNvbnRhaW5lci5odG1sKCc8aW1nIHNyYz1cIicgKyBpbWFnZUNyb3BTZXR0aW5ncy5pbWFnZS51cmwgKyAnXCIgZGF0YS1pbWFnZS10by1jcm9wPicpO1xyXG5cdH1cclxuXHJcblx0Ly8gQ2xvc2UgdGhlIGltYWdlIGNyb3BwZXIgb3ZlcmxheSBhbmQgcmVzZXQgdGhlIERPTSBlbGVtZW50cyB0byBvcmlnaW5hbCBzdGF0ZVxyXG5cdGZ1bmN0aW9uIGNsb3NlKCkge1xyXG5cdFx0cmVzZXRCdXR0b25zKCk7XHJcblx0XHQkY3JvcE92ZXJsYXkucmVtb3ZlQ2xhc3Mob3ZlcmxheU9wZW5lZENsYXNzKTtcclxuXHRcdCRjcm9wSW1hZ2VDb250YWluZXIuZW1wdHkoKTtcclxuXHRcdCRjcm9wSW1hZ2VDb250YWluZXIucmVtb3ZlQXR0cignc3R5bGUnKTtcclxuXHRcdHJlc2V0Q2FudmFzKCk7XHJcblx0fVxyXG5cclxuXHQvLyBQcmVsb2FkIHRoZSBpbWFnZSB0byBiZSBjcm9wcGVkXHJcblx0ZnVuY3Rpb24gcHJlbG9hZEltYWdlKCkge1xyXG5cdFx0dmFyIGltZyA9IG5ldyBJbWFnZSgpO1xyXG5cclxuXHRcdGltZy5zcmMgPSBpbWFnZUNyb3BTZXR0aW5ncy5pbWFnZS51cmw7XHJcblx0fVxyXG5cclxuXHQvLyBPcGVuIHRoZSBvdmVybGF5XHJcblx0ZnVuY3Rpb24gb3BlbigpIHtcclxuXHRcdHZhciBvdmVybGF5Q29udGVudEhlaWdodDtcclxuXHJcblx0XHRvdmVybGF5Q29udGVudEhlaWdodCA9ICRjcm9wSW1hZ2VDb250YWluZXIuaW5uZXJIZWlnaHQoKSArICRjcm9wT3ZlcmxheS5maW5kKCdbZGF0YS1idXR0b25zXScpLmlubmVySGVpZ2h0KCk7XHJcblx0XHQkY3JvcE92ZXJsYXkuZmluZCgnLm92ZXJsYXlfX2NvbnRlbnQnKS5jc3MoJ2hlaWdodCcsIG92ZXJsYXlDb250ZW50SGVpZ2h0KTtcclxuXHJcblx0XHQkY3JvcE92ZXJsYXkuYWRkQ2xhc3Mob3ZlcmxheU9wZW5lZENsYXNzKTtcclxuXHRcdGhpZGVMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1pbi9tYXggaGVpZ2h0L3dpZHRoIGZvciB0aGUgb3ZlcmxheSdzIGVsZW1lbnRzXHJcblx0ZnVuY3Rpb24gc2V0U2l6ZSgpIHtcclxuXHRcdHZhciBpbWFnZUggPSBwYXJzZUludChpbWFnZUNyb3BTZXR0aW5ncy5pbWFnZS5vcmlnaW5hbGhlaWdodCwgMTApLFxyXG5cdFx0XHRpbWFnZVcgPSBwYXJzZUludChpbWFnZUNyb3BTZXR0aW5ncy5pbWFnZS5vcmlnaW5hbHdpZHRoLCAxMCksXHJcblx0XHRcdHNjYWxlZFcsXHJcblx0XHRcdHNjYWxlZEgsXHJcblx0XHRcdHNldFcsXHJcblx0XHRcdHNldEgsXHJcblx0XHRcdHJhdGlvID0gaW1hZ2VXIC8gaW1hZ2VILFxyXG5cdFx0XHRyZXNpemVkSW1hZ2VXaWR0aCA9IDk4MCxcclxuXHRcdFx0cmVzaXplZEltYWdlSGVpZ2h0ID0gcmVzaXplZEltYWdlV2lkdGggLyByYXRpbyxcclxuXHRcdFx0d2luZG93UmF0aW8gPSAkd2luZG93LndpZHRoKCkgLyAkd2luZG93LmhlaWdodCgpLFxyXG5cdFx0XHRsYXJnZXJUaGFuU2NyZWVuID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHJlc2l6ZWRJbWFnZVdpZHRoID4gJHdpbmRvdy53aWR0aCgpIHx8IHJlc2l6ZWRJbWFnZUhlaWdodCArIGJ1dHRvbnNIZWlnaHQgPiAkd2luZG93LmhlaWdodCgpKSB7XHJcblx0XHRcdGxhcmdlclRoYW5TY3JlZW4gPSB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghbGFyZ2VyVGhhblNjcmVlbikge1xyXG5cdFx0XHRzZXRXID0gcmVzaXplZEltYWdlV2lkdGg7XHJcblx0XHRcdHNldEggPSByZXNpemVkSW1hZ2VIZWlnaHQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAocmF0aW8gPCB3aW5kb3dSYXRpbykge1xyXG5cdFx0XHRcdHNjYWxlZEggPSAkd2luZG93LmhlaWdodCgpIC8gMTAwICogOTAgLSBidXR0b25zSGVpZ2h0O1xyXG5cdFx0XHRcdHNjYWxlZFcgPSBzY2FsZWRIICogcmF0aW87XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2NhbGVkVyA9ICR3aW5kb3cud2lkdGgoKSAvIDEwMCAqIDkwO1xyXG5cdFx0XHRcdHNjYWxlZEggPSBzY2FsZWRXIC8gcmF0aW87XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNldFcgPSBzY2FsZWRXO1xyXG5cdFx0XHRzZXRIID0gc2NhbGVkSDtcclxuXHRcdH1cclxuXHJcblx0XHQkY3JvcEltYWdlQ29udGFpbmVyLmNzcygnd2lkdGgnLCBzZXRXICsgJ3B4Jyk7XHJcblx0XHQkY3JvcEltYWdlQ29udGFpbmVyLmNzcygnaGVpZ2h0Jywgc2V0SCArICdweCcpO1xyXG5cclxuXHRcdCRjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGltYWdlQ3JvcFNldHRpbmdzLndpZHRoKTtcclxuXHRcdCRjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBpbWFnZUNyb3BTZXR0aW5ncy5oZWlnaHQpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVzZXRDYW52YXMoKSB7XHJcblx0XHQkY2FudmFzLndpZHRoID0gJGNhbnZhcy53aWR0aDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRKQ3JvcCgpIHtcclxuXHRcdHZhciAkaW1hZ2UgPSAkY3JvcE92ZXJsYXkuZmluZCgnW2RhdGEtaW1hZ2UtdG8tY3JvcF0nKTtcclxuXHJcblx0XHQkdXBsb2FkRXJyb3JNZXNzYWdlLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblxyXG5cdFx0aWYgKCRpbWFnZS5sZW5ndGgpIHtcclxuXHRcdFx0JGltYWdlLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHZhciBzZXRTZWxlY3REaW1lbnNpb25zID0ge307XHJcblxyXG5cdFx0XHRcdGlmICgkY3JvcEltYWdlQ29udGFpbmVyLndpZHRoKCkgPCBpbWFnZUNyb3BTZXR0aW5ncy53aWR0aCkge1xyXG5cdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy53aWR0aCA9ICRjcm9wSW1hZ2VDb250YWluZXIud2lkdGgoKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy53aWR0aCA9IGltYWdlQ3JvcFNldHRpbmdzLndpZHRoO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCRjcm9wSW1hZ2VDb250YWluZXIuaGVpZ2h0KCkgPCBpbWFnZUNyb3BTZXR0aW5ncy5oZWlnaHQpIHtcclxuXHRcdFx0XHRcdHNldFNlbGVjdERpbWVuc2lvbnMuaGVpZ2h0ID0gJGNyb3BJbWFnZUNvbnRhaW5lci5oZWlnaHQoKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy5oZWlnaHQgPSBpbWFnZUNyb3BTZXR0aW5ncy5oZWlnaHQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzZXRTZWxlY3REaW1lbnNpb25zLnRvcCA9ICgkY3JvcEltYWdlQ29udGFpbmVyLmhlaWdodCgpIC0gaW1hZ2VDcm9wU2V0dGluZ3MuaGVpZ2h0KSAvIDI7XHJcblx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy5sZWZ0ID0gKCRjcm9wSW1hZ2VDb250YWluZXIud2lkdGgoKSAtIGltYWdlQ3JvcFNldHRpbmdzLndpZHRoKSAvIDI7XHJcblxyXG5cdFx0XHRcdC8qZXNsaW50LWRpc2FibGUgKi9cclxuXHRcdFx0XHQkaW1hZ2UuSmNyb3Aoe1xyXG5cdFx0XHRcdFx0YmdGYWRlOiB0cnVlLFxyXG5cdFx0XHRcdFx0YmdPcGFjaXR5OiAwLjIsXHJcblx0XHRcdFx0XHRzZXRTZWxlY3Q6IFtcclxuXHRcdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy53aWR0aCxcclxuXHRcdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy5oZWlnaHQsXHJcblx0XHRcdFx0XHRcdHNldFNlbGVjdERpbWVuc2lvbnMubGVmdCxcclxuXHRcdFx0XHRcdFx0c2V0U2VsZWN0RGltZW5zaW9ucy50b3BcclxuXHRcdFx0XHRcdF0sXHJcblx0XHRcdFx0XHRtaW5TaXplOiBbXHJcblx0XHRcdFx0XHRcdHNldFNlbGVjdERpbWVuc2lvbnMud2lkdGgsXHJcblx0XHRcdFx0XHRcdHNldFNlbGVjdERpbWVuc2lvbnMuaGVpZ2h0XHJcblx0XHRcdFx0XHRdLFxyXG5cdFx0XHRcdFx0YXNwZWN0UmF0aW86IDEsXHJcblx0XHRcdFx0XHRvblNlbGVjdDogc2V0Q29vcmRzXHJcblx0XHRcdFx0fSwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0d2luZG93Lmpjcm9wQXBpID0gdGhpcztcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHQvKmVzbGludC1lbmFibGUgKi9cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBEcmF3IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW1hZ2UgcGFydCB0byB0aGUgY2FudmFzLCBwcm9wb3J0aW9uYXRlbHkgcmVzaXplZFxyXG5cdGZ1bmN0aW9uIGRyYXdJbWFnZVRvQ2FudmFzKCkge1xyXG5cdFx0dmFyIGNvbnRleHQgPSAkY2FudmFzLmdldENvbnRleHQoJzJkJyksXHJcblx0XHRcdCRpbWcgPSAkKCdbZGF0YS1pbWFnZS10by1jcm9wXScpLFxyXG5cdFx0XHRpbWcgPSAkaW1nWzBdLFxyXG5cclxuXHRcdFx0aW1nVyA9IGltZy53aWR0aCA9PT0gMCA/ICRpbWcuYXR0cignd2lkdGgnKSA6IGltZy53aWR0aCxcclxuXHRcdFx0aW1nSCA9IGltZy5oZWlnaHQgPT09IDAgPyAkaW1nLmF0dHIoJ2hlaWdodCcpIDogaW1nLmhlaWdodCxcclxuXHJcblx0XHRcdHJhdGlvWSA9IGltZ0ggLyAkaW1nLmhlaWdodCgpLFxyXG5cdFx0XHRyYXRpb1ggPSBpbWdXIC8gJGltZy53aWR0aCgpLFxyXG5cclxuXHRcdFx0Z2V0WCA9IE1hdGguZmxvb3IoY29vcmRpbmF0ZXMueCAqIHJhdGlvWCksXHJcblx0XHRcdGdldFkgPSBNYXRoLmZsb29yKGNvb3JkaW5hdGVzLnkgKiByYXRpb1kpLFxyXG5cclxuXHRcdFx0Z2V0V2lkdGggPSBNYXRoLmZsb29yKGNvb3JkaW5hdGVzLncgKiByYXRpb1gpLFxyXG5cdFx0XHRnZXRIZWlnaHQgPSBNYXRoLmZsb29yKGNvb3JkaW5hdGVzLmggKiByYXRpb1kpO1xyXG5cclxuXHRcdGNvbnRleHQuZHJhd0ltYWdlKGltZywgZ2V0WCwgZ2V0WSwgZ2V0V2lkdGgsIGdldEhlaWdodCwgMCwgMCwgaW1hZ2VDcm9wU2V0dGluZ3Mud2lkdGgsIGltYWdlQ3JvcFNldHRpbmdzLmhlaWdodCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRDYW52YXNEYXRhKCkge1xyXG5cdFx0dmFyIHJldDtcclxuXHJcblx0XHRpZiAoJGNhbnZhcykge1xyXG5cdFx0XHRyZXQgPSAkY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDEuMCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH1cclxuXHJcblx0Ly8gU2VuZCB0aGUgYmFzZTY0IGNhbnZhcyBkYXRhIHRvIHRoZSBzZXJ2ZXIgZm9yIHNhdmluZyB0aGUgaW1hZ2UgZmlsZVxyXG5cdGZ1bmN0aW9uIHNlbmRJbWFnZURhdGEoKSB7XHJcblx0XHR2YXIgaW1hZ2VEYXRhID0gZ2V0Q2FudmFzRGF0YSgpO1xyXG5cclxuXHRcdHNob3dEZWxheWVkTG9hZGVyKCk7XHJcblxyXG5cdFx0aWYgKCRjcm9wRXJyb3JNZXNzYWdlLmNzcygnZGlzcGxheScpICE9PSAnbm9uZScpIHtcclxuXHRcdFx0JGNyb3BFcnJvck1lc3NhZ2UuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdH1cclxuXHJcblx0XHQkY3JvcEJ0bi5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xyXG5cdFx0JGNhbmNlbEJ0bi5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xyXG5cclxuXHRcdCQuYWpheCh7XHJcblx0XHRcdHVybDogc2F2ZUNyb3BwZWRJbWFnZVNlcnZpY2UsXHJcblx0XHRcdHR5cGU6IG1ldGhvZCxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0Y2FjaGU6IGZhbHNlLFxyXG5cdFx0XHRoZWFkZXJzOiB7XHJcblx0XHRcdFx0X19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46IHZlcmlmaWNhdGlvblRva2VuXHJcblx0XHRcdH0sXHJcblx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRJbWFnZUlkOiBpbWFnZUNyb3BTZXR0aW5ncy5pbWFnZS5pZCxcclxuXHRcdFx0XHRCYXNlVmFsdWU6IGltYWdlRGF0YSxcclxuXHRcdFx0XHRFbWFpbDogZW1haWxBZGRyZXNzLFxyXG5cdFx0XHRcdFBJZDogUElkXHJcblx0XHRcdH0pXHJcblx0XHR9KS5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdFx0aWYgKGRhdGEuSXNTdWNjZXNzKSB7XHJcblxyXG5cclxuXHRcdFx0XHRoYW5kbGVDcm9wU3VjY2VzcyhkYXRhKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoZGF0YS5HZW5lcmljRXJyb3IpIHtcclxuXHRcdFx0XHRcdHNob3dDcm9wRXJyb3IoZGF0YS5HZW5lcmljRXJyb3IpO1xyXG5cdFx0XHRcdFx0cmVzZXRCdXR0b25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChkYXRhLlJlc3BvbnNlTWVzc2FnZSkge1xyXG5cdFx0XHRcdFx0c2hvd0Nyb3BFcnJvcihkYXRhLlJlc3BvbnNlTWVzc2FnZSk7XHJcblx0XHRcdFx0XHRyZXNldEJ1dHRvbnMoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGRhdGEuUmVkaXJlY3RVcmwpIHtcclxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZWRpcmVjdFVybDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRoaWRlTG9hZGVyKCk7XHJcblx0XHRcdGNsb3NlKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIEhhbmRsZXIgZm9yIHRoZSBzdWNjZXNzZnVsIEFKQVggY2FsbGJhY2sgb2YgdGhlIHNhdmVkIGNyb3BwZWQgcHJvZmlsZXBpY1xyXG5cdGZ1bmN0aW9uIGhhbmRsZUNyb3BTdWNjZXNzKGRhdGEpIHtcclxuXHRcdCRpbWFnZVByZXZpZXcuYXR0cignc3JjJywgZGF0YS5JbWFnZVVybCk7XHJcblxyXG5cdFx0Y29uc29sZS5sb2coJGJvZHkuZmluZCgnLnJlZ2lzdHJhdGlvbi1mb3JtJykubGVuZ3RoKTtcclxuXHJcblx0XHRpZiAoISRib2R5LmZpbmQoJy5yZWdpc3RyYXRpb24tZm9ybScpLmxlbmd0aCkge1xyXG5cdFx0XHQkdG9wQXZhdGFyLmF0dHIoJ3NyY3NldCcsICcnKTtcclxuXHRcdFx0JHRvcEF2YXRhci5hdHRyKCdzcmMnLCBkYXRhLkltYWdlVXJsKTtcclxuXHRcdH1cclxuXHJcblx0XHQkc2F2ZWRJZEZpZWxkLnZhbChkYXRhLlNhdmVkSWQpO1xyXG5cdFx0JGltYWdlSWRGaWVsZC52YWwoZGF0YS5JbWFnZUlkKTtcclxuXHRcdGNsb3NlKCk7XHJcblx0fVxyXG5cclxuXHQvLyBTaG93IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBvdmVybGF5XHJcblx0ZnVuY3Rpb24gc2hvd0Nyb3BFcnJvcih0ZXh0KSB7XHJcblx0XHQkY3JvcEVycm9yTWVzc2FnZS50ZXh0KHRleHQpO1xyXG5cdFx0JGNyb3BFcnJvck1lc3NhZ2UuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZXNldEJ1dHRvbnMoKSB7XHJcblx0XHQkY3JvcEJ0bi5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuXHRcdCRjYW5jZWxCdG4uYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XHJcblx0fVxyXG5cclxuXHQvLyBIYW5kbGVyIGZvciB0aGUgY3JvcCBidXR0b24gLSBjYWxsIGRyYXdJbWFnZVRvQ2FudmFzIGFuZCBzZW5kSW1hZ2VEYXRhXHJcblx0ZnVuY3Rpb24gY3JvcCgpIHtcclxuXHRcdGRyYXdJbWFnZVRvQ2FudmFzKCk7XHJcblx0XHRzZW5kSW1hZ2VEYXRhKCk7XHJcblx0fVxyXG5cclxuXHQvLyBTZXQgYWxsIGNvb3JkcyAob25TZWxlY3QgY2FsbGJhY2sgZm9yIHRoZSBpbWFnZSBjcm9wcGVyKSwgc3RvcmVzIHRoZSBjb29yZHMgaW4gZ2xvYmFsIHZhcnNcclxuXHRmdW5jdGlvbiBzZXRDb29yZHMoYykge1xyXG5cdFx0Y29vcmRpbmF0ZXMueCA9IGMueDtcclxuXHRcdGNvb3JkaW5hdGVzLnkgPSBjLnk7XHJcblx0XHRjb29yZGluYXRlcy54MiA9IGMueDI7XHJcblx0XHRjb29yZGluYXRlcy55MiA9IGMueTI7XHJcblx0XHRjb29yZGluYXRlcy53ID0gYy53O1xyXG5cdFx0Y29vcmRpbmF0ZXMuaCA9IGMuaDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhpZGVMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGRlcC5nZW5lcmFsTG9hZGVyLmhpZGVMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dEZWxheWVkTG9hZGVyKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KGxvYWRlclRpZCk7XHJcblx0XHRsb2FkZXJUaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0bG9hZGVyQ2xhc3Muc2hvd0xvYWRlcigpO1xyXG5cdFx0fSwgbG9hZGVyRGVsYXkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKSxcclxuXHRcdGdlbmVyYWxMb2FkZXI6IHJlcXVpcmUoJy4uL3ZpZXdzL2dlbmVyYWwtbG9hZGVyJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHM7XHJcblxyXG5cdGZ1bmN0aW9uIEFwcExpbmtlZGluQ29ubmVjdChzZXR0aW5ncykge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IHtcclxuXHRcdFx0d2luZG93OiB7XHJcblx0XHRcdFx0dzogNjkwLFxyXG5cdFx0XHRcdGg6IDYwMFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzZXJ2aWNlVXJsOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgJy9hcGkvc3RyZWFtL3Byb2ZpbGUvbGlua2VkaW4nXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuQXBwUGVyZm9ybWFuY2UgPSBkZXAucGVyZm9ybWFuY2U7XHJcblxyXG5cdFx0LyogZXNsaW50IG5ldy1jYXA6IDAgKi9cclxuXHRcdHRoaXMuJHByb21pc2UgPSBuZXcgJC5EZWZlcnJlZCgpO1xyXG5cclxuXHRcdCQuZXh0ZW5kKHRoaXMuc2V0dGluZ3MsIHNldHRpbmdzKTtcclxuXHJcblx0XHR0aGlzLmRlc3Ryb3lDYWxsYmFjaygpO1xyXG5cdFx0dGhpcy5jcmVhdGVDYWxsYmFjaygpO1xyXG5cdFx0dGhpcy5vcGVuV2luZG93KCk7XHJcblx0fVxyXG5cclxuXHRBcHBMaW5rZWRpbkNvbm5lY3QucHJvdG90eXBlLmNyZWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XHJcblx0XHR3aW5kb3cubGlua2VkaW5BdXRoID0gdGhpcy5saW5rZWRpbkF1dGguYmluZCh0aGlzKTtcclxuXHR9O1xyXG5cclxuXHRBcHBMaW5rZWRpbkNvbm5lY3QucHJvdG90eXBlLmxpbmtlZGluQXV0aCA9IGZ1bmN0aW9uKGFjdGlvbiwgY29kZSwgc3RhdGUpIHtcclxuXHRcdHRoaXMuc2VydmljZURhdGEgPSB7XHJcblx0XHRcdGFjdGlvbjogYWN0aW9uLFxyXG5cdFx0XHRjb2RlOiBjb2RlLFxyXG5cdFx0XHRzdGF0ZTogc3RhdGVcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5sb2FkU2VydmljZSh0aGlzLnNldHRpbmdzLnNlcnZpY2VVcmwpO1xyXG5cdFx0dGhpcy5kZXN0cm95Q2FsbGJhY2soKTtcclxuXHR9O1xyXG5cclxuXHRBcHBMaW5rZWRpbkNvbm5lY3QucHJvdG90eXBlLm9wZW5XaW5kb3cgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciB0b3AgPSB0aGlzLkFwcFBlcmZvcm1hbmNlLmdldERldmljZVByb3BlcnRpZXMoKS53aW5kb3cuaCAvIDIgLSB0aGlzLnNldHRpbmdzLndpbmRvdy5oIC8gMixcclxuXHRcdFx0bGVmdCA9IHRoaXMuQXBwUGVyZm9ybWFuY2UuZ2V0RGV2aWNlUHJvcGVydGllcygpLndpbmRvdy53IC8gMiAtIHRoaXMuc2V0dGluZ3Mud2luZG93LncgLyAyO1xyXG5cclxuXHRcdHdpbmRvdy5vcGVuKHRoaXMuc2V0dGluZ3MudXJsLCAnX2xpbmtlZGluQXV0aFdpbicsICdoZWlnaHQ9JyArIHRoaXMuc2V0dGluZ3Mud2luZG93LmggK1xyXG5cdFx0XHQnLHdpZHRoPScgKyB0aGlzLnNldHRpbmdzLndpbmRvdy53ICsgJyxzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEsdGl0bGViYXI9MSx0b29sYmFyPTAsbWVudWJhcj0wLHRvcD0nICsgdG9wICsgJyxsZWZ0PScgKyBsZWZ0KTtcclxuXHJcblx0fTtcclxuXHJcblx0QXBwTGlua2VkaW5Db25uZWN0LnByb3RvdHlwZS5kZXN0cm95Q2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcclxuXHRcdHdpbmRvdy5saW5rZWRpbkF1dGggPSBudWxsO1xyXG5cdH07XHJcblxyXG5cdEFwcExpbmtlZGluQ29ubmVjdC5wcm90b3R5cGUubG9hZFNlcnZpY2UgPSBmdW5jdGlvbih1cmwpIHtcclxuXHRcdCQuYWpheCh7XHJcblx0XHRcdHVybDogdXJsLFxyXG5cdFx0XHR0eXBlOiAncG9zdCcsXHJcblx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmljZURhdGEpLFxyXG5cdFx0XHRjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxyXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRjYWNoZTogZmFsc2VcclxuXHRcdH0pLnRoZW4odGhpcy4kcHJvbWlzZS5yZXNvbHZlLCB0aGlzLiRwcm9taXNlLnJlamVjdCk7XHJcblxyXG5cdFx0dGhpcy5zZXJ2aWNlRGF0YSA9IG51bGw7XHJcblx0fTtcclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdEFwcExpbmtlZGluQ29ubmVjdDogQXBwTGlua2VkaW5Db25uZWN0XHJcblx0fTtcclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKVxyXG5cdH1cclxuKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBBcHBMaW5rZWRpbkNvbm5lY3QsXHJcblx0XHRleHBvcnRzLFxyXG5cdFx0JGJvZHksXHJcblx0XHQkaW5wdXRMaW5rZWRJblByb2ZpbGVMaW5rLFxyXG5cdFx0bGlua2VkaW5Vcmw7XHJcblxyXG5cdEFwcExpbmtlZGluQ29ubmVjdCA9IGRlcC5saW5rZWRpbkNvbm5lY3QuQXBwTGlua2VkaW5Db25uZWN0O1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRpbml0QmluZGluZ3MoKTtcclxuXHRcdGluaXRWYXJpYWJsZXMoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRET01FbGVtZW50cygpIHtcclxuXHRcdCRib2R5ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiRib2R5O1xyXG5cdFx0JGlucHV0TGlua2VkSW5Qcm9maWxlTGluayA9ICQoJyNMaW5rZWRJbicpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFZhcmlhYmxlcygpIHtcclxuXHRcdGxpbmtlZGluVXJsID0gJCgnW2RhdGEtbGlua2VkaW4tdXJsXScpLmRhdGEoJ2xpbmtlZGluLXVybCcpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGltcG9ydEZyb21MaW5rZWRpbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtbGlua2VkaW4taW1wb3J0XScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW1wb3J0RnJvbUxpbmtlZGluKCkge1xyXG5cdFx0dmFyIGNvbm5lY3Rpb24gPSBuZXcgQXBwTGlua2VkaW5Db25uZWN0KHtcclxuXHRcdFx0XHR1cmw6IGxpbmtlZGluVXJsXHJcblx0XHRcdH0pLFxyXG5cdFx0XHQkcGFyZW50Rm9ybUVsZW1lbnQgPSAkKCdbZGF0YS1mb3JtLWVsZW1lbnQ9XCJMaW5rZWRJblwiXScpLFxyXG5cdFx0XHRlcnJvckNsYXNzID0gJ2Zvcm0tZWxlbWVudC0taGFzLWVycm9yJztcclxuXHJcblx0XHRjb25uZWN0aW9uLiRwcm9taXNlLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xyXG5cdFx0XHRpZiAoZGF0YS5QdWJsaWNVcmwpIHtcclxuXHRcdFx0XHQkcGFyZW50Rm9ybUVsZW1lbnQucmVtb3ZlQ2xhc3MoZXJyb3JDbGFzcyk7XHJcblx0XHRcdFx0JGlucHV0TGlua2VkSW5Qcm9maWxlTGluay52YWwoZGF0YS5QdWJsaWNVcmwpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCRwYXJlbnRGb3JtRWxlbWVudC5hZGRDbGFzcyhlcnJvckNsYXNzKTtcclxuXHRcdFx0XHQkaW5wdXRMaW5rZWRJblByb2ZpbGVMaW5rLnZhbCgnJyk7XHJcblx0XHRcdFx0JGlucHV0TGlua2VkSW5Qcm9maWxlTGluay5uZXh0KCcuZm9ybS1lbGVtZW50X19lcnJvcicpLnRleHQoJ0Vycm9yIGdldHRpbmcgTGlua2VkSW4gcHJvZmlsZSBsaW5rLCB0cnkgdHlwaW5nIGl0IGluJyk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJyksXHJcblx0XHRsaW5rZWRpbkNvbm5lY3Q6IHJlcXVpcmUoJy4vbGlua2VkaW4tY29ubmVjdCcpXHJcblx0fVxyXG4pKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHRyZXNpemVUaWQsXHJcblx0XHQkY2FjaGVkRE9NLFxyXG5cdFx0ZGV2aWNlUHJvcGVydGllcztcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGluaXRDYWNoZURPTSgpO1xyXG5cdFx0aW5pdEJpbmRpbmdzKCk7XHJcblx0XHRpbml0VG91Y2goKTtcclxuXHRcdHNhdmVEZXZpY2VQcm9wZXJ0aWVzKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0Q2FjaGVET00oKSB7XHJcblx0XHQkY2FjaGVkRE9NID0ge1xyXG5cdFx0XHR3aW5kb3c6IHdpbmRvdyxcclxuXHRcdFx0JHdpbmRvdzogJCh3aW5kb3cpLFxyXG5cdFx0XHQkYm9keTogJChkb2N1bWVudC5ib2R5KSxcclxuXHRcdFx0JGh0bWw6ICQoJ2h0bWwnKSxcclxuXHRcdFx0JGhlYWQ6ICQoJ2hlYWQnKSxcclxuXHRcdFx0JGh0bWxib2R5OiAkKCdodG1sLCBib2R5JylcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0VG91Y2goKSB7XHJcblx0XHRpZiAoJ3RvdWNoQWN0aW9uJyBpbiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7XHJcblx0XHRcdGRvY3VtZW50LmJvZHkuc3R5bGUudG91Y2hBY3Rpb24gPSAnbWFuaXB1bGF0aW9uJztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdEZhc3RDbGljay5hdHRhY2goZG9jdW1lbnQuYm9keSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0Q2FjaGVkRG9tKCkge1xyXG5cdFx0cmV0dXJuICRjYWNoZWRET007XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXREZXZpY2VQcm9wZXJ0aWVzKCkge1xyXG5cdFx0cmV0dXJuIGRldmljZVByb3BlcnRpZXM7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHQkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dChyZXNpemVUaWQpO1xyXG5cdFx0XHRyZXNpemVUaWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0c2F2ZURldmljZVByb3BlcnRpZXMoKTtcclxuXHRcdFx0fSwgMjUwKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2F2ZURldmljZVByb3BlcnRpZXMoKSB7XHJcblx0XHR2YXIgdyA9IHdpbmRvdyxcclxuXHRcdFx0ZCA9IGRvY3VtZW50LFxyXG5cdFx0XHRlID0gZC5kb2N1bWVudEVsZW1lbnQsXHJcblx0XHRcdGcgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0sXHJcblx0XHRcdFcgPSB3LmlubmVyV2lkdGggfHwgZS5jbGllbnRXaWR0aCB8fCBnLmNsaWVudFdpZHRoLFxyXG5cdFx0XHRIID0gdy5pbm5lckhlaWdodCB8fCBlLmNsaWVudEhlaWdodCB8fCBnLmNsaWVudEhlaWdodDtcclxuXHJcblx0XHRkZXZpY2VQcm9wZXJ0aWVzID0ge1xyXG5cdFx0XHRjb25uZWN0aW9uOiBuYXZpZ2F0b3IuY29ubmVjdGlvbiA/IG5hdmlnYXRvci5jb25uZWN0aW9uIDogJ3Vua25vd24nLFxyXG5cdFx0XHRwaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcclxuXHRcdFx0d2luZG93OiB7XHJcblx0XHRcdFx0d2lkdGg6IFcsXHJcblx0XHRcdFx0aGVpZ2h0OiBIXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRpbml0Q2FjaGVET006IGluaXRDYWNoZURPTSxcclxuXHRcdGdldENhY2hlZERvbTogZ2V0Q2FjaGVkRG9tLFxyXG5cdFx0Z2V0RGV2aWNlUHJvcGVydGllczogZ2V0RGV2aWNlUHJvcGVydGllc1xyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge1xyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdGluaXRDYWNoZURPTTogaW5pdENhY2hlRE9NLFxyXG5cdFx0c2F2ZURldmljZVByb3BlcnRpZXM6IHNhdmVEZXZpY2VQcm9wZXJ0aWVzLFxyXG5cdFx0Z2V0Q2FjaGVkRG9tOiBnZXRDYWNoZWREb20sXHJcblx0XHRnZXREZXZpY2VQcm9wZXJ0aWVzOiBnZXREZXZpY2VQcm9wZXJ0aWVzXHJcblx0fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufSgpKTtcclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzLFxyXG5cdFx0c2xpZGVUb0NsYXNzZXMsXHJcblx0XHQkYm9keTtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHJcblx0XHRzbGlkZVRvQ2xhc3NlcyA9IEFycmF5LmFwcGx5KDAsIG5ldyBBcnJheSgyMCkpLm1hcChmdW5jdGlvbiAoeCwgeSkge1xyXG5cdFx0XHRyZXR1cm4gJ3NsaWRlLXRvLScgKyBwYXJzZUludCh5ICsgMSwgMTApO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRjaGVja0ZvclF1b3RlcygpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjaGVja0ZvclF1b3RlcygpIHtcclxuXHRcdCRib2R5LmZpbmQoJ1tkYXRhLXF1b3Rlc10nKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aW5pdFF1b3RlcygkKHRoaXMpKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFF1b3Rlcygkb2JqKSB7XHJcblx0XHR2YXIgJHdyYXBwZXIgPSAkb2JqLFxyXG5cdFx0XHRwYXJhbXMsXHJcblx0XHRcdHF1b3Rlc0RhdGE7XHJcblxyXG5cdFx0aWYgKCR3cmFwcGVyLmRhdGEoJ3F1b3Rlc0RhdGEnKSA9PT0gdW5kZWZpbmVkKSB7XHJcblxyXG5cdFx0XHRwYXJhbXMgPSAkd3JhcHBlciAmJiAkd3JhcHBlci5hdHRyKCdkYXRhLXF1b3RlcycpICYmICR3cmFwcGVyLmF0dHIoJ2RhdGEtcXVvdGVzJykuc3BsaXQoJzonKTtcclxuXHJcblx0XHRcdHF1b3Rlc0RhdGEgPSB7fTtcclxuXHRcdFx0cXVvdGVzRGF0YS5jdXJyZW50SW5kZXggPSAxO1xyXG5cdFx0XHRxdW90ZXNEYXRhLnRpZCA9IDA7XHJcblx0XHRcdHF1b3Rlc0RhdGEuYXV0byA9IHBhcmFtc1swXSAmJiBwYXJhbXNbMF0gPT09ICdhdXRvJyB8fCBmYWxzZTtcclxuXHRcdFx0cXVvdGVzRGF0YS5kZWxheSA9IHBhcmFtc1sxXSB8fCA1MDAwO1xyXG5cdFx0XHRxdW90ZXNEYXRhLmxvb3AgPSBwYXJhbXNbMl0gJiYgcGFyYW1zWzJdID09PSAnbG9vcCcgfHwgZmFsc2U7XHJcblxyXG5cdFx0XHQkd3JhcHBlci5kYXRhKHtxdW90ZXNEYXRhOiBxdW90ZXNEYXRhfSk7XHJcblxyXG5cdFx0XHR1cGRhdGVRdW90ZXMoJHdyYXBwZXIpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVRdW90ZXMoJG9iaikge1xyXG5cdFx0dmFyIHF1b3Rlc0RhdGEgPSAkb2JqLmRhdGEoJ3F1b3Rlc0RhdGEnKSxcclxuXHRcdFx0JHdyYXBwZXIgPSAkb2JqLFxyXG5cdFx0XHQkc291cmNlcyA9ICR3cmFwcGVyLmZpbmQoJ1tkYXRhLXF1b3Rlcy1zb3VyY2VzXScpLFxyXG5cdFx0XHQkc2xpZGVzID0gJHdyYXBwZXIuZmluZCgnW2RhdGEtcXVvdGVzLXNsaWRlc10nKSxcclxuXHRcdFx0Y3VycmVudEluZGV4ID0gcXVvdGVzRGF0YS5jdXJyZW50SW5kZXg7XHJcblxyXG5cdFx0JHNvdXJjZXMuZmluZCgndWwgbGknKS5yZW1vdmVDbGFzcygnYWN0aXZlJykuZXEoY3VycmVudEluZGV4IC0gMSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0JHNsaWRlcy5yZW1vdmVDbGFzcyhzbGlkZVRvQ2xhc3Nlcy5qb2luKCcgJykpLmFkZENsYXNzKCdzbGlkZS10by0nICsgY3VycmVudEluZGV4KTtcclxuXHJcblx0XHRxdW90ZXNEYXRhLmN1cnJlbnRJbmRleCA9IHF1b3Rlc0RhdGEuY3VycmVudEluZGV4ID4gJHNsaWRlcy5maW5kKCd1bCBsaScpLmxlbmd0aCAtIDEgPyAxIDogY3VycmVudEluZGV4ICsgMTtcclxuXHJcblx0XHQkd3JhcHBlci5kYXRhKHtxdW90ZXNEYXRhOiBxdW90ZXNEYXRhfSk7XHJcblxyXG5cdFx0d2luZG93LmNsZWFyUmVxdWVzdFRpbWVvdXQocXVvdGVzRGF0YS50aWQpO1xyXG5cdFx0cXVvdGVzRGF0YS50aWQgPSB3aW5kb3cucmVxdWVzdFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHR1cGRhdGVRdW90ZXMoJHdyYXBwZXIpO1xyXG5cdFx0fSwgcXVvdGVzRGF0YS5kZWxheSk7XHJcblxyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkd2luZG93LFxyXG5cdFx0JGJvZHksXHJcblx0XHRzZXJ2aWNlVVJMLFxyXG5cdFx0JG1hc29ucnlHcmlkLFxyXG5cdFx0JG1hbnNvcnlJdGVtLFxyXG5cdFx0JGFydGljbGVzUHJvbWlzZSxcclxuXHRcdHBhZ2VOdW1iZXIsXHJcblx0XHRyZXN1bHREYXRhID0ge30sXHJcblx0XHRoYixcclxuXHRcdGxvYWRlckNsYXNzLFxyXG5cdFx0bG9hZGVyVGlkLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW4sXHJcblx0XHRsb2FkZXJEZWxheSA9IDE1MCxcclxuXHRcdHJlYWR5ID0gdHJ1ZTtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGlmICgkKCdbZGF0YS1yZXN1bHQtcGFnZV0nKS5sZW5ndGgpIHtcclxuXHRcdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRcdGluaXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdFx0aW5pdE1hc29ucnlHcmlkKCk7XHJcblxyXG5cdFx0XHRsb2FkZXJDbGFzcyA9IGRlcC5nZW5lcmFsTG9hZGVyO1xyXG5cdFx0XHRoYiA9IGRlcC5oYW5kbGViYXJzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkd2luZG93ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiR3aW5kb3c7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRtYXNvbnJ5R3JpZCA9ICRib2R5LmZpbmQoJ1tkYXRhLW1hc29ucnktYmxvY2tdJyk7XHJcblx0XHQkbWFuc29yeUl0ZW0gPSAkbWFzb25yeUdyaWQuZmluZCgnW2RhdGEtbWFzb25yeS1pdGVtXScpO1xyXG5cdFx0c2VydmljZVVSTCA9ICRtYXNvbnJ5R3JpZC5hdHRyKCdkYXRhLXNlcnZpY2UtdXJsJyk7XHJcblx0XHRwYWdlTnVtYmVyID0gJG1hc29ucnlHcmlkLmF0dHIoJ2RhdGEtaWQtcGFnZScpO1xyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW4gPSAkYm9keS5hdHRyKCdkYXRhLXZlcmlmaWNhdGlvbi10b2tlbicpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JHdpbmRvdy5vbih7XHJcblx0XHRcdHNjcm9sbDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c2Nyb2xsaW5nKCk7XHJcblx0XHRcdH0sXHJcblx0XHRcdHJlc2l6ZTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGluaXRNYXNvbnJ5R3JpZCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNjcm9sbGluZygpe1xyXG5cdFx0dmFyIGN1cnJlbnRIZWlnaHQgPSAkKGRvY3VtZW50KS5oZWlnaHQoKSAtIDUwLFxyXG5cdFx0XHR3aW5kb3dIZWlnaHQgPSAkd2luZG93LnNjcm9sbFRvcCgpICsgJHdpbmRvdy5oZWlnaHQoKTtcclxuXHJcblx0XHRpZih3aW5kb3dIZWlnaHQgPj0gY3VycmVudEhlaWdodCAmJiByZWFkeSA9PT0gdHJ1ZSl7XHJcblx0XHRcdHJlYWR5ID0gZmFsc2U7XHJcblx0XHRcdCQodGhpcykudW5iaW5kKCdzY3JvbGwnKTtcclxuXHRcdFx0c2VuZFJlcXVlc3QoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRNYXNvbnJ5R3JpZCgpIHtcclxuXHRcdGlmKCR3aW5kb3cub3V0ZXJXaWR0aCgpID4gNzY5ICkge1xyXG5cdFx0XHRpZigkbWFuc29yeUl0ZW0ubGVuZ3RoKSB7XHJcblx0XHRcdFx0JG1hc29ucnlHcmlkLmlzb3RvcGUoe1xyXG5cdFx0XHRcdFx0bGF5b3V0TW9kZTogJ3BhY2tlcnknLFxyXG5cclxuXHRcdFx0XHRcdGl0ZW1TZWxlY3RvcjogJy5icmFuZC1pdGVtc19faXRlbScsXHJcblx0XHRcdFx0XHRwZXJjZW50UG9zaXRpb246IHRydWVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0JG1hc29ucnlHcmlkLmlzb3RvcGUoKS5pc290b3BlKCdkZXN0cm95Jyk7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHRmdW5jdGlvbiB1cGRhdGVNYXNvbnJ5R3JpZChpdGVtc0hUTUwpIHtcclxuXHRcdHZhciAkaXRlbXMgPSAkKGl0ZW1zSFRNTCk7XHJcblxyXG5cdFx0aWYoJHdpbmRvdy5vdXRlcldpZHRoKCkgPiA3NjkgKSB7XHJcblx0XHRcdGlmKCRtYW5zb3J5SXRlbS5sZW5ndGgpIHtcclxuXHRcdFx0XHQkbWFzb25yeUdyaWQuYXBwZW5kKCRpdGVtcylcclxuXHRcdFx0XHRcdC5pc290b3BlKHtcclxuXHRcdFx0XHRcdFx0bGF5b3V0TW9kZTogJ3BhY2tlcnknLFxyXG5cclxuXHRcdFx0XHRcdFx0aXRlbVNlbGVjdG9yOiAnLmJyYW5kLWl0ZW1zX19pdGVtJyxcclxuXHRcdFx0XHRcdFx0cGVyY2VudFBvc2l0aW9uOiB0cnVlXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0Lmlzb3RvcGUoJ2FwcGVuZGVkJywgJGl0ZW1zKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0JG1hc29ucnlHcmlkLmFwcGVuZCgkaXRlbXMpXHJcblx0XHRcdFx0Lmlzb3RvcGUoe1xyXG5cdFx0XHRcdFx0bGF5b3V0TW9kZTogJ3BhY2tlcnknLFxyXG5cclxuXHRcdFx0XHRcdGl0ZW1TZWxlY3RvcjogJy5icmFuZC1pdGVtc19faXRlbScsXHJcblx0XHRcdFx0XHRwZXJjZW50UG9zaXRpb246IHRydWVcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5pc290b3BlKCdhcHBlbmRlZCcsICRpdGVtcykuaXNvdG9wZSgnZGVzdHJveScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaGlkZUxvYWRlcigpIHtcclxuXHRcdGNsZWFyVGltZW91dChsb2FkZXJUaWQpO1xyXG5cdFx0ZGVwLmdlbmVyYWxMb2FkZXIuaGlkZUxvYWRlcigpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2hvd0RlbGF5ZWRMb2FkZXIoKSB7XHJcblx0XHRjbGVhclRpbWVvdXQobG9hZGVyVGlkKTtcclxuXHRcdGxvYWRlclRpZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRsb2FkZXJDbGFzcy5zaG93TG9hZGVyKCk7XHJcblx0XHR9LCBsb2FkZXJEZWxheSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZW5kUmVxdWVzdCgpIHtcclxuXHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdHNob3dEZWxheWVkTG9hZGVyKCk7XHJcblx0XHRyZXN1bHREYXRhID0gJ1BhZ2VOdW1iZXI9JyArIHBhZ2VOdW1iZXI7XHJcblxyXG5cdFx0JGFydGljbGVzUHJvbWlzZSA9ICQuYWpheCh7XHJcblx0XHRcdHR5cGU6ICdnZXQnLFxyXG5cdFx0XHR1cmw6IHNlcnZpY2VVUkwsXHJcblx0XHRcdGRhdGE6IHJlc3VsdERhdGEsXHJcblx0XHRcdHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuXHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkLndoZW4oJGFydGljbGVzUHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHJcblxyXG5cdFx0XHRpZiAoIHJlc3VsdCAmJiByZXN1bHQuSXNTdWNjZXNzID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHR1cGRhdGVNYXNvbnJ5R3JpZChoYi5nZXRUcGwoJ3Jlc3VsdC1wYWdlLWl0ZW0nKShyZXN1bHQpKTtcclxuXHRcdFx0XHRpZihyZXN1bHQuSGFzTmV4dCkge1xyXG5cdFx0XHRcdFx0JHdpbmRvdy5vbignc2Nyb2xsJywgc2Nyb2xsaW5nKTtcclxuXHRcdFx0XHRcdHBhZ2VOdW1iZXIgPSByZXN1bHQuUGFnZU51bWJlcjtcclxuXHRcdFx0XHRcdHJlYWR5ID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGhpZGVMb2FkZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRzZW5kUmVxdWVzdDogc2VuZFJlcXVlc3RcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKSxcclxuXHRcdGhhbmRsZWJhcnM6IHJlcXVpcmUoJy4vaGFuZGxlYmFycy1oZWxwZXJzJyksXHJcblx0XHRnZW5lcmFsTG9hZGVyOiByZXF1aXJlKCcuLi92aWV3cy9nZW5lcmFsLWxvYWRlcicpXHJcblx0fVxyXG4pKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdGxpbmtlZGluVXJsLFxyXG5cdFx0aWRlYVVybCxcclxuXHRcdGlkZWFUaXRsZSxcclxuXHRcdGlkZWFEZXNjcmlwdGlvbixcclxuXHRcdHRpdGxlQXJyYXksXHJcblx0XHR0d2l0dGVyVXNlcjtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGNoZWNrU29jaWFsTWVkaWEoKTtcclxuXHRcdGluaXRET01FbGVtZW50cygpO1xyXG5cdFx0aW5pdEJpbmRpbmdzKCk7XHJcblxyXG5cdFx0bGlua2VkaW5VcmwgPSAnaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3NoYXJlQXJ0aWNsZT8nO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QmluZGluZ3MoKSB7XHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0aWRlYVVybCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1pZGVhXScpLmF0dHIoJ2RhdGEtaWRlYS11cmwnKTtcclxuXHRcdFx0XHRpZGVhVGl0bGUgPSAkKGUuY3VycmVudFRhcmdldCkuY2xvc2VzdCgnW2RhdGEtaWRlYV0nKS5maW5kKCdbZGF0YS1pZGVhLXRpdGxlXScpLnRleHQoKTtcclxuXHRcdFx0XHRpZGVhRGVzY3JpcHRpb24gPSAkKGUuY3VycmVudFRhcmdldCkuY2xvc2VzdCgnW2RhdGEtaWRlYV0nKS5maW5kKCdbZGF0YS1pZGVhLWRlc2NyaXB0aW9uXScpLnRleHQoKTtcclxuXHRcdFx0XHR0d2l0dGVyVXNlciA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1pZGVhXScpLmF0dHIoJ2RhdGEtaWRlYS10d2l0dGVyLXVzZXInKTtcclxuXHRcdFx0XHR0aXRsZUFycmF5ID0gaWRlYVRpdGxlLnNwbGl0KCd8Jyk7XHJcblx0XHRcdFx0aWRlYVRpdGxlID0gdGl0bGVBcnJheVswXTtcclxuXHJcblx0XHRcdFx0aWYodHdpdHRlclVzZXIubGVuZ3RoID09PSAxKSB7XHJcblx0XHRcdFx0XHR0d2l0dGVyVXNlciA9ICcnO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYoJChlLmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtc29jaWFsLXNoYXJlJykgPT09ICd0d2l0dGVyJykge1xyXG5cdFx0XHRcdFx0dHdpdHRlclNoYXJlKGlkZWFUaXRsZSArICcgR3JlYXQgaWRlYSBmcm9tICcgKyB0d2l0dGVyVXNlciArICcgI3dwcHN0cmVhbScsIGlkZWFVcmwpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoJChlLmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtc29jaWFsLXNoYXJlJykgPT09ICdsaW5rZWRpbicpIHtcclxuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdocmVmJywgbGlua2VkaW5VcmwgKyAnbWluaT10cnVlJnVybD0nICsgaWRlYVVybCArICcmdGl0bGU9JyArIGlkZWFUaXRsZSArICcmc3VtbWFyeT0nICsgaWRlYURlc2NyaXB0aW9uICsgJyZzb3VyY2U9V1BQU3RyZWFtJyk7XHJcblx0XHRcdFx0XHR3aW5kb3cub3BlbigkKGUuY3VycmVudFRhcmdldCkuYXR0cignaHJlZicpLCAnbGlua2VkaW53aW5kb3cnLCAnbGVmdD0yMCx0b3A9MjAsd2lkdGg9MzAwLGhlaWdodD0zMDAsdG9vbGJhcj0wLHJlc2l6YWJsZT0xJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtc29jaWFsLXNoYXJlXScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdHdpdHRlclNoYXJlKHR3ZWV0LCB1cmwpIHtcclxuXHRcdHZhciBlc2NhcGVkVHdlZXQgPSBlbmNvZGVVUklDb21wb25lbnQodHdlZXQpLFxyXG5cdFx0XHRlc2NhcGVkVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHVybCksXHJcblx0XHRcdHdpZHRoID0gNTc1LFxyXG5cdFx0XHRoZWlnaHQgPSA0MDAsXHJcblx0XHRcdGxlZnQgPSAoJCh3aW5kb3cpLndpZHRoKCkgLSB3aWR0aCkgLyAyLFxyXG5cdFx0XHR0b3AgPSAoJCh3aW5kb3cpLmhlaWdodCgpIC0gaGVpZ2h0KSAvIDIsXHJcblx0XHRcdHNoYXJlVXJsLFxyXG5cdFx0XHRvcHRzO1xyXG5cclxuXHRcdHNoYXJlVXJsID0gJ2h0dHA6Ly90d2l0dGVyLmNvbS9zaGFyZT90ZXh0PScgKyBlc2NhcGVkVHdlZXQgKyAnJnVybD0nICsgZXNjYXBlZFVybDtcclxuXHRcdG9wdHMgPSAnc3RhdHVzPTEnICtcclxuXHRcdFx0Jyx3aWR0aD0nICsgd2lkdGggK1xyXG5cdFx0XHQnLGhlaWdodD0nICsgaGVpZ2h0ICtcclxuXHRcdFx0Jyx0b3A9JyArIHRvcCArXHJcblx0XHRcdCcsbGVmdD0nICsgbGVmdDtcclxuXHJcblx0XHR3aW5kb3cub3BlbihzaGFyZVVybCwgJ3R3aXR0ZXInLCBvcHRzKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNoZWNrU29jaWFsTWVkaWEoKSB7XHJcblx0XHR2YXIgdHdCdXR0b24gPSAkKCdbZGF0YS1zb2NpYWwtc2hhcmU9XCJ0d2l0dGVyXCJdJyksXHJcblx0XHRcdGxpQnV0dG9uID0gJCgnW2RhdGEtc29jaWFsLXNoYXJlPVwibGlua2VkaW5cIl0nKTtcclxuXHJcblx0XHRpZiAodHdCdXR0b24gIT09IG51bGwpIHtcclxuXHRcdFx0bG9hZFR3aXR0ZXIoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGlCdXR0b24gIT09IG51bGwpIHtcclxuXHRcdFx0bG9hZExpbmtlZGluKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsb2FkTGlua2VkaW4oKSB7XHJcblx0XHR2YXIgc3JjID0gJy8vcGxhdGZvcm0ubGlua2VkaW4uY29tL2luLmpzP2FzeW5jPXRydWUnLFxyXG5cdFx0XHRqcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXSxcclxuXHRcdFx0bGlTY3JpcHQxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksXHJcblx0XHRcdGxpU2NyaXB0MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG5cclxuXHRcdGxpU2NyaXB0MS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNyYyk7XHJcblx0XHRsaVNjcmlwdDIuc2V0QXR0cmlidXRlKCd0eXBlJywgJ0lOL1NoYXJlJyk7XHJcblx0XHRqcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsaVNjcmlwdDEsIGpzKTtcclxuXHRcdGpzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxpU2NyaXB0MiwganMpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gbG9hZFR3aXR0ZXIoKSB7XHJcblx0XHR3aW5kb3cudHd0dHIgPSAoZnVuY3Rpb24gKGQsIHMsIGlkKSB7XHJcblx0XHRcdHZhciBqcywgZmpzID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKVswXSxcclxuXHRcdFx0XHR0ID0gd2luZG93LnR3dHRyIHx8IHt9O1xyXG5cclxuXHRcdFx0aWYgKGQuZ2V0RWxlbWVudEJ5SWQoaWQpKSB7XHJcblx0XHRcdFx0cmV0dXJuIHQ7XHJcblx0XHRcdH1cclxuXHRcdFx0anMgPSBkLmNyZWF0ZUVsZW1lbnQocyk7XHJcblx0XHRcdGpzLmlkID0gaWQ7XHJcblx0XHRcdGpzLnNyYyA9ICcvL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMnO1xyXG5cdFx0XHRmanMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoanMsIGZqcyk7XHJcblx0XHRcdHQuX2UgPSBbXTtcclxuXHRcdFx0dC5yZWFkeSA9IGZ1bmN0aW9uIChmKSB7XHJcblx0XHRcdFx0dC5fZS5wdXNoKGYpO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmV0dXJuIHQ7XHJcblx0XHR9KGRvY3VtZW50LCAnc2NyaXB0JywgJ3R3aXR0ZXItd2pzJykpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuL3BlcmZvcm1hbmNlJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkYm9keSxcclxuXHRcdHNldHRpbmdzLFxyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW47XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHQkYm9keSA9IG51bGw7XHJcblx0XHRzZXR0aW5ncyA9IHtcclxuXHRcdFx0c3ZnVXJsOiAnL2kvc3ByaXRlL3Nwcml0ZS1hcHAuc3ZnJ1xyXG5cdFx0fTtcclxuXHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGNoZWNrQXNzZXRSb290KCk7XHJcblx0XHRsb2FkU3ZnKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdHZlcmlmaWNhdGlvblRva2VuID0gJGJvZHkuYXR0cignZGF0YS12ZXJpZmljYXRpb24tdG9rZW4nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNoZWNrQXNzZXRSb290KCkge1xyXG5cdFx0aWYgKCRib2R5ICYmICRib2R5LmF0dHIoJ2RhdGEtc3ByaXRlLXVybCcpICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0c2V0dGluZ3Muc3ZnVXJsID0gJGJvZHkuYXR0cignZGF0YS1zcHJpdGUtdXJsJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsb2FkU3ZnKCkge1xyXG5cdFx0dmFyICRwcm9taXNlID0gJC5hamF4KHtcclxuXHRcdFx0dHlwZTogJ0dFVCcsXHJcblx0XHRcdHVybDogc2V0dGluZ3Muc3ZnVXJsLFxyXG5cdFx0XHRkYXRhVHlwZTogJ2h0bWwnLFxyXG5cdFx0XHRjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxyXG5cdFx0XHRoZWFkZXJzOiB7XHJcblx0XHRcdFx0X19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46IHZlcmlmaWNhdGlvblRva2VuXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdCQud2hlbigkcHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblx0XHRcdGFkZFNwcml0ZVRvRE9NKHJlc3VsdCk7XHJcblx0XHR9LCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCclYyBbTW9kdWxlIC0gU1ZHXSAtIFNwcml0ZSBTVkcgY2FuXFwndCBiZSBsb2FkZWQ6ICVzICcsICdiYWNrZ3JvdW5kOiAjZWE0MTE4OyBjb2xvcjogI2ZmZicsIHNldHRpbmdzLnN2Z1VybCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFkZFNwcml0ZVRvRE9NKHNwcml0ZSkge1xyXG5cdFx0JGJvZHkuZmluZCgnW2RhdGEtc3Znc3ByaXRlXScpLnJlbW92ZSgpO1xyXG5cdFx0JGJvZHkuYXBwZW5kKCc8ZGl2IGNsYXNzPVwiYmxvY2stLWRpc3BsYXktbm9uZVwiIGRhdGEtc3Znc3ByaXRlPicgKyBzcHJpdGUgKyAnPC9kaXY+Jyk7XHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdFxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge1xyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdGxvYWRTdmc6IGxvYWRTdmcsXHJcblx0XHRpbml0RE9NRWxlbWVudHM6IGluaXRET01FbGVtZW50cyxcclxuXHRcdGFkZFNwcml0ZVRvRE9NOiBhZGRTcHJpdGVUb0RPTVxyXG5cdH07XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKVxyXG5cdH1cclxuKSk7XHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoZGVwKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdCRib2R5LFxyXG5cdFx0dGFyZ2V0cyA9IFtdLFxyXG5cdFx0cGxheWVycyA9IFtdO1xyXG5cclxuXHQvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5cdGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0T2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKHRhcmdldCkge1xyXG5cdFx0XHQndXNlIHN0cmljdCc7XHJcblx0XHRcdGlmICh0YXJnZXQgPT0gbnVsbCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0YXJnZXQgPSBPYmplY3QodGFyZ2V0KTtcclxuXHRcdFx0Zm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcclxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcclxuXHRcdFx0XHRpZiAoc291cmNlICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcclxuXHRcdFx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcclxuXHRcdFx0XHRcdFx0XHR0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0YXJnZXQ7XHJcblx0XHR9O1xyXG5cdH1cclxuXHQvKiBlc2xpbnQtZW5hYmxlICovXHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHJcblx0XHRpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGluamVjdFlUU2NyaXB0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbmplY3RZVFNjcmlwdCgpIHtcclxuXHRcdHZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSxcclxuXHRcdFx0Zmlyc3RTY3JpcHRUYWc7XHJcblxyXG5cdFx0Zmlyc3RTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XHJcblx0Ly9cdHRhZy5zcmMgPSAnLy93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XHJcblx0XHR0YWcuc3JjID0gJy9XUFBTdHJlYW0vanMvbGlicy95dF9hcGkuanMnO1xyXG5cdFx0Zmlyc3RTY3JpcHRUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFnLCBmaXJzdFNjcmlwdFRhZyk7XHJcblxyXG5cdFx0d2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5ID0gb25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRib2R5LmZpbmQoJ1tkYXRhLXZpZGVvLXBsYXllcl0nKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dGFyZ2V0cy5wdXNoKCQodGhpcykpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSgpIHtcclxuXHRcdHZhciBwbGF5ZXIsXHJcblx0XHRcdHZpZGVvSWQ7XHJcblxyXG5cdFx0JC5lYWNoKHRhcmdldHMsIGZ1bmN0aW9uIChrLCB2KSB7XHJcblx0XHRcdHZhciBwbGF5ZXJWYXJzID0ge3JlbDogMCwgaXZfbG9hZF9wb2xpY3k6IDN9O1xyXG5cclxuXHRcdFx0dmlkZW9JZCA9IHYuYXR0cignZGF0YS12aWRlby1wbGF5ZXInKTtcclxuXHRcdFx0aWYodi5hdHRyKCdkYXRhLXNldHRpbmdzJykgJiYgdi5hdHRyKCdkYXRhLXNldHRpbmdzJykubGVuZ3RoKSB7XHJcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihwbGF5ZXJWYXJzLCBKU09OLnBhcnNlKHYuYXR0cignZGF0YS1zZXR0aW5ncycpKSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cGxheWVyID0gbmV3IFlULlBsYXllcih2WzBdLCB7XHJcblx0XHRcdFx0d2lkdGg6IHZbMF0uY2xpZW50V2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiB2WzBdLmNsaWVudEhlaWdodCxcclxuXHRcdFx0XHR2aWRlb0lkOiB2aWRlb0lkLFxyXG5cdFx0XHRcdHRpdGxlOiAnJyxcclxuXHRcdFx0XHRwbGF5ZXJWYXJzOiBwbGF5ZXJWYXJzLFxyXG5cdFx0XHRcdGV2ZW50czoge1xyXG5cdFx0XHRcdFx0b25SZWFkeTogZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdFx0XHRcdHBsYXllclJlYWR5KGV2ZW50KTtcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0XHRcdFx0cGxheWVyU3RhdGVDaGFuZ2UoZXZlbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdHBsYXllcnMucHVzaChwbGF5ZXIpO1xyXG5cclxuXHRcdFx0JGJvZHkuZmluZCgnW2RhdGEtdmlkZW8tY292ZXJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCQodGhpcykuYXR0cignZGF0YS12aWRlby1jb3ZlcicpID09PSB2aWRlb0lkKSB7XHJcblx0XHRcdFx0XHRwbGF5ZXIucGxheVZpZGVvKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdCRib2R5LmZpbmQoJ1tkYXRhLXZpZGVvLWF1dG9wbGF5XScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICgkKHRoaXMpLmF0dHIoJ2RhdGEtdmlkZW8tYXV0b3BsYXknKSA9PT0gdmlkZW9JZCkge1xyXG5cdFx0XHRcdFx0cGxheWVyLnBsYXlWaWRlbygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwbGF5ZXJSZWFkeShldmVudCkge1xyXG5cdFx0dmFyIHZpZGVvRGF0YSA9IGV2ZW50LnRhcmdldC5nZXRWaWRlb0RhdGEoKSxcclxuXHRcdFx0JGF1dG9QbGF5ID0gJGJvZHkuZmluZCgnW2RhdGEtdmlkZW8tYXV0b3BsYXk9XCInICsgdmlkZW9EYXRhLnZpZGVvX2lkICsgJ1wiXScpO1xyXG5cclxuXHRcdGlmICgkYXV0b1BsYXkubGVuZ3RoKSB7XHJcblx0XHRcdCRhdXRvUGxheS5jbGljaygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcGxheWVyU3RhdGVDaGFuZ2UoZXZlbnQpIHtcclxuXHRcdHZhciB2aWRlb0RhdGEgPSBldmVudC50YXJnZXQuZ2V0VmlkZW9EYXRhKCksXHJcblx0XHRcdHN0YXRlID0gZXZlbnQuZGF0YSxcclxuXHRcdFx0JGNvdmVyO1xyXG5cclxuXHRcdGlmICh2aWRlb0RhdGEgJiYgdmlkZW9EYXRhLnZpZGVvX2lkKSB7XHJcblx0XHRcdCRjb3ZlciA9ICRib2R5LmZpbmQoJ1tkYXRhLXZpZGVvLWNvdmVyPVwiJyArIHZpZGVvRGF0YS52aWRlb19pZCArICdcIl0nKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoJGNvdmVyLmxlbmd0aCA+IDApIHtcclxuXHJcblx0XHRcdGlmIChzdGF0ZSAhPT0gMCkge1xyXG5cdFx0XHRcdGRlcC5hbmFseXRpY3MudHJhY2tFdmVudCgnVmlkZW8nLCAnUGxheScpO1xyXG5cdFx0XHRcdCRjb3Zlci5hZGRDbGFzcygnaGlkZScpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCRjb3Zlci5yZW1vdmVDbGFzcygnaGlkZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi4vdXRpbHMvcGVyZm9ybWFuY2UnKSxcclxuXHRcdGFuYWx5dGljczogcmVxdWlyZSgnLi9hbmFseXRpY3MnKVxyXG5cdH1cclxuKSk7XHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoZGVwKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdCRib2R5LFxyXG5cdFx0Q2Fyb3VzZWwsXHJcblx0XHR0bXA7XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGxhenlMb2FkSW1hZ2VzKCk7XHJcblx0XHQkYm9keS5maW5kKCdbZGF0YS1ib3gtY2Fyb3VzZWxdJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRtcCA9IG5ldyBDYXJvdXNlbCgkKHRoaXMpKTtcclxuXHRcdFx0Y29uc29sZS5sb2codG1wKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsYXp5TG9hZEltYWdlcygpIHtcclxuXHRcdFtdLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbWdbZGF0YS1zcmNdJyksIGZ1bmN0aW9uKGltZykge1xyXG5cdFx0XHRpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpKTtcclxuXHRcdFx0aW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc3JjJyk7XHJcblx0XHRcdH07XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdENhcm91c2VsID0gZnVuY3Rpb24gKCRjYXJvdXNlbCkge1xyXG5cdFx0dmFyIGFjdHVhbFN0ZXAgPSAwLFxyXG5cdFx0XHRpdGVtQ291bnQsXHJcblx0XHRcdCRib3hDYXJvdXNlbEl0ZW0sXHJcblx0XHRcdGJveENhcm91c2VsVGltZXI7XHJcblxyXG5cclxuXHRcdGZ1bmN0aW9uIGluaXRCb3hDYXJvdXNlbCgpIHtcclxuXHJcblx0XHRcdCRib3hDYXJvdXNlbEl0ZW0gPSAkY2Fyb3VzZWwuZmluZCgnW2RhdGEtYm94LWNhcm91c2VsLWl0ZW1dJyk7XHJcblx0XHRcdGJveENhcm91c2VsVGltZXIgPSAkY2Fyb3VzZWwuYXR0cignZGF0YS1ib3gtY2Fyb3VzZWwtdGltZXInKTtcclxuXHJcblx0XHRcdGl0ZW1Db3VudCA9ICRib3hDYXJvdXNlbEl0ZW0ubGVuZ3RoO1xyXG5cclxuXHRcdFx0YWN0dWFsU3RlcCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpdGVtQ291bnQgLSAxKSkgKyAxO1xyXG5cdFx0XHRpZihpdGVtQ291bnQgPiAxKSB7XHJcblx0XHRcdFx0JGJveENhcm91c2VsSXRlbS5lcShhY3R1YWxTdGVwKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JGJveENhcm91c2VsSXRlbS5lcSgwKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0JGNhcm91c2VsLmFkZENsYXNzKCdyZWFkeScpO1xyXG5cdFx0XHR9LCA4KTtcclxuXHJcblx0XHRcdGlmKGl0ZW1Db3VudCA+IDEpIHtcclxuXHRcdFx0XHRhbmltYXRlQm94Q2Fyb3VzZWwoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBhbmltYXRlQm94Q2Fyb3VzZWwoKSB7XHJcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGlmIChhY3R1YWxTdGVwIDwgaXRlbUNvdW50IC0gMSkge1xyXG5cdFx0XHRcdFx0YWN0dWFsU3RlcCsrO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhY3R1YWxTdGVwID0gMDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0JGNhcm91c2VsLmZpbmQoJy5hY3RpdmUnKS5hZGRDbGFzcygnb3V0Jyk7XHJcblx0XHRcdFx0JGJveENhcm91c2VsSXRlbS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdFx0JGJveENhcm91c2VsSXRlbS5lcShhY3R1YWxTdGVwKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdFx0YW5pbWF0ZUJveENhcm91c2VsKCk7XHJcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHQkY2Fyb3VzZWwuZmluZCgnLm91dCcpLnJlbW92ZUNsYXNzKCdvdXQnKTtcclxuXHRcdFx0XHR9LCAzMDAwKTtcclxuXHRcdFx0fSwgYm94Q2Fyb3VzZWxUaW1lcik7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluaXRCb3hDYXJvdXNlbCgpO1xyXG5cclxuXHR9O1xyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdFxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vLi4vdXRpbHMvcGVyZm9ybWFuY2UnKVxyXG5cdH1cclxuKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHR2YXIgJGJvZHksXHJcblx0XHQkZ2FsbGVyeSxcclxuXHRcdGhiLFxyXG5cdFx0JGhiV3JhcHBlcixcclxuXHRcdCRoYk92ZXJsYXlXcmFwcGVyLFxyXG5cdFx0JGdhbGxlcnlPdmVybGF5LFxyXG5cdFx0dGFyZ2V0VVJMO1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRpbml0QmluZGluZ3MoKTtcclxuXHJcblx0XHRpZiAoJGdhbGxlcnkubGVuZ3RoICYmIHdpbmRvdy5waG90b3MpIHtcclxuXHRcdFx0aGIgPSBkZXAuaGFuZGxlYmFycztcclxuXHRcdFx0JGhiV3JhcHBlciA9ICRib2R5LmZpbmQoJ1tkYXRhLWhiLXdyYXBwZXI9XCJnYWxsZXJ5LWl0ZW1cIl0nKTtcclxuXHRcdFx0JGhiT3ZlcmxheVdyYXBwZXIgPSAkYm9keS5maW5kKCdbZGF0YS1oYi13cmFwcGVyPVwiZ2FsbGVyeS1vdmVybGF5XCJdJyk7XHJcblx0XHRcdGhhbmRsZUdhbGxlcnlTb3VyY2VzKCk7XHJcblx0XHRcdGxvYWRJbWFnZXMoKTtcclxuXHRcdFx0c2V0dXBEZW5zaXR5KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0RE9NRWxlbWVudHMoKSB7XHJcblx0XHQkd2luZG93ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiR3aW5kb3c7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRnYWxsZXJ5ID0gJGJvZHkuZmluZCgnW2RhdGEtZ2FsbGVyeV0nKTtcclxuXHRcdCRnYWxsZXJ5T3ZlcmxheSA9ICRib2R5LmZpbmQoJ1tkYXRhLWdhbGxlcnktb3ZlcmxheV0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0dGFyZ2V0VVJMID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycpO1xyXG5cdFx0XHRcdGhhbmRsZU92ZXJsYXkodGFyZ2V0VVJMKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLWdhbGxlcnktaXRlbV0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGlmKCFpc0dhbGxlcnlTbGlkZXNob3dBY3RpdmUoKSkge1xyXG5cdFx0XHRcdFx0dGFyZ2V0VVJMID0gJChlLmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtb3ZlcmxheS1uZXh0LXVybCcpO1xyXG5cdFx0XHRcdFx0aGFuZGxlT3ZlcmxheSh0YXJnZXRVUkwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLW92ZXJsYXktbmV4dC11cmxdJyk7XHJcblxyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRpZighaXNHYWxsZXJ5U2xpZGVzaG93QWN0aXZlKCkpIHtcclxuXHRcdFx0XHRcdHRhcmdldFVSTCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLW92ZXJsYXktcHJldi11cmwnKTtcclxuXHRcdFx0XHRcdGhhbmRsZU92ZXJsYXkodGFyZ2V0VVJMKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1vdmVybGF5LXByZXYtdXJsXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHQkZ2FsbGVyeU92ZXJsYXkucmVtb3ZlQ2xhc3MoJ2dhbGxlcnktb3ZlcmxheS0tc2xpZGVzaG93Jyk7XHJcblx0XHRcdFx0JGdhbGxlcnlPdmVybGF5LnJlbW92ZUF0dHIoJ2RhdGEtZ2FsbGVyeS1zbGlkZXNob3cnKTtcclxuXHRcdFx0XHRjbG9zZUdhbGxlcnlPdmVybGF5KCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1nYWxsZXJ5LWNsb3NlXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHQkZ2FsbGVyeU92ZXJsYXkuYWRkQ2xhc3MoJ2dhbGxlcnktb3ZlcmxheS0tc2xpZGVzaG93Jyk7XHJcblx0XHRcdFx0JGdhbGxlcnlPdmVybGF5LmF0dHIoJ2RhdGEtZ2FsbGVyeS1zbGlkZXNob3cnLCA1MDAwKTtcclxuXHRcdFx0XHRoYW5kbGVPdmVybGF5KCRnYWxsZXJ5T3ZlcmxheS5maW5kKCdbZGF0YS1vdmVybGF5LW5leHQtdXJsXScpLmF0dHIoJ2RhdGEtb3ZlcmxheS1uZXh0LXVybCcpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLW92ZXJsYXktc2xpZGVzaG93PVwicGxheVwiXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHQkZ2FsbGVyeU92ZXJsYXkucmVtb3ZlQ2xhc3MoJ2dhbGxlcnktb3ZlcmxheS0tc2xpZGVzaG93Jyk7XHJcblx0XHRcdFx0JGdhbGxlcnlPdmVybGF5LnJlbW92ZUF0dHIoJ2RhdGEtZ2FsbGVyeS1zbGlkZXNob3cnKTtcclxuXHRcdFx0XHRoYW5kbGVPdmVybGF5KCRnYWxsZXJ5T3ZlcmxheS5maW5kKCdbZGF0YS1vdmVybGF5LW5leHQtdXJsXScpLmF0dHIoJ2RhdGEtb3ZlcmxheS1uZXh0LXVybCcpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLW92ZXJsYXktc2xpZGVzaG93PVwicGF1c2VcIl0nKTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0aWYgKChlLndoaWNoID09PSAyNyB8fCBlLmtleUNvZGUgPT09IDI3KSAmJiBpc0dhbGxlcnlPdmVybGF5QWN0aXZlKCkpIHtcclxuXHRcdFx0XHRcdCRnYWxsZXJ5T3ZlcmxheS5yZW1vdmVDbGFzcygnZ2FsbGVyeS1vdmVybGF5LS1zbGlkZXNob3cnKTtcclxuXHRcdFx0XHRcdCRnYWxsZXJ5T3ZlcmxheS5yZW1vdmVBdHRyKCdkYXRhLWdhbGxlcnktc2xpZGVzaG93Jyk7XHJcblx0XHRcdFx0XHRjbG9zZUdhbGxlcnlPdmVybGF5KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQkYm9keS5vbih7XHJcblx0XHRcdGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0aWYgKChlLndoaWNoID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM3KSAmJiBpc0dhbGxlcnlPdmVybGF5QWN0aXZlKCkgJiYgIWlzR2FsbGVyeVNsaWRlc2hvd0FjdGl2ZSgpKSB7XHJcblx0XHRcdFx0XHRoYW5kbGVPdmVybGF5KCRnYWxsZXJ5T3ZlcmxheS5maW5kKCdbZGF0YS1vdmVybGF5LXByZXYtdXJsXScpLmF0dHIoJ2RhdGEtb3ZlcmxheS1wcmV2LXVybCcpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0a2V5ZG93bjogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRpZiAoKGUud2hpY2ggPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS53aGljaCA9PT0gMzIgfHwgZS5rZXlDb2RlID09PSAzMikgJiYgaXNHYWxsZXJ5T3ZlcmxheUFjdGl2ZSgpICYmICFpc0dhbGxlcnlTbGlkZXNob3dBY3RpdmUoKSkge1xyXG5cdFx0XHRcdFx0aGFuZGxlT3ZlcmxheSgkZ2FsbGVyeU92ZXJsYXkuZmluZCgnW2RhdGEtb3ZlcmxheS1uZXh0LXVybF0nKS5hdHRyKCdkYXRhLW92ZXJsYXktbmV4dC11cmwnKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhbmRsZUdhbGxlcnlTb3VyY2VzKCkge1xyXG5cclxuXHRcdGlmICgkaGJXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0JGhiV3JhcHBlci5odG1sKGhiLmdldFRwbCgnZ2FsbGVyeS1pdGVtJykod2luZG93LnBob3RvcykpO1xyXG5cdFx0XHRsb2FkSW1hZ2VzKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsb2FkSW1hZ2VzKCkge1xyXG5cdFx0aWYoJGhiV3JhcHBlciAmJiAkaGJXcmFwcGVyLmxlbmd0aCkge1xyXG5cdFx0XHQkaGJXcmFwcGVyLmZpbmQoJ1tkYXRhLWxhenldOm5vdChbZGF0YS1sYXp5LWluaXRpYWxpemVkXSknKS5hdHRyKCdkYXRhLWxhenktaW5pdGlhbGl6ZWQnLCAxKS5vbignbG9hZCcsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHQkKHRoaXMpLnBhcmVudHMoJ1tkYXRhLWdhbGxlcnktaXRlbV0nKS5maXJzdCgpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJykuYWRkQ2xhc3MoJ2xvYWRlZCcpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldHVwRGVuc2l0eSgpIHtcclxuXHRcdCRnYWxsZXJ5LmF0dHIoJ2RhdGEtZGVuc2l0eScsIHdpbmRvdy5waG90b3MubGVuZ3RoICUgcGFyc2VJbnQoJGdhbGxlcnkuYXR0cignZGF0YS1kZW5zaXR5LXN0ZXAnKSwgMTApKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhbmRsZU92ZXJsYXkodGFyZ2V0VVJMKSB7XHJcblx0XHR2YXIgcHJldlVSTCxcclxuXHRcdFx0bmV4dFVSTCxcclxuXHRcdFx0dGFyZ2V0SW5kZXgsXHJcblx0XHRcdHByZXZJbmRleCxcclxuXHRcdFx0bmV4dEluZGV4LFxyXG5cdFx0XHRsYXN0SW5kZXgsXHJcblx0XHRcdGFycmF5TGVuZ3RoLFxyXG5cdFx0XHRvdmVybGF5U291cmNlcyA9IHt9O1xyXG5cclxuXHRcdGNsb3NlR2FsbGVyeU92ZXJsYXkoKTtcclxuXHJcblx0XHR0YXJnZXRJbmRleCA9IHdpbmRvdy5waG90b3MubWFwKGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0cmV0dXJuIGUuU3JjO1xyXG5cdFx0fSkuaW5kZXhPZih0YXJnZXRVUkwpO1xyXG5cclxuXHRcdGFycmF5TGVuZ3RoID0gd2luZG93LnBob3Rvcy5sZW5ndGg7XHJcblx0XHRsYXN0SW5kZXggPSBhcnJheUxlbmd0aCAtIDE7XHJcblxyXG5cdFx0aWYodGFyZ2V0SW5kZXggPT09IDApIHtcclxuXHRcdFx0cHJldkluZGV4ID0gbGFzdEluZGV4O1xyXG5cdFx0XHRuZXh0SW5kZXggPSB0YXJnZXRJbmRleCArIDE7XHJcblx0XHR9IGVsc2UgaWYgKHRhcmdldEluZGV4ID09PSBsYXN0SW5kZXgpIHtcclxuXHRcdFx0cHJldkluZGV4ID0gdGFyZ2V0SW5kZXggLSAxO1xyXG5cdFx0XHRuZXh0SW5kZXggPSAwO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJldkluZGV4ID0gdGFyZ2V0SW5kZXggLSAxO1xyXG5cdFx0XHRuZXh0SW5kZXggPSB0YXJnZXRJbmRleCArIDE7XHJcblx0XHR9XHJcblxyXG5cdFx0cHJldlVSTCA9IHdpbmRvdy5waG90b3NbcHJldkluZGV4XS5TcmM7XHJcblx0XHRuZXh0VVJMID0gd2luZG93LnBob3Rvc1tuZXh0SW5kZXhdLlNyYztcclxuXHJcblx0XHRvdmVybGF5U291cmNlcy5jdXJyZW50VVJMID0gdGFyZ2V0VVJMO1xyXG5cdFx0b3ZlcmxheVNvdXJjZXMucHJldlVSTCA9IHByZXZVUkw7XHJcblx0XHRvdmVybGF5U291cmNlcy5uZXh0VVJMID0gbmV4dFVSTDtcclxuXHJcblx0XHRpZiAoJGhiT3ZlcmxheVdyYXBwZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQkaGJPdmVybGF5V3JhcHBlci5odG1sKGhiLmdldFRwbCgnaW1hZ2Utb3ZlcmxheScpKG92ZXJsYXlTb3VyY2VzKSk7XHJcblx0XHRcdG9wZW5HYWxsZXJ5T3ZlcmxheSgpO1xyXG5cdFx0XHRoYW5kbGVHZXN0dXJlcygpO1xyXG5cclxuXHRcdFx0aWYoJGdhbGxlcnlPdmVybGF5LmF0dHIoJ2RhdGEtZ2FsbGVyeS1zbGlkZXNob3cnKSkge1xyXG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGhhbmRsZU92ZXJsYXkobmV4dFVSTCk7XHJcblx0XHRcdFx0fSwgJGdhbGxlcnlPdmVybGF5LmF0dHIoJ2RhdGEtZ2FsbGVyeS1zbGlkZXNob3cnKSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhbmRsZUdlc3R1cmVzKCkge1xyXG5cdFx0dmFyIGdhbGxlcnlPdmVybGF5LFxyXG5cdFx0XHRnYWxsZXJ5R2VzdHVyZXM7XHJcblxyXG5cclxuXHRcdGdhbGxlcnlPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dhbGxlcnktb3ZlcmxheScpO1xyXG5cdFx0Z2FsbGVyeUdlc3R1cmVzID0gbmV3IEhhbW1lcihnYWxsZXJ5T3ZlcmxheSk7XHJcblxyXG5cdFx0Z2FsbGVyeUdlc3R1cmVzLmdldCgnc3dpcGUnKS5zZXQoeyB0aHJlc2hvbGQ6IDEwIH0pO1xyXG5cclxuXHRcdGdhbGxlcnlHZXN0dXJlcy5vbignc3dpcGVsZWZ0IHN3aXBlcmlnaHQnLCBmdW5jdGlvbihldikge1xyXG5cdFx0XHRpZihldi50eXBlID09PSAnc3dpcGVsZWZ0JyAmJiAhaXNHYWxsZXJ5U2xpZGVzaG93QWN0aXZlKCkpIHtcclxuXHRcdFx0XHRoYW5kbGVPdmVybGF5KCRnYWxsZXJ5T3ZlcmxheS5maW5kKCdbZGF0YS1vdmVybGF5LXByZXYtdXJsXScpLmF0dHIoJ2RhdGEtb3ZlcmxheS1wcmV2LXVybCcpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoZXYudHlwZSA9PT0gJ3N3aXBlcmlnaHQnICYmICFpc0dhbGxlcnlTbGlkZXNob3dBY3RpdmUoKSkge1xyXG5cdFx0XHRcdGhhbmRsZU92ZXJsYXkoJGdhbGxlcnlPdmVybGF5LmZpbmQoJ1tkYXRhLW92ZXJsYXktbmV4dC11cmxdJykuYXR0cignZGF0YS1vdmVybGF5LW5leHQtdXJsJykpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNsb3NlR2FsbGVyeU92ZXJsYXkoKSB7XHJcblx0XHQkZ2FsbGVyeU92ZXJsYXkucmVtb3ZlQ2xhc3MoJ2dhbGxlcnktb3ZlcmxheS0tdmlzaWJsZScpO1xyXG5cdFx0JGdhbGxlcnlPdmVybGF5LmFkZENsYXNzKCdnYWxsZXJ5LW92ZXJsYXktLWhpZGRlbicpO1xyXG5cdFx0JGJvZHkuY3NzKCdvdmVyZmxvdycsICcnKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9wZW5HYWxsZXJ5T3ZlcmxheSgpIHtcclxuXHRcdCRnYWxsZXJ5T3ZlcmxheS5hZGRDbGFzcygnZ2FsbGVyeS1vdmVybGF5LS1zaG93LWNvbnRyb2xscycpO1xyXG5cdFx0JGdhbGxlcnlPdmVybGF5LnJlbW92ZUNsYXNzKCdnYWxsZXJ5LW92ZXJsYXktLWhpZGRlbicpO1xyXG5cdFx0JGdhbGxlcnlPdmVybGF5LmFkZENsYXNzKCdnYWxsZXJ5LW92ZXJsYXktLXZpc2libGUnKTtcclxuXHRcdCRib2R5LmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XHJcblx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdCRnYWxsZXJ5T3ZlcmxheS5yZW1vdmVDbGFzcygnZ2FsbGVyeS1vdmVybGF5LS1zaG93LWNvbnRyb2xscycpO1xyXG5cdFx0fSwgMTEwMCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpc0dhbGxlcnlPdmVybGF5QWN0aXZlKCkge1xyXG5cdFx0cmV0dXJuICRnYWxsZXJ5T3ZlcmxheS5oYXNDbGFzcygnZ2FsbGVyeS1vdmVybGF5LS12aXNpYmxlJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpc0dhbGxlcnlTbGlkZXNob3dBY3RpdmUoKSB7XHJcblx0XHRyZXR1cm4gJGdhbGxlcnlPdmVybGF5Lmhhc0NsYXNzKCdnYWxsZXJ5LW92ZXJsYXktLXNsaWRlc2hvdycpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxufSh7XHJcblx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4uL3V0aWxzL3BlcmZvcm1hbmNlJyksXHJcblx0aGFuZGxlYmFyczogcmVxdWlyZSgnLi4vdXRpbHMvaGFuZGxlYmFycy1oZWxwZXJzJylcclxufSkpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHRpc0xvYWRlckFjdGl2ZSA9IGZhbHNlLFxyXG5cdFx0JGJvZHk7XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0QmluZGluZygpO1xyXG5cdFx0cHJlc3NSZXN1bHRMb2FkZXIoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5nKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzaG93TG9hZGVyKCkge1xyXG5cdFx0aWYgKGlzTG9hZGVyQWN0aXZlID09PSBmYWxzZSkge1xyXG5cdFx0XHQkYm9keS5hdHRyKCdkYXRhLWxvYWRlcicsICd2aXNpYmxlJyk7XHJcblx0XHRcdGlzTG9hZGVyQWN0aXZlID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhpZGVMb2FkZXIoKSB7XHJcblx0XHRpZiAoaXNMb2FkZXJBY3RpdmUgPT09IHRydWUpIHtcclxuXHRcdFx0JGJvZHkuYXR0cignZGF0YS1sb2FkZXInLCAnaGlkZGVuJyk7XHJcblx0XHRcdGlzTG9hZGVyQWN0aXZlID0gZmFsc2U7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwcmVzc1Jlc3VsdExvYWRlcigpIHtcclxuXHRcdHZhciBtb3JlVGV4dCA9ICQoJ1tkYXRhLW1vcmUtdGV4dF0nKSxcclxuXHRcdFx0bG9hZEJ1dHRvbiA9ICQoJ1tkYXRhLWV4dGVuZC1jb250ZW50XScpO1xyXG5cclxuXHRcdG1vcmVUZXh0LmhpZGUoKTtcclxuXHJcblx0XHRsb2FkQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCl7XHJcblx0XHRcdG1vcmVUZXh0LnNob3coKTtcclxuXHRcdFx0JCh0aGlzKS5yZW1vdmUoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRzaG93TG9hZGVyOiBzaG93TG9hZGVyLFxyXG5cdFx0aGlkZUxvYWRlcjogaGlkZUxvYWRlclxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4uL3V0aWxzL3BlcmZvcm1hbmNlJylcclxuXHR9XHJcbikpO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGV4cG9ydHMsXHJcblx0XHQkaHRtbCxcclxuXHRcdCR3aW5kb3csXHJcblx0XHQkYm9keSxcclxuXHRcdCRoZWFkZXIsXHJcblx0XHQkc3ViTmF2aWdhdGlvbixcclxuXHRcdGN1cnJlbnRTdWJuYXZpZ2F0aW9uSWQgPSBmYWxzZSxcclxuXHRcdGNsYXNzTmFtZXMgPSB7XHJcblx0XHRcdGh0bWxBY3RpdmU6ICdodG1sLS1oZWFkZXItYWN0aXZlJyxcclxuXHRcdFx0c3ViTmF2aWdhdGlvbkFjdGl2ZTogJ2hlYWRlci0tc3VibmF2aWdhdGlvbi1hY3RpdmUnLFxyXG5cdFx0XHRwYWdlQ29udGVudFNjcm9sbGVkOiAnaGVhZGVyLS1zY3JvbGxpbmcnXHJcblx0XHR9O1xyXG5cclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGluaXRET01FbGVtZW50cygpO1xyXG5cdFx0aW5pdEJpbmRpbmdzKCk7XHJcblxyXG5cdFx0Y2hlY2tGb3JMb2dpblJlcXVlc3QoKTtcclxuXHRcdGhhbmRsZVJlc2l6ZSgpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGh0bWwgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGh0bWw7XHJcblx0XHQkd2luZG93ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiR3aW5kb3c7XHJcblx0XHQkYm9keSA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kYm9keTtcclxuXHRcdCRoZWFkZXIgPSAkYm9keS5maW5kKCdbZGF0YS1oZWFkZXJdJyk7XHJcblx0XHQkc3ViTmF2aWdhdGlvbiA9ICRoZWFkZXIuZmluZCgnW2RhdGEtc3VibmF2aWdhdGlvbl0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRCaW5kaW5ncygpIHtcclxuXHRcdCR3aW5kb3cub24oe1xyXG5cdFx0XHRzY3JvbGw6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzLnBhZ2VDb250ZW50U2Nyb2xsZWQ7XHJcblxyXG5cdFx0XHRcdGlmICgkKHRoaXMpLnNjcm9sbFRvcCgpID4gMCkge1xyXG5cdFx0XHRcdFx0JGhlYWRlci5hZGRDbGFzcyhjbGFzc05hbWUpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkaGVhZGVyLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRyZXNpemU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGNsZWFyVGltZW91dCh3aW5kb3cucmVzaXplZEZpbmlzaGVkKTtcclxuXHRcdFx0XHR3aW5kb3cucmVzaXplZEZpbmlzaGVkID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xyXG5cdFx0XHRcdFx0aGFuZGxlUmVzaXplKCk7XHJcblx0XHRcdFx0fSwgMzAwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0JGhlYWRlci5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0aWYgKCRoZWFkZXIuYXR0cignZGF0YS1hY3RpdmUnKSkge1xyXG5cdFx0XHRcdFx0Y2xvc2VQYW5lbCgpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0b2dnbGVQYW5lbCgnbW9iaWxlLW5hdicpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXRvZ2dsZT1cIm1vYmlsZS1uYXZcIl0nKTtcclxuXHJcblx0XHQkaGVhZGVyLm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHR0b2dnbGVQYW5lbCgnYWNjb3VudCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtdG9nZ2xlPVwiYWNjb3VudFwiXScpO1xyXG5cclxuXHRcdCRoZWFkZXIub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHRvZ2dsZVBhbmVsKCdzZWFyY2gnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXRvZ2dsZT1cInNlYXJjaFwiXScpO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0aGFuZGxlQm9keUNsaWNrKGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZSgpIHtcclxuXHRcdGRldGFjaEJpbmRpbmdzKCk7XHJcblx0XHRpZiAoJHdpbmRvdy53aWR0aCgpID4gMTAyNCkge1xyXG5cdFx0XHRpbml0RGVza3RvcEJpbmRpbmdzKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpbml0VG91Y2hCaW5kaW5ncygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGV0YWNoQmluZGluZ3MoKSB7XHJcblx0XHRjbG9zZVBhbmVsKCk7XHJcblx0XHQkaGVhZGVyLm9mZignY2xpY2snLCAnW2RhdGEtc3VibmF2aWdhdGlvbl0gW2RhdGEtc3VibmF2aWdhdGlvbi10YXJnZXRdJyk7XHJcblx0XHQkaGVhZGVyLm9mZignbW91c2VlbnRlcicsICdbZGF0YS1tYWluLW5hdmlnYXRpb25dIHVsIGxpJyk7XHJcblx0XHQkaGVhZGVyLm9mZignbW91c2VsZWF2ZScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERlc2t0b3BCaW5kaW5ncygpIHtcclxuXHRcdCRoZWFkZXIub24oe1xyXG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0dG9nZ2xlU3VibmF2aWdhdGlvbigkKHRoaXMpLCBmYWxzZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1tYWluLW5hdmlnYXRpb25dIHVsIGxpJyk7XHJcblxyXG5cdFx0JGhlYWRlci5vbih7XHJcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRjbG9zZVN1Yk5hdmlnYXRpb24oKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0VG91Y2hCaW5kaW5ncygpIHtcclxuXHRcdCRoZWFkZXIub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHRvZ2dsZVN1Ym5hdmlnYXRpb24oJCh0aGlzKSwgdHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS1zdWJuYXZpZ2F0aW9uXSBbZGF0YS1zdWJuYXZpZ2F0aW9uLXRhcmdldF0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhbmRsZUJvZHlDbGljayhlKSB7XHJcblx0XHRpZiAoISRoZWFkZXIuaXMoZS50YXJnZXQpICYmICRoZWFkZXIuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0Y2xvc2VQYW5lbCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY2hlY2tGb3JMb2dpblJlcXVlc3QoKSB7XHJcblx0XHRpZiAoJC50cmltKCRib2R5LmZpbmQoJ1tkYXRhLWZvcm09XCJsb2dpblwiXSBpbnB1dFtuYW1lPVwiUmVkaXJlY3RcIl0nKS52YWwoKSkgIT09ICcnKSB7XHJcblx0XHRcdG9wZW5QYW5lbCgnYWNjb3VudCcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdG9nZ2xlU3VibmF2aWdhdGlvbigkb2JqLCBpc01vYmlsZSkge1xyXG5cdFx0dmFyIGlkLFxyXG5cdFx0XHQkc3ViTmF2aWdhdGlvbkl0ZW07XHJcblxyXG5cdFx0aWYgKCRvYmogJiYgJG9iai5hdHRyKCdkYXRhLXN1Ym5hdmlnYXRpb24tdGFyZ2V0JykpIHtcclxuXHRcdFx0aWQgPSAkb2JqLmF0dHIoJ2RhdGEtc3VibmF2aWdhdGlvbi10YXJnZXQnKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHQkc3ViTmF2aWdhdGlvbkl0ZW0gPSAkc3ViTmF2aWdhdGlvbi5maW5kKCdbZGF0YS1zdWJuYXZpZ2F0aW9uLWlkPVwiJyArIGlkICsgJ1wiXScpO1xyXG5cclxuXHRcdFx0aWYgKCRzdWJOYXZpZ2F0aW9uSXRlbS5sZW5ndGggPiAwKSB7XHJcblxyXG5cdFx0XHRcdGlmIChpc01vYmlsZSkge1xyXG5cdFx0XHRcdFx0JG9iai5wYXJlbnQoKS5zaWJsaW5ncygpLmZpbmQoJ1tkYXRhLXN1Ym5hdmlnYXRpb24tdGFyZ2V0XScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0JG9iai5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdCRzdWJOYXZpZ2F0aW9uSXRlbS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHJcblx0XHRcdFx0aWYgKGN1cnJlbnRTdWJuYXZpZ2F0aW9uSWQgPT09IGZhbHNlIHx8IGN1cnJlbnRTdWJuYXZpZ2F0aW9uSWQgIT09IGlkKSB7XHJcblx0XHRcdFx0XHRvcGVuU3ViTmF2aWdhdGlvbigkb2JqLCAkc3ViTmF2aWdhdGlvbkl0ZW0sIGlzTW9iaWxlKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdWJuYXZpZ2F0aW9uSWQgPSBpZDtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzTW9iaWxlKSB7XHJcblx0XHRcdFx0XHRjbG9zZVN1Yk5hdmlnYXRpb24oaXNNb2JpbGUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y2xvc2VTdWJOYXZpZ2F0aW9uKGlzTW9iaWxlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9wZW5TdWJOYXZpZ2F0aW9uKCRvYmosICRzdWJOYXZpZ2F0aW9uSXRlbSwgaXNNb2JpbGUpIHtcclxuXHRcdGlmICghaXNNb2JpbGUpIHtcclxuXHRcdFx0JGhlYWRlci5hdHRyKCdkYXRhLWFjdGl2ZScsICdzdWJuYXZpZ2F0aW9uJyk7XHJcblx0XHR9XHJcblx0XHQkc3ViTmF2aWdhdGlvbkl0ZW0uYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0JG9iai5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbG9zZVN1Yk5hdmlnYXRpb24oaXNNb2JpbGUpIHtcclxuXHRcdGlmICgkaGVhZGVyLmF0dHIoJ2RhdGEtYWN0aXZlJykgPT09ICdzdWJuYXZpZ2F0aW9uJyAmJiAhaXNNb2JpbGUpIHtcclxuXHRcdFx0JGhlYWRlci5hdHRyKCdkYXRhLWFjdGl2ZScsIG51bGwpO1xyXG5cdFx0fVxyXG5cdFx0JGhlYWRlci5maW5kKCdbZGF0YS1zdWJuYXZpZ2F0aW9uLWlkXScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdCRoZWFkZXIuZmluZCgnW2RhdGEtc3VibmF2aWdhdGlvbi10YXJnZXRdJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0Y3VycmVudFN1Ym5hdmlnYXRpb25JZCA9IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdG9nZ2xlUGFuZWwobmFtZSkge1xyXG5cdFx0aWYgKCRoZWFkZXIuYXR0cignZGF0YS1hY3RpdmUnKSAhPT0gbmFtZSkge1xyXG5cdFx0XHRvcGVuUGFuZWwobmFtZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjbG9zZVBhbmVsKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBvcGVuUGFuZWwobmFtZSkge1xyXG5cdFx0JGhlYWRlci5hdHRyKCdkYXRhLWFjdGl2ZScsIG5hbWUpO1xyXG5cdFx0JGh0bWwuYWRkQ2xhc3MoY2xhc3NOYW1lcy5odG1sQWN0aXZlKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNsb3NlUGFuZWwoKSB7XHJcblx0XHQkaGVhZGVyLmF0dHIoJ2RhdGEtYWN0aXZlJywgbnVsbCk7XHJcblx0XHQkaHRtbC5yZW1vdmVDbGFzcyhjbGFzc05hbWVzLmh0bWxBY3RpdmUpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHQvKiB0ZXN0LWNvZGUgKi9cclxuXHQvKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAgKi9cclxuXHRleHBvcnRzLl9fdGVzdG9ubHlfXyA9IHt9O1xyXG5cdC8qIGVuZC10ZXN0LWNvZGUgKi9cclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcblxyXG59KFxyXG5cdHtcclxuXHRcdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuLi91dGlscy9wZXJmb3JtYW5jZScpXHJcblx0fVxyXG4pKTtcclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdCRib2R5LFxyXG5cdFx0JHdpbmRvdyxcclxuICAgICRwYXJ0aWNpcGFudHM7XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRCaW5kaW5ncygpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkd2luZG93ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiR3aW5kb3c7XHJcbiAgICAkcGFydGljaXBhbnRzID0gJGJvZHkuZmluZCgnW2RhdGEtcGFydGljaXBhbnRzXScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JHBhcnRpY2lwYW50cy5vbih7XHJcblx0XHRcdGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHR0b2dnbGVQYXJ0aWNpcGFudEluZm8oJChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLXBhcnRpY2lwYW50LWluZm9dJykpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAnW2RhdGEtcGFydGljaXBhbnQtaW5mb10gW2RhdGEtcGFydGljaXBhbnQtaW5mby10b2dnbGVdJyk7XHJcblx0fVxyXG5cclxuICBmdW5jdGlvbiB0b2dnbGVQYXJ0aWNpcGFudEluZm8oJHRhcmdldCkge1xyXG4gICAgaWYgKCR3aW5kb3cub3V0ZXJXaWR0aCgpID4gNzY4KSB7XHJcbiAgICAgICRwYXJ0aWNpcGFudHMuZmluZCgnW2RhdGEtcGFydGljaXBhbnQtaW5mb10nKS5hdHRyKCdkYXRhLXBhcnRpY2lwYW50LWluZm8nLCAnaGlkZGVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkcGFydGljaXBhbnRzLmZpbmQoJ1tkYXRhLXBhcnRpY2lwYW50LWluZm9dJykubm90KCR0YXJnZXQpLmF0dHIoJ2RhdGEtcGFydGljaXBhbnQtaW5mbycsICdoaWRkZW4nKTtcclxuICAgICAgJHRhcmdldC5hdHRyKCdkYXRhLXBhcnRpY2lwYW50LWluZm8nLCAkdGFyZ2V0LmF0dHIoJ2RhdGEtcGFydGljaXBhbnQtaW5mbycpID09PSAnaGlkZGVuJyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKTtcclxuICAgICAgJHRhcmdldFswXS5zY3JvbGxJbnRvVmlldyh7XHJcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgIGJsb2NrOiAnY2VudGVyJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0LyogdGVzdC1jb2RlICovXHJcblx0LyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXHJcblx0ZXhwb3J0cy5fX3Rlc3Rvbmx5X18gPSB7fTtcclxuXHQvKiBlbmQtdGVzdC1jb2RlICovXHJcblxyXG5cdHJldHVybiBleHBvcnRzO1xyXG5cclxufShcclxuXHR7XHJcblx0XHRwZXJmb3JtYW5jZTogcmVxdWlyZSgnLi8uLi91dGlscy9wZXJmb3JtYW5jZScpXHJcblx0fVxyXG4pKTtcclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChkZXApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBleHBvcnRzLFxyXG5cdFx0JGJvZHksXHJcblx0XHQkcGFydG5lcnMsXHJcblx0XHQkcGFydG5lcnNJbm5lcixcclxuXHRcdCRwYXJ0bmVySXRlbSxcclxuXHRcdHBhcnRuZXJJdGVtQ2xvbmUsXHJcblx0XHRjb3VudFBhcnRuZXJJdGVtcyxcclxuXHRcdGRpZmYsXHJcblx0XHRjdXJyZW50VGltZTtcclxuXHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblx0XHRpbml0RE9NRWxlbWVudHMoKTtcclxuXHRcdGluaXRQYXJ0bmVyTG9nb3MoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRET01FbGVtZW50cygpIHtcclxuXHRcdCRib2R5ID0gZGVwLnBlcmZvcm1hbmNlLmdldENhY2hlZERvbSgpLiRib2R5O1xyXG5cclxuXHRcdCRwYXJ0bmVycyA9ICRib2R5LmZpbmQoJ1tkYXRhLXBhcnRuZXJzXScpO1xyXG5cdFx0JHBhcnRuZXJzSW5uZXIgPSAkcGFydG5lcnM7XHJcblx0XHQkcGFydG5lckl0ZW0gPSAkcGFydG5lcnNJbm5lci5maW5kKCcucGFydG5lcnNfX2xvZ28nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRQYXJ0bmVyTG9nb3MoKSB7XHJcblx0XHRjb3VudFBhcnRuZXJJdGVtcyA9ICRwYXJ0bmVySXRlbS5sZW5ndGg7XHJcblx0XHRkaWZmID0gY291bnRQYXJ0bmVySXRlbXMgKiAxMjAgLSAkcGFydG5lcnMud2lkdGgoKTtcclxuXHJcblx0XHRpZiAoZGlmZiA+IDApIHtcclxuXHRcdFx0cGFydG5lckl0ZW1DbG9uZSA9ICRwYXJ0bmVySXRlbS5jbG9uZSgpO1xyXG5cdFx0XHQkcGFydG5lcnNJbm5lci5hcHBlbmQocGFydG5lckl0ZW1DbG9uZSk7XHJcblx0XHRcdCRwYXJ0bmVySXRlbSA9ICRwYXJ0bmVyc0lubmVyLmZpbmQoJy5wYXJ0bmVyc19fbG9nbycpO1xyXG5cdFx0XHRjb3VudFBhcnRuZXJJdGVtcyA9ICRwYXJ0bmVySXRlbS5sZW5ndGg7XHJcblx0XHRcdGNvbnNvbGUubG9nKGRpZmYpO1xyXG5cdFx0XHQkcGFydG5lcnNJbm5lci5jc3Moe3dpZHRoOiBjb3VudFBhcnRuZXJJdGVtcyAqIDEyMH0pO1xyXG5cclxuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0Y3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG5cdFx0XHRcdG1vdmVQYXJ0bmVyTG9nb3MoKTtcclxuXHRcdFx0fSwgMTAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBtb3ZlUGFydG5lckxvZ29zKCkge1xyXG5cdFx0dmFyIGRpZiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gY3VycmVudFRpbWUuZ2V0VGltZSgpLFxyXG5cdFx0XHR2YWx1ZSA9IGRpZiAvIDE2LjY2O1xyXG5cclxuXHRcdCRwYXJ0bmVyc0lubmVyLmNzcyh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtJyArIHZhbHVlICsgJ3B4KSd9KTtcclxuXHJcblx0XHRpZih2YWx1ZSA+ICRwYXJ0bmVyc0lubmVyLndpZHRoKCkgLyAyKSB7XHJcblx0XHRcdGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUobW92ZVBhcnRuZXJMb2dvcyk7XHJcblx0fVxyXG5cclxuXHRleHBvcnRzID0ge1xyXG5cdFx0aW5pdDogaW5pdFxyXG5cdH07XHJcblxyXG5cdC8qIHRlc3QtY29kZSAqL1xyXG5cdC8qIGVzbGludCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCAqL1xyXG5cdGV4cG9ydHMuX190ZXN0b25seV9fID0ge307XHJcblx0LyogZW5kLXRlc3QtY29kZSAqL1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxuXHJcbn0oXHJcblx0e1xyXG5cdFx0cGVyZm9ybWFuY2U6IHJlcXVpcmUoJy4vLi4vdXRpbHMvcGVyZm9ybWFuY2UnKVxyXG5cdH1cclxuKSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgZXhwb3J0cyxcclxuXHRcdCRwYWdlQ29udGVudCxcclxuXHRcdCRzaWRlQmFyLFxyXG5cdFx0c2lkZWJhckxheW91dFNldHRpbmdzID0ge1xyXG5cdFx0XHRtaW5IZWlnaHQ6IDYwMCxcclxuXHRcdFx0Ly8gU3RhbmRhcmQgY2xhc3NlcyBmb3IgYWxsIGltYWdlIGdyaWQgaXRlbXNcclxuXHRcdFx0aW1hZ2VDbGFzc2VzOiBbJ2dyaWRfX2l0ZW0nLCAnaW1hZ2UtY29udGVudF9faW1hZ2UnXSxcclxuXHRcdFx0bGF5b3V0UGF0dGVybjogWydmdWxsJywgJ2hhbGYnLCAnaGFsZiddLFxyXG5cdFx0XHQvLyBJbWFnZSB0eXBlIHNwZWNpZmljIGNsYXNzZXNcclxuXHRcdFx0cGF0dGVybkNsYXNzZXM6IHtcclxuXHRcdFx0XHRmdWxsOiAnb25lLXdob2xlJyxcclxuXHRcdFx0XHRoYWxmOiAnb25lLWhhbGYnXHJcblx0XHRcdH0sXHJcblx0XHRcdGltYWdlV2lkdGhUb0hlaWdodFJhdGlvOiAxXHJcblx0XHR9LFxyXG5cdFx0bGF5b3V0ID0gW107XHJcblxyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cdFx0JChmdW5jdGlvbigpIHtcclxuXHRcdFx0aWYgKCQoJ1tkYXRhLWltYWdlLW9ubHktc2lkZWJhcl0nKS5sZW5ndGggJiYgd2luZG93LmltYWdlT25seVNpZGViYXJTb3VyY2VzKSB7XHJcblx0XHRcdFx0aW5pdERPTUVsZW1lbnRzKCk7XHJcblx0XHRcdFx0aW5pdExheW91dCgpO1xyXG5cdFx0XHRcdGFwcGVuZEltYWdlcygpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRET01FbGVtZW50cygpIHtcclxuXHRcdCRwYWdlQ29udGVudCA9ICQoJy5wYWdlIC50d28tdGhpcmRzJyk7XHJcblx0XHQkc2lkZUJhciA9ICQoJ1tkYXRhLWltYWdlLW9ubHktc2lkZWJhcl0nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRMYXlvdXQoKSB7XHJcblx0XHR2YXIgYXZhaWxhYmxlSGVpZ2h0LFxyXG5cdFx0XHRpLFxyXG5cdFx0XHRtaW5TaWRlYmFySGVpZ2h0ID0gc2lkZWJhckxheW91dFNldHRpbmdzLm1pbkhlaWdodCxcclxuXHRcdFx0cGF0dGVybiA9IHNpZGViYXJMYXlvdXRTZXR0aW5ncy5sYXlvdXRQYXR0ZXJuLFxyXG5cdFx0XHRwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGgsXHJcblx0XHRcdGltYWdlVHlwZSxcclxuXHRcdFx0aW1hZ2VIZWlnaHQsXHJcblx0XHRcdHNjcmVlbkVzdGF0ZUF2YWlsYWJsZSA9IHRydWU7XHJcblxyXG5cdFx0YXZhaWxhYmxlSGVpZ2h0ID0gJHBhZ2VDb250ZW50LmhlaWdodCgpIC0gJHNpZGVCYXIuaGVpZ2h0KCk7XHJcblxyXG5cdFx0Ly8gU2V0IGEgbWluaW11bSBoZWlnaHQgZXhwbGljaXRseSBzbyBhIGZldyBpbWFnZXMgYXJlIGFsd2F5cyByZW5kZXJlZFxyXG5cdFx0aWYgKGF2YWlsYWJsZUhlaWdodCA8IG1pblNpZGViYXJIZWlnaHQpIHtcclxuXHRcdFx0YXZhaWxhYmxlSGVpZ2h0ID0gbWluU2lkZWJhckhlaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBEaXNwbGF5IGltYWdlcyBpbiBwYXR0ZXJuIHVudGlsIHRoZXJlIGlzIGVub3VnaCBzcGFjZVxyXG5cdFx0d2hpbGUgKHNjcmVlbkVzdGF0ZUF2YWlsYWJsZSkge1xyXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgcGF0dGVybkxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0aW1hZ2VUeXBlID0gcGF0dGVybltpXTtcclxuXHJcblx0XHRcdFx0aW1hZ2VIZWlnaHQgPSBnZXRGdWxsU2l6ZVJlbGF0aXZlSGVpZ2h0KGdldFJhdGlvKGltYWdlVHlwZSkpO1xyXG5cclxuXHRcdFx0XHRpZiAoaW1hZ2VIZWlnaHQgPCBhdmFpbGFibGVIZWlnaHQpIHtcclxuXHRcdFx0XHRcdGxheW91dC5wdXNoKGltYWdlVHlwZSk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgZGVkdWN0IGhlaWdodCBpZiB0aGUgY3VycmVudCBpbWFnZSBhbmQgdGhlIG5leHQgaW1hZ2UgdHlwZSBhcmUgYm90aCB0eXBlICdoYWxmJyAnY2F1c2UgdGhleSBmaXQgb24gc2FtZSBsaW5lXHJcblx0XHRcdFx0XHRpZiAoaW1hZ2VUeXBlICE9PSBwYXR0ZXJuW2kgKyAxXSkge1xyXG5cdFx0XHRcdFx0XHRhdmFpbGFibGVIZWlnaHQgLT0gaW1hZ2VIZWlnaHQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNjcmVlbkVzdGF0ZUF2YWlsYWJsZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhcHBlbmRJbWFnZXMoKSB7XHJcblx0XHR2YXIgaSxcclxuXHRcdFx0dmFsdWUsXHJcblx0XHRcdGosXHJcblx0XHRcdGVsLFxyXG5cdFx0XHRpbWFnZUdyaWRJdGVtcyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcclxuXHRcdFx0aW1nQ2xhc3NlcyA9IHNpZGViYXJMYXlvdXRTZXR0aW5ncy5pbWFnZUNsYXNzZXMsXHJcblx0XHRcdHB0cm5DbGFzc2VzID0gc2lkZWJhckxheW91dFNldHRpbmdzLnBhdHRlcm5DbGFzc2VzLFxyXG5cdFx0XHRncmlkSXRlbSxcclxuXHRcdFx0aW1nO1xyXG5cclxuXHRcdGZvciAoaSA9IDA7IGkgPCBsYXlvdXQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0aWYgKCFpbWFnZU9ubHlTaWRlYmFyU291cmNlc1tpXSkge1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0dmFsdWUgPSBsYXlvdXRbaV07XHJcblxyXG5cdFx0XHRncmlkSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuXHRcdFx0Ly8gQWRkIGltYWdlIHR5cGUgc3BlY2lmaWMgY2xhc3NcclxuXHRcdFx0Z3JpZEl0ZW0uY2xhc3NOYW1lID0gcHRybkNsYXNzZXNbdmFsdWVdO1xyXG5cdFx0XHQvLyBBZGQgYWxsIHN0YW5kYXJkIGNsYXNzZXNcclxuXHRcdFx0Zm9yIChqID0gMDsgaiA8IGltZ0NsYXNzZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRlbCA9IGltZ0NsYXNzZXNbal07XHJcblx0XHRcdFx0Z3JpZEl0ZW0uY2xhc3NMaXN0LmFkZChlbCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG5cdFx0XHQvLyBTZXQgaW1hZ2Ugc291cmNlIGZyb20gcHJlbG9hZGVkIGxpc3RcclxuXHRcdFx0aW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaW1hZ2VPbmx5U2lkZWJhclNvdXJjZXNbaV0pO1xyXG5cdFx0XHRpbWcuc2V0QXR0cmlidXRlKCdhbHQnLCAnJyk7XHJcblxyXG5cdFx0XHRncmlkSXRlbS5hcHBlbmRDaGlsZChpbWcpO1xyXG5cdFx0XHRpbWFnZUdyaWRJdGVtcy5hcHBlbmRDaGlsZChncmlkSXRlbSk7XHJcblx0XHR9XHJcblxyXG5cdFx0JHNpZGVCYXIuZmluZCgnW2RhdGEtaW1hZ2UtZ3JpZF0nKS5hcHBlbmQoaW1hZ2VHcmlkSXRlbXMpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0UmF0aW8oc2l6ZSkge1xyXG5cdFx0dmFyIHJhdGlvO1xyXG5cclxuXHRcdHN3aXRjaCAoc2l6ZSkge1xyXG5cdFx0Y2FzZSAnZnVsbCc6XHJcblx0XHRcdHJhdGlvID0gMTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdoYWxmJzpcclxuXHRcdFx0cmF0aW8gPSAxIC8gMjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJhdGlvO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0RnVsbFNpemVSZWxhdGl2ZUhlaWdodChyYXRpbykge1xyXG5cdFx0dmFyIGZ1bGxTaXplSW1hZ2VXaWR0aCA9ICRzaWRlQmFyLndpZHRoKCksXHJcblx0XHRcdGZ1bGxTaXplSW1hZ2VIZWlnaHQgPSBzaWRlYmFyTGF5b3V0U2V0dGluZ3MuaW1hZ2VXaWR0aFRvSGVpZ2h0UmF0aW87XHJcblxyXG5cdFx0cmV0dXJuIHBhcnNlSW50KGZ1bGxTaXplSW1hZ2VXaWR0aCAvIGZ1bGxTaXplSW1hZ2VIZWlnaHQgKiByYXRpbywgMTApO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxufSgpKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xyXG5cdHZhciBleHBvcnRzO1xyXG5cclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdHNldEd1ZXN0SW1hZ2VzKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRHdWVzdEltYWdlcygpIHtcclxuXHRcdGlmICh3aW5kb3cub3V0ZXJXaWR0aCA+IDUzNCkge1xyXG5cdFx0XHQkKCdbZGF0YS13aG8tZ29lcy1pbWddJykuZWFjaChmdW5jdGlvbigpe1xyXG5cdFx0XHRcdCQodGhpcykuYXR0cignc3JjJywgJCh0aGlzKS5kYXRhKCdzcmMnKSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0JCgnW2RhdGEtd2hvLWdvZXMtaW1nXScpLmVhY2goZnVuY3Rpb24oaSwgdil7XHJcblx0XHRcdFx0aWYgKGkgPCA1KSB7XHJcblx0XHRcdFx0XHQkKHYpLmF0dHIoJ3NyYycsICQodikuZGF0YSgnc3JjJykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0JCgnW2RhdGEtd2hvLWdvZXMtaW1nXScpLmVhY2goZnVuY3Rpb24oaSwgdil7XHJcblx0XHRcdFx0XHRpZiAoaSA+PSA1ICYmIGlzSW5WaWV3cG9ydCgkKCdbZGF0YS13aG8tZ29lcy1pbWddJylbaS0xXSkpIHtcclxuXHRcdFx0XHRcdFx0JCh2KS5hdHRyKCdzcmMnLCAkKHYpLmRhdGEoJ3NyYycpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpc0luVmlld3BvcnQoZWxlbWVudCkge1xyXG5cdFx0dmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuXHRcdHJldHVybiByZWN0LmJvdHRvbSA+PSAwICYmIHJlY3QudG9wIDw9IHdpbmRvdy5pbm5lckhlaWdodCAmJiByZWN0LnJpZ2h0ID49IDAgJiYgcmVjdC5sZWZ0IDw9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0cyA9IHtcclxuXHRcdGluaXQ6IGluaXRcclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZXhwb3J0cztcclxufSgpKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKGRlcCkge1xyXG5cdHZhciAkd2luZG93LFxyXG5cdFx0JGJvZHksXHJcblx0XHQkcGFnZSxcclxuXHRcdCR5ZWFyYm9va1NsaWRlcixcclxuXHRcdHllYXJib29rQVBJUGFyYW1zLFxyXG5cdFx0cGFnZUluZGV4ID0gMCxcclxuXHRcdCRldmVudFByb21pc2UsXHJcblx0XHRudW1PZlNsaWRlckl0ZW1zLFxyXG5cdFx0aW5kZXhPZkFjdGl2ZUVsLFxyXG5cdFx0c2xpZGVySW5zdGFuY2UsXHJcblx0XHR2ZXJpZmljYXRpb25Ub2tlbjtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCgpIHtcclxuXHRcdGlmICgkKCdbZGF0YS1ldmVudC15ZWFyYm9va10nKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGluaXRET01FbGVtZW50cygpO1xyXG5cdFx0XHQkcGFnZS5hZGRDbGFzcygncGFnZS0tZ3JheScpO1xyXG5cdFx0XHRpbml0QmluZGluZ3MoKTtcclxuXHRcdFx0bG9hZEltYWdlcygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdERPTUVsZW1lbnRzKCkge1xyXG5cdFx0JHdpbmRvdyA9IGRlcC5wZXJmb3JtYW5jZS5nZXRDYWNoZWREb20oKS4kd2luZG93O1xyXG5cdFx0JGJvZHkgPSBkZXAucGVyZm9ybWFuY2UuZ2V0Q2FjaGVkRG9tKCkuJGJvZHk7XHJcblx0XHQkcGFnZSA9ICQoJy5wYWdlJyk7XHJcblx0XHQkeWVhcmJvb2tTbGlkZXIgPSAkKCdbZGF0YS15ZWFyYm9vay1nYWxsZXJ5XScpO1xyXG5cdFx0dmVyaWZpY2F0aW9uVG9rZW4gPSAkYm9keS5hdHRyKCdkYXRhLXZlcmlmaWNhdGlvbi10b2tlbicpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEJpbmRpbmdzKCkge1xyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRrZXlkb3duOiBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0aWYgKGUua2V5Q29kZSA9PT0gMzcpIHtcclxuXHRcdFx0XHRcdHNob3dQcmV2aW91c1NsaWRlckl0ZW0oKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChlLmtleUNvZGUgPT09IDM5KSB7XHJcblx0XHRcdFx0XHRzaG93TmV4dFNsaWRlckl0ZW0oKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdCRib2R5Lm9uKHtcclxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHNob3dQcmV2aW91c1NsaWRlckl0ZW0oKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgJ1tkYXRhLXllYXJib29rLXBhZ2VyLXByZXZdJyk7XHJcblxyXG5cdFx0JGJvZHkub24oe1xyXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c2hvd05leHRTbGlkZXJJdGVtKCk7XHJcblx0XHRcdH1cclxuXHRcdH0sICdbZGF0YS15ZWFyYm9vay1wYWdlci1uZXh0XScpO1xyXG5cclxuXHRcdCR3aW5kb3cub24oe1xyXG5cdFx0XHRyZXNpemU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGFkanVzdFNsaWRlckhlaWdodCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGxvYWRJbWFnZXMocmVjYWxjdWxhdGUpIHtcclxuXHRcdGNvbmZpZ1dlYkFQSSgpO1xyXG5cclxuXHRcdCRldmVudFByb21pc2UgPSAkLmFqYXgoeWVhcmJvb2tBUElQYXJhbXMpO1xyXG5cclxuXHRcdCQud2hlbigkZXZlbnRQcm9taXNlKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdFx0YXBwZW5kSW1hZ2VzKGRhdGEpO1xyXG5cclxuXHRcdFx0aW5pdFNsaWRlcihpbmRleE9mQWN0aXZlRWwsIHJlY2FsY3VsYXRlKTtcclxuXHJcblx0XHRcdG51bU9mU2xpZGVySXRlbXMgPSAkKCcudW5zbGlkZXItY2Fyb3VzZWwgPiBsaScpLmxlbmd0aDtcclxuXHRcdFx0cGFnZUluZGV4Kys7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbmZpZ1dlYkFQSSgpIHtcclxuXHRcdHllYXJib29rQVBJUGFyYW1zID0ge1xyXG5cdFx0XHR0eXBlOiAnUE9TVCcsXHJcblx0XHRcdHVybDogJHllYXJib29rU2xpZGVyLmRhdGEoJ3llYXJib29rLWFwaScpLFxyXG5cdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0SW1hZ2VGb2xkZXJJRDogJHllYXJib29rU2xpZGVyLmRhdGEoJ2ZvbGRlci1pZCcpLFxyXG5cdFx0XHRcdFBhZ2VTaXplOiAxMCxcclxuXHRcdFx0XHRQYWdlSW5kZXg6IHBhZ2VJbmRleFxyXG5cdFx0XHR9KSxcclxuXHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiB2ZXJpZmljYXRpb25Ub2tlblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFNsaWRlcihpbmRleCwgcmVjYWxjdWxhdGUpIHtcclxuXHRcdHNsaWRlckluc3RhbmNlID0gJHllYXJib29rU2xpZGVyLnVuc2xpZGVyKHtcclxuXHRcdFx0bmF2OiBmYWxzZSxcclxuXHRcdFx0YXJyb3dzOiBmYWxzZSxcclxuXHRcdFx0Ly8gSW5kZXggaXMgc2V0IHRvIHByZXZpb3VzIHNsaWRlIG9uIHJlaW5pdGlhbGl6YXRpb24gdG8gYXBwbHkgbW92ZSBhbmltYXRpb24gdG8gbmV4dCBzbGlkZSBpbnN0ZWFkIG9mIGp1bXBpbmcgdG8gaXRcclxuXHRcdFx0aW5kZXg6IGluZGV4ID8gaW5kZXggLSAxIDogJ2ZpcnN0JyxcclxuXHRcdFx0a2V5czogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdGxhenlMb2FkQWN0aXZlSW1hZ2UoKTtcclxuXHRcdGFkanVzdFNsaWRlckhlaWdodCgpO1xyXG5cclxuXHRcdC8vIEFmdGVyIHJlY2FsY3VsYXRpb24gbW92aW5nIHRvIG5leHQgc2xpZGUgc28gbW92ZSBhbmltYXRpb24gaXMgYXBwbGllZFxyXG5cdFx0aWYgKHJlY2FsY3VsYXRlKSB7XHJcblx0XHRcdHNsaWRlckluc3RhbmNlLnVuc2xpZGVyKCdjYWxjdWxhdGVTbGlkZXMnKTtcclxuXHRcdFx0JHllYXJib29rU2xpZGVyLnVuc2xpZGVyKCduZXh0Jyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhcHBlbmRJbWFnZXMoZGF0YSkge1xyXG5cdFx0JC5lYWNoKCBkYXRhLkltYWdlcywgZnVuY3Rpb24oIGksIGl0ZW0gKSB7XHJcblx0XHRcdCQoJy5teS1zbGlkZXIgdWwnKS5hcHBlbmQoJzxsaT48aW1nIGRhdGEtc3JjPVwiJyArIGl0ZW0gKyAnXCI+PC9saT4nKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYWRqdXN0U2xpZGVySGVpZ2h0KCkge1xyXG5cdFx0JCgnLnVuc2xpZGVyJykuY3NzKCdoZWlnaHQnLCAkKCcueWVhcmJvb2tfX3dyYXBwZXInKS5vdXRlckhlaWdodCgpICsgJ3B4Jyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBsYXp5TG9hZEFjdGl2ZUltYWdlKCkge1xyXG5cdFx0dmFyICRlbCA9ICQoJy51bnNsaWRlci1hY3RpdmUgaW1nJyk7XHJcblxyXG5cdFx0JGVsLmF0dHIoJ3NyYycsICRlbC5kYXRhKCdzcmMnKSk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzaG93UHJldmlvdXNTbGlkZXJJdGVtKCkge1xyXG5cdFx0aWYgKCEkeWVhcmJvb2tTbGlkZXIuZmluZCgnbGknKVswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3Vuc2xpZGVyLWFjdGl2ZScpKSB7XHJcblx0XHRcdCR5ZWFyYm9va1NsaWRlci51bnNsaWRlcigncHJldicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2hvd05leHRTbGlkZXJJdGVtKCkge1xyXG5cdFx0JHllYXJib29rU2xpZGVyLnVuc2xpZGVyKCduZXh0Jyk7XHJcblx0XHRsYXp5TG9hZEFjdGl2ZUltYWdlKCk7XHJcblxyXG5cdFx0aW5kZXhPZkFjdGl2ZUVsPSAkKCcudW5zbGlkZXItYWN0aXZlJykuaW5kZXgoKTtcclxuXHJcblx0XHRpZiAobnVtT2ZTbGlkZXJJdGVtcyAtIGluZGV4T2ZBY3RpdmVFbCA8IDMpIHtcclxuXHRcdFx0bG9hZEltYWdlcygncmVjYWxjdWxhdGUnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGV4cG9ydHMgPSB7XHJcblx0XHRpbml0OiBpbml0XHJcblx0fTtcclxuXHJcblx0cmV0dXJuIGV4cG9ydHM7XHJcbn0oe1xyXG5cdHBlcmZvcm1hbmNlOiByZXF1aXJlKCcuLi91dGlscy9wZXJmb3JtYW5jZScpXHJcbn0pKTtcclxuXHJcbiJdfQ==\n"]}