{"version":3,"sources":["common.js","GooglePush.js","performanceEventsQueue.js","analyticsHelper.js","eventlogger.js","performancelogger.js","Search.js","leadmodal.js","formValidator.js","googleOneTapHandler.js"],"names":["tempNum","fromP","jQuery","extend","googlepush","events","action","label","value","flag","undefined","NHS","Scripts","Helper","createCookie","dataLayer","push","event","eventCategory","eventAction","eventLabel","eventValue","SetDataLayerPair","key","optValue","finalUrl","ajax","type","url","data","success","tmpData","finalData","replace","eval","error","SetDataLayer","window","parent","JSON","Globals","CommunityResults","CommunityDetail","HomeDetail","PropertyMap","MediaPlayer","$jq","noConflict","reload","location","href","document","ready","isFunction","initMegaMenu","ReferModuleHandler","SetRefer","input","querySelector","addEventListener","attachSearchEvents","getElementById","loadJs","form","SearchFormComponent","shouldAlwaysSubmitForm","submitButton","useAutocompleteForSubmit","validationError","cssInput","loadCss","removeEventListener","name","days","date","Date","setTime","getTime","expires","toGMTString","cookie","readCookie","nameEQ","ca","split","i","length","c","charAt","substring","indexOf","eraseCookie","stopBubble","e","cancelBubble","stopPropagation","$","my","setReferTag","val","refVal","RegExp","exec","decodeURIComponent","hash","refUrl","referrer","done","global","factory","define","amd","performanceEventsQueue","exports","module","root","eventsQueue","onload","ga","urlWithGaValues","analyticsHelper","addAnalyticsUrlParameters","pop","xhr","XMLHttpRequest","indexOfQueryString","open","send","enqueueEvent","CONFIGURATION","constants","nhsTrackingId","get","getGoogleAnalyticsValues","keys","trackers","getAll","filter","element","values","j","urlToWork","analyticsValues","gaClientId","clientId","gaUserId","userId","_callAddThis","_commIdHD","_builderIdHD","_marketIdCR","getValueFromObjectArray","arrayObject","propertyId","mpcValue","map","obj","id","mpcId","x","EventLogger","logParameters","this","_siteRoot","siteRoot","_partnerId","partnerID","_marketId","marketId","_fromPage","fromPage","_communityId","communityId","_builderId","builderId","_planId","planId","_specId","specId","_homeSearchViewMetricDisplayed","homeSearchViewMetricDisplayed","_homeSearchViewMetricHidden","homeSearchViewMetricHidden","_partnerName","partnerName","_marketName","marketName","_communityName","communityName","_builderName","builderName","_performanceLogUrl","performanceLogUrl","_mpcCommunityId","isMpcCommunity","parentCommunityId","_parentCommunityId","_eventLoggerUrl","_timeOut","prototype","logListHubEvent","listHubProviderId","testkey","desckey","listingKey","ListHubTracker","provider","test","submit","err","logAndRedirect","eventCode","cid","bid","pid","sid","mid","external","logEvent","_redirect","logBasicListingAndRedirect","bsid","self","setTimeout","params","basiclistingId","logEventWithParameters","logWithParametersAndRedirect","parameters","_logViewWithParameters","logEventWithoutEcommerce","_logViewWithoutEcommerce","logBasicListingEvent","_logView","setAllowAddThis","logMultiEvent","logHomeResultsMetrics","logString","_logMetrics","attachEventsToAddThis","addthis","evt","serviceShared","service","toString","toLowerCase","hdPage","hasClass","logInfo","getLogInfo","commDetail","_parameters","homeDetail","newWin","isGaLoaded","handleLogEvent","isGaReady","areGaParamsNeeded","isAsync","async","result","createUrl","_logGoogleEcommerceEvent","builderCommunityList","homeList","commId","communityList","basicListingId","refer","totalHomes","basicListingList","bsId","dataPost","logsInChains","eventName","host","dataType","communitiesIdsList","homesIdsList","request","ex","Search","typeAheadUrl","callInitialize","functionAutoCompleteSelect","_typeAheadUrl","alreadyiInitialize","initialize","AutoCompleteSelect","on","slideDown","fadeIn","control","is","priceFormat","prefix","thousandsSeparator","centsLimit","insertPlusSign","limit","validateSearchBox","click","validateFuncion","showErrorSearchTextMessage","trim","show","homepageSearchText","removeAttr","megaMenuInputText","closest","isFromHomePage","isFromErrorPage","closeSlideDownPanel","textInput","text","String","hasError","isNaN","formElement","errorDiv","searchText","useAlert","selector","preventDefault","alert","setupSearchBox","textBoxName","typeElement","keypress","hide","addClass","searchTextBox","find","autocomplete","source","select","ui","item","Type","Name","focus","_renderItem","ul","escapeRegex","term","append","appendTo","menu","detach","mouseup","container","target","has","LeadModal","formSelector","leadFormSelector","checkCounts","phoneInput","VMasker","maskPattern","closeModalBtn","logFormAnalyticsEvent","zip","errorZipTextContent","attr","removeClass","textContent","prev","selectedOption","options","selectedIndex","removeAttribute","setAttribute","onChangeRealtorAnswer","body","modalContainer","style","display","loginSection","loginInputs","querySelectorAll","className","buttonForm","valid","formValidator","validateForm","leadForm","includeRecommendationsCommunities","realtorQuestionAnswerInput","selectedRealtorAnswerText","realtorQuestionAnswerId","dataset","eventForSegment","eventType","builder_id","builder_name","community_id","community","community_name","state","city","community_low_price","community_high_price","home_price","home_type","primary_image_url","isIdentifyEvent","button_action","realtor_question","dispatchEvent","CustomEvent","detail","IsAskQuestion","FromPage","IsAppt","requestedFromMediaViewer","isRequestVirtualTour","AppointmentType","serialize","IsSoldHome","Is55PlusLead","IsComingSoon","checked","isFullImageViewerLead","comments","GetCommentsData","isCustomLocation","IsCustomLocation","SendAskQuestionLead","postLeadSendFunc","initializeRecoModal","formData","FormData","dataEntries","Object","fromEntries","entries","recommendedModalCommand","MailAddress","Email","SpecId","PlanId","CommunityId","GenerateLeadFrom","ButtonNameSource","Phone","BuilderId","MarketId","UserPostalCode","postal","GeneralAjaxCallAction","BrochureUrl","emailAddress","phoneNumber","postalCode","livesOutside","LivesOutside","realtorQuestionAnswer","sendAlerts","errorMessages","sendSegmentEventFavorites","NewHomeSource","UserCredentials","isUserLogged","change","forEach","onRecommendationBoxChange","jsonForFormEvents","inputForGaForms","parse","html","ModalLoader","resetIsModalLoadedFlag","call","fragment","createRange","createContextualFragment","innerHTML","price_reduction","optionTextSelected","Array","from","comment","join","Element","matches","msMatchesSelector","webkitMatchesSelector","s","parentElement","parentNode","nodeType","MutationObserver","mutations","mutation","node","addedNodes","HTMLElement","button","isSearchPage","isBuilderShowcase","breadcrumb","signInButton","openedModal","_hide","hideModal","auth0Dom","signIn","removeChild","observe","documentElement","childList","subtree","inputsSelector","validateInput","inputField","isValidInput","pattern","getAttribute","errorElement","required","setCustomValidity","classList","add","errorRequiredMessage","errorInvalidMessage","clearFormErrors","errorElements","invalidInputs","remove","addErrorClassToEmailSuggestions","suggestionsContainer","avoidFocusFirstInput","inputsList","isValidForm","currentInput","firstInvalidElement","errorsList","displayFormErrors","clearForm","previousGoogleOneTapHandler","GoogleOneTapHandler","googleOneTapInstance","isGoogleOneTapLoaded","isGoogleOneTapLoading","onAuthenticated","onGoogleOneTapError","reject","Error","onGoogleOneTapLoaded","resolve","google","accounts","client_id","callback","cancel_on_tap_outside","itp_support","use_fedcm_for_prompt","appendGoogleOneTapScript","script","createElement","src","defer","onerror","bind","head","appendChild","loadGoogleOneTap","googleOneTapSetUpInformation","Promise","then","onLibraryLoaded","catch","onLibraryErrored","showGoogleOneTapModal","prompt","googleResponse","idToken","token","base64","jsonPayload","atob","character","charCodeAt","slice","parseJsonWebToken","credential","payload","locale","picture","email","givenName","given_name","familyName","family_name","subject","sub","audience","aud","emailVerified","email_verified","notBeforeTimeSeconds","nbf","hostedDomain","hd","issuer","iss","issuedAtTimeSeconds","iat","expirationTimeSeconds","exp","jwtId","jti","keepMeLogged","response","fetch","method","stringify","headers","Content-Type","ok","json","Success","googleOneTapClientId","isUserLoggedIn","readyState","cancel"],"mappings":"AA2CA,IAAAA,QACAC,MC5CAC,OAAAC,OAAA,CACAC,WAAA,SAAAC,OAAAC,OAAAC,MAAAC,MAAAC,WACAC,IAAAC,IAAAC,cAAAF,IAAAC,IAAAC,QAAAC,QACAF,IAAAC,QAAAC,OAAAC,aAAA,UAAAR,QACA,oBAAAS,WACAA,UAAAC,KAAA,CACAC,MAAA,UACAC,cAAAb,OACAc,YAAAb,OACAc,WAAAb,MACAc,gBAAAX,KAKAY,iBAAA,SAAAC,IAAAC,UACA,IAAAC,SAAA,yCAEA,IAAA,WACAD,SAAA,GAEAtB,OAAAwB,KAAA,CACAC,KAAA,MACAC,IAAAH,SACAI,KAAA,CAAAN,IAAAC,UACAM,QAAA,SAAAD,MACA,GAAA,IAAAA,MAAA,iBAAAA,KACA,GAAA,oBAAA,UAAA,CACA,IAAAE,QAAAF,KACAG,UAAAD,QAAAE,QAAA,YAAA,2BACAC,KAAAF,gBAGAE,KAAAL,OAGAM,MAAA,SAAAN,WAIAO,aAAA,SAAAb,IAAAf,OACA,oBAAAO,UACAA,UAAAC,KAAA,CAAAO,IAAAf,QAGA6B,OAAAC,OAAAvB,UAAAC,KAAA,CAAAO,IAAAf,WD3CA6B,OAAA1B,IAAA0B,OAAA1B,KAAA,GACA,oBAAAA,KAAA,OAAAA,MACAA,IAAA,SAGA,IAAAA,IAAAC,SAAA,OAAAD,IAAAC,UACAD,IAAAC,QAAA,SAGA,IAAAD,IAAAC,QAAAC,QAAA,OAAAF,IAAAC,QAAAC,SACAF,IAAAC,QAAAC,OAAA,SAGA,IAAAF,IAAAC,QAAAC,OAAA0B,MAAA,OAAA5B,IAAAC,QAAAC,OAAA0B,OACA5B,IAAAC,QAAAC,OAAA0B,KAAA,SAGA,IAAA5B,IAAAC,QAAA4B,SAAA,OAAA7B,IAAAC,QAAA4B,UACA7B,IAAAC,QAAA4B,QAAA,SAGA,IAAA7B,IAAAC,QAAA6B,kBAAA,OAAA9B,IAAAC,QAAA6B,mBACA9B,IAAAC,QAAA6B,iBAAA,SAGA,IAAA9B,IAAAC,QAAA8B,iBAAA,OAAA/B,IAAAC,QAAA8B,kBACA/B,IAAAC,QAAA8B,gBAAA,SAGA,IAAA/B,IAAAC,QAAA+B,YAAA,OAAAhC,IAAAC,QAAA+B,aACAhC,IAAAC,QAAA+B,WAAA,SAGA,IAAAhC,IAAAC,QAAAgC,aAAA,OAAAjC,IAAAC,QAAAgC,cACAjC,IAAAC,QAAAgC,YAAA,SAGA,IAAAjC,IAAAC,QAAAiC,aAAA,OAAAlC,IAAAC,QAAAiC,cACAlC,IAAAC,QAAAiC,YAAA,IAMA,IAAAC,IAAA5C,OAAA6C,aA+EA,SAAAC,OAAApB,KACAS,OAAAY,SAAAC,KAAAtB,IA9EA1B,OAAAiD,UAAAC,OAAA,WACAlD,OAAAmD,WAAA1C,IAAAC,QAAAC,OAAAyC,eACA3C,IAAAC,QAAAC,OAAAyC,kBAIA3C,IAAAC,QAAAC,OAAAyC,aAAA,WACAC,mBAAAC,WAEA,IAAAC,MAAAN,SAAAO,cAAA,0CAyBAD,OACAA,MAAAE,iBAAA,aAxBA,SAAAC,qBACA,IAAAhC,IAAAuB,SAAAU,eAAA,wBAAArD,MACAG,IAAAmD,OAAAlC,IAAA,IAAA,WAEA,MAAAmC,KAAAZ,SAAAU,eAAA,0BAEAE,MACA,IAAAC,oBAAA,CACAD,KACAE,wBAAA,EACAC,aAAAf,SAAAO,cAAA,iCACAS,0BAAA,EACAC,gBAAAjB,SAAAO,cAAA,iCAGA,IAAAW,SAAAlB,SAAAU,eAAA,gBACAQ,UACA1D,IAAA2D,QAAAD,SAAA7D,UAGAiD,MAAAc,oBAAA,YAAAX,wBAUAjD,IAAAC,QAAAC,OAAAC,aAAA,SAAA0D,KAAAhE,MAAAiE,MACA,GAAAA,KAAA,CACA,IAAAC,KAAA,IAAAC,KACAD,KAAAE,QAAAF,KAAAG,UAAA,GAAAJ,KAAA,GAAA,GAAA,KACA,IAAAK,QAAA,aAAAJ,KAAAK,mBAGAD,QAAA,GAGA3B,SAAA6B,OAAAR,KAAA,IAAAhE,MAAAsE,QAAA,sCAIAnE,IAAAC,QAAAC,OAAAoE,WAAA,SAAAT,MAGA,IAFA,IAAAU,OAAAV,KAAA,IACAW,GAAAhC,SAAA6B,OAAAI,MAAA,KACAC,EAAA,EAAAA,EAAAF,GAAAG,OAAAD,IAAA,CAEA,IADA,IAAAE,EAAAJ,GAAAE,GACA,KAAAE,EAAAC,OAAA,IAAAD,EAAAA,EAAAE,UAAA,EAAAF,EAAAD,QACA,GAAA,GAAAC,EAAAG,QAAAR,QAAA,OAAAK,EAAAE,UAAAP,OAAAI,OAAAC,EAAAD,QAEA,OAAA,MAIA3E,IAAAC,QAAAC,OAAA8E,YAAA,SAAAnB,MACA7D,IAAAC,QAAAC,OAAAC,aAAA0D,KAAA,IAAA,IAGA7D,IAAAC,QAAAC,OAAA+E,WAAA,SAAAC,GACA,IAAAA,EAAAA,EAAAxD,OAAApB,MACA4E,EAAAC,cAAA,EACAD,EAAAE,iBAAAF,EAAAE,mBAQA,IAAAxC,mBAAA,SAAAyC,GAEA,aACA,IAAAC,GAAA,GAmBA,SAAAC,cACA,IAVAC,IAUAC,QARA,QAFAD,KAAAE,OADA,2BACAC,KAAAC,mBAAAtD,SAAAuD,QAAA,CAAA,CAAA,OAAA,KAEA,SAAAL,MACAA,IAAA,IAGAA,KAKAM,OAAA,GAEA,MAAAL,QAAA,IAAAA,cACA,IAAAjD,SAAA,UAAA,IAAAA,SAAAuD,WACAD,OAAAtD,SAAAuD,UAGAV,EAAAtE,KAAA,CACAC,KAAA,MACAC,IA3BA,mBA4BAC,KAAA,CAAAuE,OAAAK,UACAE,MAAA,SAAA9E,WAcA,OALAoE,GAAAzC,SAAA,WACA0C,eAIAD,GAjDA,CAkDA/F,SEpLA,SAAA0G,OAAAC,SACA,aACA,mBAAAC,QAAAA,OAAAC,IAGAD,OAAA,IAAA,WACA,OAAAF,OAAAI,uBAAAH,QAAAD,WAEA,iBAAAK,QAIAC,OAAAD,QAAAL,OAAAI,uBAAAH,QAAAD,QAGAA,OAAAI,uBAAAH,QAAAD,QAfA,CAiBA,oBAAAvE,OAAAA,OAAA,IAAA,SAAA8E,MAIA,IAAAC,YAAA,GAsCA,OAFA/E,OAAAgF,OAxBA,WACAD,YAAA9B,OAAA,GAAA,mBAAA,IACAgC,IAAA,WAEA,IADA,IAAAC,gBAAAC,gBAAAC,0BAAA,IACApC,EAAA+B,YAAA9B,OAAA,EAAAD,GAAA,EAAAA,IAAA,CACA,IAAAzD,IAAAwF,YAAAM,MACAC,IAAA,IAAAC,eACAC,mBAAAjG,IAAA8D,QAAA,MACA,IAAAmC,mBACAjG,KAAA2F,gBAEA3F,IAAAA,IAAA6D,UAAA,EAAAoC,oBACAN,gBACA3F,IAAA6D,UAAAoC,mBAAAjG,IAAA0D,QAGAqC,IAAAG,KAAA,OAAAlG,KAAA,GACA+F,IAAAI,cAEAX,gBAOA,CACAY,aAnCA,SAAApG,KACAwF,aACAA,YAAApG,KAAAY,UC3BA,SAAAgF,OAAAC,SACA,aAEA,mBAAAC,QAAAA,OAAAC,IAGAD,OAAA,IACA,KACAF,OAAAY,gBAAAX,QAAAD,QACAA,OAAAY,mBAEA,iBAAAP,SAIAL,OAAAY,gBAAAX,QAAAD,QACAM,OAAAD,QAAAL,OAAAY,iBAGAZ,OAAAY,gBAAAX,QAAAD,QAnBA,CAqBA,oBAAAvE,OAAAA,OAAA,IAAA8E,OACA,aAEA,MAAAc,cAAA,WACA,MAAAC,UAAA,CACAC,cAAA,iBAOA,MAAA,CACAC,IALA,SAAA7G,KACA,OAAA2G,UAAA3G,OANA,GAqBA8G,yBAAA,SAAAC,MACA,MAAAH,cAAAF,cAAAG,IAAA,iBAEAG,SAAApB,KAAAG,GAAAkB,SAAAC,QAAAC,SAAAA,QAAAN,IAAA,gBAAAD,gBACAQ,OAAA,GAEA,IAAA,IAAAtD,EAAA,EAAAA,EAAAkD,SAAAjD,OAAAD,GAAA,EACA,IAAA,IAAAuD,EAAA,EAAAA,EAAAN,KAAAhD,OAAAsD,GAAA,EACAD,OAAAL,KAAAM,MAKAD,OAAAL,KAAAM,IAAAL,SAAAlD,GAAA+C,IAAAE,KAAAM,KAIA,OAAAD,QAyBA,MAAA,CACAlB,0BAvBA,SAAAoB,WACA,IAAAjH,IAAAiH,UACA,MAAAC,gBAAAT,yBAAA,CAAA,WAAA,WAEAU,gBAAArI,IAAAoI,gBAAAE,SACAF,gBAAAE,SACA,GACAC,cAAAvI,IAAAoI,gBAAAI,OACAJ,gBAAAI,OACA,GAUA,OARAH,aACAnH,IAAAA,IAAA,eAAAmH,YAGAE,WACArH,IAAAA,IAAA,aAAAqH,UAGArH,KAKAyG,6BCxFA,IAAAc,cAAA,EACAC,UAAA,EACAC,aAAA,EACAC,YAAA,EAqhBA,SAAAC,wBAAAC,YAAAC,YACA,IAAAC,SAAA,KAWA,OATAF,MAAAA,cACAE,SAAAF,YAAAG,KAAA,SAAAC,KACA,GAAAA,IAAAC,KAAAJ,YAAA,MAAAG,IAAAC,GACA,OAAAD,IAAAE,SAGArB,QAAA,SAAAsB,GAAA,YAAA,IAAAA,MAGA,OAAAL,eAAAhJ,IAAAgJ,SAAA,GAAA,KAAAA,SA/hBA/I,IAAAC,QAAA4B,QAAAwH,YAAA,SAAAC,eACAC,KAAAC,UAAAF,cAAAG,SACAF,KAAAG,WAAAJ,cAAAK,UACAJ,KAAAK,UAAAN,cAAAO,SACAN,KAAAO,UAAAR,cAAAS,SACAR,KAAAS,aAAAV,cAAAW,YACAV,KAAAW,WAAAZ,cAAAa,UACAZ,KAAAa,QAAAd,cAAAe,OACAd,KAAAe,QAAAhB,cAAAiB,OACAhB,KAAAiB,+BAAAlB,cAAAmB,8BACAlB,KAAAmB,4BAAApB,cAAAqB,2BACApB,KAAAqB,aAAAtB,cAAAuB,YACAtB,KAAAuB,YAAAxB,cAAAyB,WACAxB,KAAAyB,eAAA1B,cAAA2B,cACA1B,KAAA2B,aAAA5B,cAAA6B,YACA5B,KAAA6B,mBAAA9B,cAAA+B,kBACA9B,KAAA+B,iBAAA,IAAAhC,cAAAiC,eAAAjC,cAAAkC,kBAAA,EACAjC,KAAAkC,mBAAAnC,cAAAkC,kBACAjC,KAAAmC,gBAAA,wBACAnC,KAAAoC,SAAA,KAGA3L,IAAAC,QAAA4B,QAAAwH,YAAAuC,UACA,CAEAC,gBAAA,SAAAC,kBAAAC,QAAAC,QAAAC,YACA,IACA,IAAAC,eAAA,CAAAC,SAAAL,kBAAAM,KAAAL,UACAM,OAAAL,QAAAC,YACA,MAAAK,QAGAC,eAAA,SAAArH,EAAAjE,IAAAuL,UAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,UAIA,OAHAvD,KAAAK,UAAAiD,IACAtD,KAAAwD,SAAAP,UAAAC,IAAAC,IAAAC,IAAAC,KACArD,KAAAyD,UAAA9H,EAAAjE,IAAA6L,WACA,GAGAG,2BAAA,SAAA/H,EAAAjE,IAAAuL,UAAAU,KAAAL,KACA,IAAAM,KAAA5D,KAEA6D,YAAA,WACA,IAAAC,OAAA,CAAAC,eAAAJ,KAAArD,SAAAgD,KAGA,OAFAM,KAAAI,uBAAAf,UAAAa,QACAF,KAAAH,UAAA9H,EAAAjE,MACA,IACAkM,KAAAxB,WAGA6B,6BAAA,SAAAtI,EAAAjE,IAAAuL,UAAAa,OAAAP,UACA,IAAAK,KAAA5D,KAEA6D,YAAA,WAGA,OAFAD,KAAAI,uBAAAf,UAAAa,QACAF,KAAAH,UAAA9H,EAAAjE,IAAA6L,WACA,IACAK,KAAAxB,WAGA4B,uBAAA,SAAAf,UAAAiB,YACA,IAAAN,KAAA5D,KAEA6D,YAAA,WACA,GAAAZ,UAAA,CACA,IAAAvL,IAAAkM,KAAA3D,UAAA2D,KAAAzB,gBAAAc,UAEA,KAAAW,KAAA3D,UAAA1E,UAAAqI,KAAA3D,UAAA7E,OAAA,KACA1D,IAAA,IAAAA,KAGAkM,KAAAO,uBAAAzM,IAAAuL,UAAAiB,eAEAN,KAAAxB,WAGAgC,yBAAA,SAAAnB,UAAAiB,YACA,IAAAN,KAAA5D,KAEA6D,YAAA,WACA,GAAAZ,UAAA,CACA,IAAAvL,IAAAkM,KAAA3D,UAAA2D,KAAAzB,gBAAAc,UAEA,KAAAW,KAAA3D,UAAA1E,UAAAqI,KAAA3D,UAAA7E,OAAA,KACA1D,IAAA,IAAAA,KAGAkM,KAAAS,yBAAA3M,IAAAuL,UAAAiB,eAEAN,KAAAxB,WAGAkC,qBAAA,SAAArB,UAAAU,MACA,GAAAV,UAAA,CACA,IAAAvL,IAAAsI,KAAAC,UAAAD,KAAAmC,gBAAAc,UAEA,KAAAjD,KAAAC,UAAA1E,UAAAyE,KAAAC,UAAA7E,OAAA,KACA1D,IAAA,IAAAA,KAGAsI,KAAAuE,SAAA7M,IAAAuL,UAAA,EAAA,EAAA,EAAA,EAAAU,QAIAH,SAAA,SAAAP,UAAAC,IAAAC,IAAAC,IAAAC,KACA,GAAAJ,UAAA,CACA,IAAAvL,IAAAsI,KAAAC,UAAAD,KAAAmC,gBAAAc,UAEA,KAAAjD,KAAAC,UAAA1E,UAAAyE,KAAAC,UAAA7E,OAAA,KACA1D,IAAA,IAAAA,KAGAsI,KAAAuE,SAAA7M,IAAAuL,UAAAC,IAAAC,IAAAC,IAAAC,IAAA,KAIAmB,gBAAA,WACAvF,cAAA,EACA4E,YAAA,WACA5E,cAAA,IACA,MAGAwF,cAAA,SAAAxB,UAAAvC,YAAAE,UAAAE,OAAAE,QACA,GAAAiC,UAAA,CACA,IAAAvL,IAAAsI,KAAAC,UAAAD,KAAAmC,gBAAAc,UAEA,KAAAjD,KAAAC,UAAA1E,UAAAyE,KAAAC,UAAA7E,OAAA,KACA1D,IAAA,IAAAA,KAGAsI,KAAAuE,SAAA7M,IAAAuL,UAAAvC,YAAAE,UAAAE,OAAAE,OAAA,KAIA0D,sBAAA,SAAAzB,UAAA1M,MAGA,IAAAoO,UADA1B,YAIA0B,UADA,GAAApO,KACAyJ,KAAAiB,+BAGAjB,KAAAmB,4BAKAnB,KAAA4E,YAAA3B,UAAA0B,aAIAE,sBAAA,WACA,IAAAjB,KAAA5D,KAEA,oBAAA8E,SACAA,QAAArL,iBAAA,sBAAA,SAAAsL,KACA,GAAA9F,aAAA,CACA,IAAA+F,cAAAD,IAAApN,KAAAsN,QAAAC,WAAAC,cACAlC,UAAA,QACAmC,OAAAxB,KAAA/C,QAAA,GAAA+C,KAAA7C,QAAA,EAEA,IAAA,GAAAiE,cAAAxJ,QAAA,eAAA,GAAAwJ,cAAAxJ,QAAA,WAAA,GAAAwJ,cAAAxJ,QAAA,SAEAyH,UADA,GAAAW,KAAA/C,SAAA,GAAA+C,KAAA7C,SAAA,GAAA6C,KAAAnD,aACA,SAEA2E,OAAAxB,KAAA/C,QAAA,GAAA+C,KAAA7C,QAAA,GACA,QAAA,QAEA6C,KAAAa,cAAAxB,UAAAW,KAAAnD,aAAAmD,KAAAjD,WAAAiD,KAAA/C,QAAA+C,KAAA7C,cAEA,GAAAiE,cAAAxJ,QAAA,UAAA,EAEAyH,WADAmC,OAAAxB,KAAA/C,QAAA,GAAA+C,KAAA7C,QAAA,GACA,SAAA,SACA6C,KAAAa,cAAAxB,UAAAW,KAAAnD,aAAAmD,KAAAjD,WAAAiD,KAAA/C,QAAA+C,KAAA7C,SACA6C,KAAAY,uBACA,GAAAQ,cAAAxJ,QAAA,UAAA,EAAA,CAEAyH,WADAmC,OAAAxB,KAAA/C,QAAA,GAAA+C,KAAA7C,QAAA,GACA,QAAA,QAEA/K,OAAAgK,MAAAqF,SAAA,oBACApC,UAAAmC,OAAA,UAAA,WAGA,IAAAE,QAAA1B,KAAA2B,aAEA3B,KAAAI,uBAAAf,UAAAqC,SACA1B,KAAAY,wBAOAe,WAAA,WACA,IACAD,QACA,CACA5E,YAAAkD,KAAAnD,aACAG,UAAAgD,KAAAjD,WACAG,OAAA8C,KAAA/C,QACAG,OAAA4C,KAAA7C,SAWA,MATA,oBAAAyE,WAEAF,SADAE,WAAAC,aAAAD,WAAAtB,YACAoB,QAEA,oBAAAI,aAEAJ,SADAI,WAAAD,aAAAC,WAAAxB,YACAoB,SAGAA,SAIA7B,UAAA,SAAA9H,EAAAjE,IAAAiO,QACA,IAAAhK,EACAA,EAAAxD,OAAApB,MAGA,IACA4E,EAAAC,cAAA,EACA,MAAAmH,MAIApH,EAAAE,iBACAF,EAAAE,kBAGAnE,MACAiO,OACAxN,OAAAyF,KAAAlG,KAEAmM,YAAA,WAAA1L,OAAAY,SAAAC,KAAAtB,MAAA,OASAkO,WAAA,WACA,MAAA,mBAAA,IAAA,mBAAAxI,GAAA,QAYAyI,eAAA,SAAAnO,IAAAoO,UAAAC,kBAAAC,SACAF,WAGAC,oBACArO,IAAA4F,gBAAAC,0BAAA7F,MAEA1B,OAAAwB,KAAA,CAAAC,KAAA,OAAAC,IAAAuO,MAAAD,WALAlJ,uBAAAgB,aAAApG,MASAyM,uBAAA,SAAAzM,IAAAuL,UAAAiB,YAGA,oBAAAlE,KAAAO,YACA7I,IAEAsI,KAAAC,WAKA,IAAA6F,UAAA9F,KAAA4F,aAEAM,OAAAlG,KAAAmG,UAAAzO,IAAAwM,WAAA4B,WAEApF,YAAAwF,OAAAxF,YACAM,OAAAkF,OAAAlF,OACAF,OAAAoF,OAAApF,OAEApJ,IAAAwO,OAAAxO,IAEA,IAAAuO,OAAA,OACA,IAAA/B,WAAA+B,QACAA,MAAA/B,WAAA+B,OAGAjG,KAAAoG,yBAAAnD,UAAAvC,YAAAM,OAAAF,OAAA,KAAAoD,WAAAmC,qBAAAnC,WAAAoC,UAEAtG,KAAA6F,eAAAnO,IAAAoO,WAAA,EAAAG,QAGA5B,yBAAA,SAAA3M,IAAAuL,UAAAiB,YAGA,oBAAAlE,KAAAO,YACA7I,IAEAsI,KAAAC,WAKA,IAAA6F,UAAA9F,KAAA4F,aAIAlO,IAFAsI,KAAAmG,UAAAzO,IAAAwM,WAAA4B,WAEApO,IAEA,IAAAuO,OAAA,OACA,IAAA/B,WAAA+B,QACAA,MAAA/B,WAAA+B,OAGAjG,KAAA6F,eAAAnO,IAAAoO,WAAA,EAAAG,QAGAE,UAAA,SAAAzO,IAAAwM,WAAA4B,WACA,IAAApF,YAAA,EAAAM,OAAA,EAAAF,OAAA,EA6DA,OA3DAoD,WAAAtD,YACAlJ,IAAAA,IAAA,YAAAwM,WAAAtD,YAGAsD,WAAAxD,aAAAwD,WAAAqC,UACA7O,IAAAA,IAAA,eAAAwM,WAAAxD,aAAAwD,WAAAqC,QACA7F,YAAAwD,WAAAxD,aAAAwD,WAAAqC,QAGArC,WAAAsC,gBACA9O,IAAAA,IAAA,kBAAAwM,WAAAsC,eAGAtC,WAAA5D,WACA5I,IAAAA,IAAA,WAAAwM,WAAA5D,UAGA4D,WAAApD,SACApJ,IAAAA,IAAA,WAAAwM,WAAApD,OACAA,OAAAoD,WAAApD,QAGAoD,WAAAlD,SACAtJ,IAAAA,IAAA,WAAAwM,WAAAlD,OACAA,OAAAkD,WAAAlD,QAGA8E,YACApO,IAAA4F,gBAAAC,0BAAA7F,MAGAwM,WAAAjC,oBACAvK,IAAAA,IAAA,sBAAAwM,WAAAjC,mBAGAiC,WAAAuC,iBACA/O,IAAAA,IAAA,mBAAAwM,WAAAuC,gBAGAvC,WAAAwC,QACAhP,IAAAA,IAAA,UAAAwM,WAAAwC,OAGAxC,WAAAyC,aACAjP,IAAAA,IAAA,eAAAwM,WAAAyC,YAGAzC,WAAAmC,uBACA3O,IAAAA,IAAA,yBAAAwM,WAAAmC,sBAGAnC,WAAA0C,mBACAlP,IAAAA,IAAA,qBAAAwM,WAAA0C,kBAGA1C,WAAAoC,WACA5O,IAAAA,IAAA,aAAAwM,WAAAoC,UAGA,CACA5O,IACAgJ,YACAI,OACAE,SAIAuD,SAAA,SAAA7M,IAAAuL,UAAAC,IAAAC,IAAArC,OAAAE,OAAA6F,MACAnP,IAAA8D,QAAA,WAAA,IACA9D,IAAAA,IAAAK,QAAA,IAAA,IAAAA,QAAA,KAAA,MAGAiI,KAAAO,UAAA,IAGA6E,OAAAtE,OAAA,GAAAE,OAAA,EAEA,GAAAkC,KAAAkC,SACAlC,IAAAhE,WAGA,GAAAiE,KAAAiC,SACAjC,IAAAhE,cAGA,oBAAAa,KAAAO,YACA7I,IACAsI,KAAAC,UAAA,mBAEA,KAAAD,KAAAC,WACA,iBAAAvI,KAOAA,IADA,GAAAmP,KACAnP,IACA,YAAAyL,IACA,cAAAD,IACA,WAAApC,OACA,WAAAE,OACA,WAAAhB,KAAAK,UAEA3I,IAAA,mBAAAmP,KAAA,WAAA7G,KAAAK,UAGA,IAAAyF,UAAA9F,KAAA4F,aACA5F,KAAA6F,eAAAnO,IAAAoO,WAAA,GAAA,GAGA9F,KAAAoG,yBAAAnD,UAAAC,IAAAlC,OAAAF,OAAA,OAGA8D,YAAA,SAAA7N,MAAA4N,WACA,IAAAmC,SAAA,CAAAC,aAAApC,UAAAqC,UAAAjQ,OACAf,OAAAwB,KAAA,CACAC,KAAA,OACAC,IAAA,WAAAqB,SAAAkO,KAAA,uBACAtP,KAAAmP,SACAI,SAAA,UAIAd,yBAAA,SAAAY,UAAAtG,YAAAM,OAAAF,OAAAc,YAAAuF,mBAAAC,cACA,QAAA,IAAApH,KAAA6B,mBAAA,CAGA,IAAAiC,OAAA,CACAkD,UACAtG,iBAAA,IAAA,aAAA,MAAAA,YAAAA,YAAA,EACAM,YAAA,IAAA,QAAA,MAAAA,OAAAA,OAAA,EACAF,YAAA,IAAA,QAAA,MAAAA,OAAAA,OAAA,EACAc,YACAuF,mBACAC,cAIAtF,kBAAA9B,KAAA6B,mBAEA7L,OAAAwB,KAAA,CACAC,KAAA,OACAC,IAAAoK,kBACAnK,KAAAmM,OACAlM,QAAA,SAAAsO,QAEAlO,KAAAkO,aAKAhQ,WAAA,SAAAC,OAAAC,OAAAC,MAAAC,OAEAG,IAAAC,QAAAC,OAAAC,aAAA,UAAAR,OAAA,GACA,oBAAAS,WACAA,UAAAC,KAAA,CACAC,MAAA,UACAC,cAAAb,OACAc,YAAAb,OACAc,WAAAb,MACAc,gBAAAX,KAWAY,iBAAA,SAAAC,IAAAC,UACA,IACA,IAAAC,SAAA,yCAEA,IAAA,WACAD,SAAA,GAGAE,KAAA6P,QAAA,CACA5P,KAAA,MACAC,IAAAH,SACAI,KAAA,CACAN,IACAC,UAEAM,QAAA,SAAAD,MACA,GAAA,KAAAA,MAAA,iBAAAA,KACA,GAAA,oBAAA,UAAA,CACA,IAAAE,QAAAF,KACAG,UAAAD,QAAAE,QAAA,YAAA,2BACAC,KAAAF,gBAEAE,KAAAL,SAKA,MAAA2P,QCnhBAnP,OAAAsB,iBAAA,oBACA,WACAoK,YAAA,WACA,oBAAAzG,IACAA,GAAA,UAAA,QAEA,QCRA3G,IAAAC,QAAA6Q,OAAA,SAAAC,aAAAC,eAAAC,2BAAAxD,YACAlE,KAAA2H,cAAAH,aACAxH,KAAA4H,oBAAA,EACA5H,KAAAyF,YAAAvB,YACAuD,oBAAA,IAAAA,gBAAAA,iBAEAzH,KAAA6H,aAGA7H,KAAA8H,mBAAAJ,4BAIAjR,IAAAC,QAAA6Q,OAAAlF,UACA,CACAwF,WAAA,WACA,IAAAjE,KAAA5D,KACA,GAAA,GAAA4D,KAAAgE,mBAAA,CAEA5R,OAAA,eAAA+R,GAAA,SAAA,WACA/R,OAAA,0BAAAgS,UAAA,KAAA,WACAhS,OAAA,qCAAAiS,OAAA,WAGAjS,OAAA,kBAAA+R,GAAA,SAAA,WACA/R,OAAA,6BAAAgS,UAAA,KAAA,WACAhS,OAAA,wCAAAiS,OAAA,WAIAjS,OAAA,sDAAA+R,GAAA,SAAA,WACA,IAAAG,QAAAlS,OAAAgK,MACAkI,QAAAC,GAAA,WAAA,MAAAD,QAAAjM,OAAA,GAAAiM,QAAAjM,MAAAb,QACA8M,QAAAE,YAAA,CACAC,OAAA,IACAC,mBAAA,IACAC,WAAA,EACAC,gBAAA,EACAC,MAAA,OAKAzS,OAAA,qDAAA+R,GAAA,QAAA,WACA,IAAAG,QAAAlS,OAAAgK,MACAkI,QAAAC,GAAA,WAAA,MAAAD,QAAAjM,OAAA,GAAAiM,QAAAjM,MAAAb,QACA8M,QAAAE,YAAA,CACAC,OAAA,IACAC,mBAAA,IACAC,WAAA,EACAC,gBAAA,EACAC,MAAA,OAKAzI,KAAA0I,kBAAA1S,OAAA,mBAAAA,OAAA,uCAAAA,OAAA,mBAAA,GACAA,OAAA,8BAAA2S,OAAA,WAEA,IAAAC,gBAAAhF,KAAAiF,2BACAvS,MAAAN,OAAA,gCAAAiG,MACA,IAAA2M,gBAAAtS,SACAA,MAAAN,OAAA8S,KAAAxS,QACA8E,OAAA,GAAA,oCAAA9E,MAEA,OADAN,OAAAE,WAAA,gBAAA,gBAAA,2BACA,EAGAF,OAAA,+BAAA+S,OACA,IAAAC,mBAAAhT,OAAA,eAAAiG,IAAA,IAIA,OAHA+M,oBACAA,mBAAA/M,IAAA,IACAjG,OAAA,8BAAAiT,WAAA,aACA,KAGA,IAAAC,kBAAAlT,OAAA,gCACA4N,KAAA8E,kBAAAQ,kBAAAC,QAAA,QAAAnT,OAAA,+BAAAkT,mBAAA,QAEA,IAAAtF,KAAA6B,cACA7B,KAAA6B,YAAA2D,gBAAAxF,KAAA6B,YAAA4D,iBACAzF,KAAA0F,uBAKA1F,KAAAgE,oBAAA,IAIAiB,2BAAA,SAAAU,WACA,IAAAC,KAAAC,OAAAF,WAAAT,OAEAY,UAAA,EA2BA,YAzBA,IAAAF,MACA,IAAAA,KACAE,UAAA,GACA,GAAAF,KAAAhO,QAAA,MAAAmO,MAAAH,OAAA,GAAA,IAAArN,OAAA,mCAAA0G,KAAA2G,OAEAA,KAAAtO,MAAA,KAAAE,OAAA,IAAA,KAAAoO,KAAAtO,MAAA,KAAA,GAAA4N,QAAA,KAAAU,KAAAtO,MAAA,KAAA,GAAA4N,QAAAU,KAAAtO,MAAA,KAAA,GAAA4N,OAAA1N,OAAA,KAEA,GAAAoO,KAAAhO,QAAA,MAAA,GAAA,IAAAW,OAAA,kBAAA0G,KAAA2G,SADAE,UAAA,GAFAA,UAAA,EAqBAA,UAGAhB,kBAAA,SAAAkB,YAAAC,SAAAC,WAAAC,UACA,IAAAnG,KAAA5D,KACAhK,OAAA4T,aAAA7B,GAAA,UAAA,SAAApM,GACA,IAAA6N,KAAAxT,OAAA8T,WAAAE,UAAA/N,MAAA6M,OAEA,OADAlF,KACAiF,2BAAAW,QACA7N,EAAAsO,iBACAF,SACAG,MAAA,gCAEAlU,OAAA6T,UAAAd,OAEA/S,OAAA,gCAAAiG,IAAA,KACA,OAKAkO,eAAA,SAAAC,YAAAC,YAAAN,UACA,IAAAnG,KAAA5D,KACA+J,cAAA,IAAAA,UAAAA,SACA/T,OAAA,IAAAoU,aAAAE,UAAA,WACAtU,OAAA,2BAAAuU,OAAAC,SAAA,iCAIA,IAAAC,cAAAzU,OAAA,IAAAoU,aAEA,OAAAK,eAAAA,cAAArP,OAAA,IAEAwI,KAAA8E,kBAAA+B,cAAAtB,QAAA,QAAAsB,cAAAtB,QAAA,QAAAuB,KAAA,2BAAAD,cAAAV,UAEAU,cAAAE,aAAA,CACAC,OAAA5K,KAAA2H,cACAkD,OAAA,SAAA9T,MAAA+T,IACA/T,MAAAkT,iBACA,IAAA3T,MAAAwU,GAAAC,KAAAC,KACAxB,KAAAsB,GAAAC,KAAAE,KAEAjV,OAAA,IAAAqU,aAAApO,IAAA3F,OACAN,OAAA,IAAAoU,aAAAnO,IAAAuN,MACAxT,OAAAmD,WAAAyK,KAAAkE,qBACAlE,KAAAkE,mBAAAxR,MAAAkT,KAAA5F,OAGAsH,MAAA,SAAAnU,MAAA+T,IACA/T,MAAAkT,oBAEAtS,KAAA,mBAAAwT,YAAA,SAAAC,GAAAL,MAOA,OANAA,KAAA1U,MAAA0U,KAAAE,KACAF,KAAA1U,MAAA0U,KAAA1U,MAAA0B,QAAA,IAAAoE,OAAA,0BAAAnG,OAAA8U,GAAAH,aAAAU,YAAArL,KAAAsL,KAAAxC,QAAA,0BAAA,MAAA,mCAEA,GAAAiC,KAAA1U,MAAAmF,QAAA,UACAuP,KAAA1U,MAAA0U,KAAA1U,MAAAkF,UAAA,EAAAwP,KAAA1U,MAAAmF,QAAA,SAAA,wBAAAuP,KAAA1U,MAAAkF,UAAAwP,KAAA1U,MAAAmF,QAAA,QAAA,GAAA,WAEAxF,OAAA,aACA2B,KAAA,oBAAAoT,MACAQ,OAAA,MAAAR,KAAA1U,MAAA,QACAmV,SAAAJ,KAEAX,cAAAE,eAAAhT,KAAA,mBAAA8T,KAAAjN,QAAAkN,SAAAF,SAAAxV,OAAA,IAAAoU,aAAAhS,YAIAkR,oBAAA,WAEAtT,OAAAiD,UAAA0S,SAAA,SAAAhQ,GACA,IAAAiQ,UAAA5V,OAAA,uBACA4V,UAAAzD,GAAAxM,EAAAkQ,SACA,IAAAD,UAAAE,IAAAnQ,EAAAkQ,QAAAzQ,QAEApF,OAAA,0BAAAuU,OAEAvU,OAAA,6BACA4V,UAAA5V,OAAA,2BACAmS,GAAAxM,EAAAkQ,SACA,IAAAD,UAAAE,IAAAnQ,EAAAkQ,QAAAzQ,QAEApF,OAAA,6BAAAuU,aCzMA,IAAAwB,UAAA,SAAA7H,YACAlE,KAAAkE,WAAAA,WAEAlE,KAAAgM,aAAA,MAAA9H,WAAA+H,iBAAA,uBAAA/H,WAAA+H,kBAGAF,UAAA1J,UAAA,CACAwF,WAAA,WACA,IAAAjE,KAAA5D,KACAA,KAAAkM,YAAA,EACA,IAAArS,KAAA7D,OAAAgK,KAAAgM,cAEA,MAAAG,WAAAtS,KAAA,GAAAL,cAAA,gBACA2S,YAAAhU,OAAAiU,SACAjU,OAAAiU,QAAAD,YAAAE,YAAA,kBAGA,IAAAC,cAAArT,SAAAU,eAAA,kBACA2S,eACAA,cAAA7S,iBAAA,SAAA,WACAmK,KAAA2I,sBAAA,QAAA,cAIAvW,OAAAgK,KAAAgM,cAAAjE,GAAA,SAAA,iDAAA,WACA,IAAAyE,IAAAxW,OAAAgK,MAAAmJ,QAAA,wBAAAuB,KAAA,cACA+B,oBAAAxT,SAAAU,eAAA,+BACA3D,OAAAgK,MAAAmI,GAAA,aACAqE,IAAAE,KAAA,WAAA,YACAF,IAAAvQ,IAAA,IACAuQ,IAAAG,YAAA,aACAH,IAAAG,YAAA,iBACAF,oBAAAG,YAAA,GACA5W,OAAAgK,MAAAmJ,QAAA,wBAAAuB,KAAA,oBAAAiC,YAAA,mBAEAH,IAAAvD,WAAA,eAIAjT,OAAAgK,KAAAgM,cAAAjE,GAAA,QAAA,uBAAA,WACA,IAAAG,QAAAlS,OAAAgK,MACAkI,QAAAyE,YAAA,aACAzE,QAAA2E,KAAA,cAAAF,YAAA,qBAGA3W,OAAAgK,KAAAgM,cAAAjE,GAAA,SAAA,oBAAA,WACA/R,OAAAgK,MAAAmI,GAAA,aAAA,GAAAvE,KAAAsI,aACAzV,IAAAC,QAAAC,OAAAoE,aACA/E,OAAAE,WAAA,cAAAO,IAAAC,QAAAC,OAAAoE,WAAA,WAAA,iCACA6I,KAAAsI,kBAKAlW,OAAAgK,KAAAgM,cAAAjE,GAAA,QAAA,wBAAA,WACA/R,OAAAE,WAAA,cAAAO,IAAAC,QAAAC,OAAAoE,WAAA,WAAA,4CAIAlB,KAAA6Q,KAAA,wBAAAgC,KAAA,WAAA,YAEA1W,OAAAgK,KAAAgM,cAAAjE,GAAA,SAAA,wBAAA,WACA,IAAAG,QAAAlS,OAAAgK,MACAkI,QAAAjM,IAAAiM,QAAAC,GAAA,gBAcAnI,KAAAgM,cAAA/S,SAAAO,cAAAwG,KAAAgM,eACA/S,SAAAO,cAAAwG,KAAAgM,cAAAvS,iBAAA,UAAA1C,QACA,mBAAAA,MAAA8U,OAAAlM,IAbA,SAAA5I,OACA,IAAA+V,eAAA/V,MAAA8U,OAAAkB,QAAAhW,MAAA8U,OAAAkB,QAAAhW,MAAA8U,OAAAmB,eAAAjW,MAAA8U,OACA,GAAA9U,MAAA8U,OAAAkB,QACA,IAAA,IAAAvO,WAAAzH,MAAA8U,OAAAkB,QACAvO,QAAAyO,gBAAA,YAIAH,eAAAI,aAAA,WAAA,IAMAC,CAAApW,UAKAf,OAAAiD,SAAAmU,MAAArF,GAAA,QAAA,kBAAA,SAAAhR,OACA,IAAAsW,eAAAtW,MAAA8U,OAAA1C,QAAA,iBAEAkE,eAAA7T,cAAA,6BACA8T,MAAAC,QAAA,OAKA,IAHA,IAAAC,aAAAH,eAAA7T,cAAA,yBACAiU,YAAAD,aAAAE,iBAAA,iCAEAvS,EAAA,EAAAA,EAAAsS,YAAArS,SAAAD,EAEAsS,YAAAtS,GAAAwS,UAAAF,YAAAtS,GAAAwS,UAAA5V,QAAA,8BAAA,IAGAsV,eAAA7T,cAAA,8BACA8T,MAAAC,QAAA,OAEAC,aAAAF,MAAAC,QAAA,WAGAvX,OAAAgK,KAAAgM,cAAAjE,GAAA,QAAA,mBAAA,SAAAhR,OACA,IACA6W,WAAA5X,OADAgK,MACAmJ,QAAA,wBACA0E,MAAAC,cAAAC,aAAAH,WAAA,IACA,MAAAI,SAHAhO,KAGAmJ,QAAA,iBAEA,GAAA0E,MAAA,CACAD,WAAA5X,OAAAgK,MAAAmJ,QAAA,wBACA,MAAA8E,kCAAAD,SAAAxU,cAAA,oBACA0U,2BAAAF,SAAAxU,cAAA,yBACA2U,0BAAAD,4BAAAA,2BAAAlB,cAAA,EACAkB,2BAAAnB,QAAAmB,2BAAAlB,eAAAxD,KAAA,GACA4E,wBAAAF,2BACAA,2BAAAnB,QAAAmB,2BAAAlB,eAAA1W,MAAA,GAEA,IAAA+X,QAAArO,KAAAqO,QAEAC,gBAAA,CACAvX,MAAA,4BACAwX,UAAA,eACAC,WAAAH,QAAAG,WACAC,aAAAJ,QAAAI,aACAC,aAAAL,QAAAM,UACAC,eAAAP,QAAAO,eACAC,MAAAR,QAAAQ,MACAC,KAAAT,QAAAS,KACAC,oBAAAV,QAAAU,oBACAC,qBAAAX,QAAAW,qBACAC,WAAAZ,QAAAY,WACAC,UAAAb,QAAAa,UACAC,kBAAAd,QAAAc,kBACAC,iBAAA,EACAC,cAAAhB,QAAAgB,cACAC,iBAAAnB,2BAMA,GAJAlV,SAAAmU,KAAAmC,eAAAtW,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,qBAAA,CACAC,OAAA,CAAA9X,KAAA2W,oBAGA1K,KAAAM,WAAAwL,cAAA,CACA,IAAAtZ,QAAA,oBAAAwN,KAAAM,WAAAyL,SAAA,YAAA,QACA,+CACA3Z,OAAAE,WAAA,cAAAE,OAAA,qBAEAJ,OAAAE,WAAA,cAAA,GAAA,mCAGAM,IAAAoX,WAAAlD,KAAA,wBAAAzO,MACA2H,KAAAgM,QAAA,EAEAhM,KAAAgM,QAAA,EAGA,IAAAC,yBAAA,OAAA5W,SAAAU,eAAA,gCACA,IAAAV,SAAAU,eAAA,0BAEAmW,qBACA,OAAAlM,KAAAM,WAAA6L,iBAAA,OAAAnM,KAAAM,WAAA6L,gBAEApY,KAAAiW,WAAAlD,KAAA,mBAAAsF,YACA,wBACApC,WAAAlD,KAAA,wBAAAzO,MACA,kBACA2H,KAAAM,WAAAwL,cACA,kBACA9L,KAAAgM,OACA,yBACAC,yBACA,eACAjM,KAAAM,WAAA+L,WACA,iBACArM,KAAAM,WAAAgM,aACA,yBACAJ,qBACA,iBACAlM,KAAAM,WAAAiM,aAIAxY,KAAA,GADAA,KAAA,GADAA,KAAA,GAAAA,4CAAAsW,mCAAAA,kCAAAmC,qCACAhC,mDACApO,KAAAqO,QAAAgC,wBACA,MAAAC,SAAA1M,KAAA2M,gBAAA3C,WAAA,IACA0C,WACA3Y,KAAA,GAAAA,iBAAA2Y,YAGA,IAAApI,QAAAlS,OAAAgK,MACAwQ,iBAAA,SAAA5C,WAAAlD,KAAA,6BAAAzO,MAEA,GADAtE,KAAA8Y,iBAAAD,iBACAA,iBAAA,CACA,IAAA9Y,IAAAkW,WAAAlD,KAAA,2BAAAzO,MACA2H,KAAA8M,oBAAAxI,QAAAvQ,KAAAD,SACA,CACAtB,OAAA,MAAAwN,KAAAM,WAAAyM,iBACA/M,KAAAM,WAAAyM,iBACA/M,KAAAgN,oBAEA,MAAAC,SAAA,IAAAC,SAAA9C,UACA+C,YAAAC,OAAAC,YAAAJ,SAAAK,WAEAC,wBAAA,CACAC,YAAAL,YAAAM,MACAC,OAAAP,YAAAO,OACAC,OAAAR,YAAAQ,OACAC,YAAAT,YAAAS,YACA7B,SAAAoB,YAAApB,SACA8B,iBAAAV,YAAAU,iBACAC,iBAAAX,YAAAW,iBACAC,MAAAZ,YAAAY,MACAC,UAAAb,YAAAa,UACAC,SAAAd,YAAAc,SACAC,eAAAf,YAAAgB,OACA9G,KAAA8F,YAAAzW,MAIArB,SAAAsW,cAAA,IAAAC,YAAA,uBAAA,CACAC,OAAA,CAAA9X,KAAAwZ,4BAGAvN,KAAAoO,sBAAA9J,QAAAvQ,KAAAiM,KAAAM,WAAA+N,YAAA7b,QAEA6C,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,eAAA,CACAC,OAAA,CACAnV,KAAAyW,YAAAzW,KACA4X,aAAAnB,YAAAM,MACAc,YAAApB,YAAAY,MACAS,WAAArB,YAAAgB,OACAM,aAAA,QAAAtB,YAAAuB,aACAC,sBAAAnE,wBACAoE,WAAAvE,kCAAAA,kCAAAmC,QAAA,eAMA,IADA,IAAAqC,cAAA7E,WAAA,GAAAF,iBAAA,kBACAvS,EAAA,EAAAA,EAAAsX,cAAArX,OAAAD,IACAsX,cAAAtX,GAAAmS,MAAAC,QAAA,YAUAmF,0BAAA,SAAAlU,SACA,IAAAA,UAAArG,OAAAwa,cAAAC,gBACA,QAGAza,OAAAwa,cAAAC,gBAAAC,iBAAA,IAGA5Z,SAAAmU,KAAAmC,eACAtW,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,yBAAA,CACAC,OAAA,CAAA9X,KAAA6G,aAKAoS,oBAAA,SAAApS,SACA,IAAAoF,KAAA5D,KACA,GAAAhK,OAAA,qBAAAoF,OAAA,EAAA,CAEApF,OAAA,4CAAA8c,QAAA,WACA9c,OAAA,4CAAAmS,GAAA,aACAnS,OAAA,+DAAA2W,YAAA,YACA3W,OAAA,+DAAAiT,WAAA,cAEAjT,OAAA,+DAAAwU,SAAA,YACAxU,OAAA,+DAAA0W,KAAA,WAAA,gBAIA,IAAAJ,cAAArT,SAAAU,eAAA,kBACA2S,eACAA,cAAA7S,iBAAA,SAAA,WACAmK,KAAA2I,sBAAA,QAAA,WAIAtT,SAAAyU,iBAAA,+BACAqF,SAAAvU,UACAA,QAAA/E,iBAAA,SAAAmK,KAAAoP,8BAIApP,KAAA8O,0BAAAlU,QAAA,KAGAwU,0BAAA,SAAAjc,OACAA,MAAA8U,OAAAuE,SACAnX,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,6BAIAjD,sBAAA,SAAAnW,OAAAC,OACA,IAAA4c,kBACAC,gBAAAja,SAAAU,eAAA,yBAEAuZ,iBAAA,KAAAA,gBAAA5c,OAAA6B,OAAAiF,KACA6V,kBAAA5a,KAAA8a,MAAAD,gBAAA5c,OACA8G,GAAA,YAAA,QAAA,mBAAA/E,KAAA8a,MAAAF,kBAAA,IAAA7c,QAAAiC,KAAA8a,MAAAF,kBAAA,IAAA5c,UAIA2b,sBAAA,SAAA9J,QAAAvQ,KAAAD,IAAAtB,QACA,IAAAwN,KAAA5D,KACAkI,QAAAwE,KAAA,WAAA,YAEA1W,OAAAwB,KAAA,CACAE,IACAD,KAAA,OACAE,KACAC,QAAA,SAAAwb,MAKA,GAJAjb,OAAAwa,cAAAU,aACAlb,OAAAwa,cAAAU,YAAAC,yBAGA,MAAA1P,KAAAM,WAAAyM,kBAAA,iBAAAyC,UACA,IAAA,QACAhd,OAAAmd,KAAA3P,KAAAwP,WAGA,GAAA,iBAAAA,KAAA,CACA,MAAAxH,UAAA3S,SAAAO,cAAA,6BAEA,GAAAoS,UAAA,CACA,MAAA4H,SAAAva,SAAAwa,cAAAC,yBAAAN,MACAxH,UAAA+H,UAAA,GACA/H,UAAAL,OAAAiI,UACA5H,UAAA0B,MAAAC,QAAA,YAGA,IAAA,QACAnX,OAAAmd,KAAA3P,KAAAsE,SAGAjP,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,qBAAA,CACAC,OAAA,CACA9X,KAAA,CACA4W,UAAA,UACAqF,gBAAA,UAKA3b,MAAA,WACAiQ,QAAAe,WAAA,gBAUAsH,gBAAA,SAAA1W,MACA,MAAAga,mBAAAC,MAAAC,KAAAla,KAAA6T,iBAAA,kCAAAjO,KAAAI,GAAAA,EAAAwO,QAAA2F,UAAAC,KAAA,MAEA,OAAAJ,mBAAAzY,OAAA,EACA,kBAAAyY,sBAGAA,oBAGAnD,oBAAA,SAAAxI,QAAAvQ,KAAAD,KACA,MAAAkM,KAAA5D,KACAkI,QAAAwE,KAAA,WAAA,YACA1W,OAAAwB,KAAA,CACAE,IACAD,KAAA,OACAE,KACAC,QAAA,SAAAwb,MACAjb,OAAAwa,cAAAU,aACAlb,OAAAwa,cAAAU,YAAAC,yBAEA1P,KAAA8O,0BAAAxK,QAAA,IACAlS,OAAA,oBAAAod,KAAAA,MACAna,SAAAmU,KAAAmC,cAAA,IAAAC,YAAA,qBAAA,CACAC,OAAA,CACA9X,KAAA,CACA4W,UAAA,UACAqF,gBAAA,aASA,WACA,aAEA,mBAAAhX,QAAAA,OAAAC,IAIAD,OAAA,IAAA,WACA,OAAAmP,aAEA,iBAAAhP,QAIAC,OAAAD,QAAAgP,WAIA,oBAAAtV,KAAA,OAAAA,MACAA,IAAA,SAEA,IAAAA,IAAAC,SAAA,OAAAD,IAAAC,UACAD,IAAAC,QAAA,IAGAD,IAAAC,QAAAqV,UAAAA,WAIAmI,QAAA7R,UAAA8R,UACAD,QAAA7R,UAAA8R,QAAAD,QAAA7R,UAAA+R,mBACAF,QAAA7R,UAAAgS,uBAGAH,QAAA7R,UAAA8G,UACA+K,QAAA7R,UAAA8G,QAAA,SAAAmL,GACA,IAAA9V,QAAAwB,KAEA,EAAA,CACA,GAAAxB,QAAA2V,QAAAG,GACA,OAAA9V,QAEAA,QAAAA,QAAA+V,eAAA/V,QAAAgW,iBACA,OAAAhW,SAAA,IAAAA,QAAAiW,UAEA,OAAA,OAyDA,IAAAC,kBAhDA,SAAAC,WACAA,UAAA5B,SAAA6B,WACA,IAAA,MAAAC,QAAAD,SAAAE,WACA,GAAAD,gBAAAE,cAEAF,KAAAV,QAAA,2BAAAU,KAAA1L,QAAA,2BAAA0L,KAAArb,cAAA,2BAAA,CACA,MAAAwb,OAAAH,KAAArb,cAAA,yBACAyb,aAAAhc,SAAAO,cAAA,mBACA0b,kBAAAjc,SAAAO,cAAA,4CACA2b,WAAAlc,SAAAO,cAAA,6CACA4b,aAAAP,KAAArb,cAAA,kBAuBA,GArBA4b,cACAA,aAAA3b,iBAAA,SAAA,KACAtB,OAAAkd,YAAAC,QACAnd,OAAAwa,eAAAxa,OAAAwa,cAAAU,aACAlb,OAAAwa,cAAAU,YAAAkC,YAEApd,OAAAqd,SAAAC,OAAA,OAKAR,cACAD,OAAAvb,iBAAA,SAAA1C,QACAA,MAAAkT,iBACA9R,OAAAwa,eAAAxa,OAAAwa,cAAAU,aACAlb,OAAAA,OAAAwa,cAAAU,YAAAkC,eAMAP,SAAAA,OAAAhc,MAAAmc,WAAA,CACA,MAAAzd,IAAAyd,WAAAnc,KACAgc,OAAAhc,KAAAtB,IAIAsd,QAAAE,mBACAF,OAAAT,cAAAmB,YAAAV,eASAW,QAAA1c,SAAA2c,gBAtDA,CACAC,WAAA,EACAC,SAAA,IAnDA,GChZA,SAAApZ,OAAAC,SACA,aAEA,mBAAAC,QAAAA,OAAAC,IAGAD,OAAA,IAAA,WACA,OAAAF,OAAAoR,cAAAnR,aAEA,iBAAAI,QAIAC,OAAAD,QAAAL,OAAAoR,cAAAnR,UAGAD,OAAAoR,cAAAnR,UAhBA,CAkBA,oBAAAxE,OAAAA,OAAA,IAAA,WACA,aAEA,IAAA4d,eAAA,mKAEAC,cAAA,SAAAC,YACA,IAAA1c,MAAA0c,WACA1c,MAAAjD,MAAAiD,MAAAjD,MAAAwS,OACA,IAAAoN,cAAA,EACAC,QAAA,IAAAha,OAAA5C,MAAA6c,aAAA,iBACAC,aAAA9c,MAAAgb,cAAA/a,cAAA,yBACAD,MAAAgb,cAAAA,cAAA/a,cAAA,yBACAD,MAAAgb,cAAA/a,cAAA,0BAEA,IAAAD,MAAA+c,WAAA,KAAA/c,MAAAjD,OAAA,OAAAiD,MAAA6c,aAAA,iBAAAD,QAAAtT,KAAAtJ,MAAAjD,SACAiD,MAAA+c,UAAAH,QAAAtT,KAAAtJ,MAAAjD,QACAiD,MAAA+c,UAAA,MAAA/c,MAAA6c,aAAA,iBAAA7c,MAAAjD,MAAAwS,OAAA1N,OAAA,EACAib,aAAAzJ,YAAA,GACArT,MAAA0T,gBAAA,gBACAgJ,WAAAM,kBAAA,SAOA,GALAL,cAAA,EACA3c,MAAA2T,aAAA,gBAAA,GACA3T,MAAA2T,aAAA,mBAAAmJ,aAAA1W,IACApG,MAAAid,UAAAC,IAAA,aAEAld,MAAA+c,UAAA,KAAA/c,MAAAjD,MAAA,CACA,MAAAogB,qBAAAL,aAAAD,aAAA,yBACAC,aAAAzJ,YAAA8J,qBACAT,WAAAM,kBAAAG,0BACA,CACA,MAAAC,oBAAAN,aAAAD,aAAA,wBACAC,aAAAzJ,YAAA+J,oBACAV,WAAAM,kBAAAI,qBAIA,OAAAT,cAWAU,gBAAA,SAAA/c,MACA,IAAAgd,cAAAhd,KAAA6T,iBAAA,wBACAoJ,cAAAjd,KAAA6T,iBAAA,2CAEA,IAAA,IAAAvS,EAAA,EAAAA,EAAA2b,cAAA1b,OAAAD,GAAA,EACA2b,cAAA3b,GAAA8R,gBAAA,gBACA6J,cAAA3b,GAAA8R,gBAAA,oBACA6J,cAAA3b,GAAAqb,UAAAO,OAAA,aAGA,IAAA,IAAA5b,EAAA,EAAAA,EAAA0b,cAAAzb,OAAAD,GAAA,EACA0b,cAAA1b,GAAAyR,YAAA,IAaA,SAAAoK,gCAAAnd,MACA,MAAAod,qBAAApd,KAAA0a,cAAA/a,cAAA,gCAEAyd,sBACAA,qBAAAT,UAAAC,IAAA,oBA8DA,MAAA,CACA1I,aA3DA,SAAAlU,KAAAqd,sBACA,IAAAC,WAAAtd,KAAA6T,iBAAAqI,gBACAqB,aAAA,EAEAR,gBAAA/c,MAEA,IAAA,IAAAsB,EAAA,EAAAA,EAAAgc,WAAA/b,OAAAD,GAAA,EAAA,CACA,IACA+a,aADAmB,aAAAF,WAAAhc,GAMA,OAJAkc,aAAA/c,KAAA6K,eAKA,IAAA,QACA,IAAA,QACA,IAAA,YACA,IAAA,WACA,IAAA,QACA,IAAA,OACA,IAAA,OACA,IAAA,SACA,IAAA,UACA,IAAA,WACA,IAAA,kBACA,IAAA,gBACA,IAAA,QACA,IAAA,kBACA,IAAA,kBACA,IAAA,cACA,IAAA,uBACA,IAAA,eACA,IAAA,mBACA+Q,aAAAF,cAAAqB,cACAD,YAAAA,aAAAlB,aACA,MACA,IAAA,QACA,IAAA,cACAA,aAAAF,cAAAqB,cACAD,YAAAA,aAAAlB,aACAc,gCAAAnd,OAMA,IAAAud,cAAA,IAAAF,qBAAA,CACA,IAAAI,oBAAAzd,KAAAL,cAAA,8BACA8d,qBACAA,oBAAApM,QAMA,OA/FA,WACA,IAAAqM,WAAAte,SAAAyU,iBAAA,wBAEA,IAAA,IAAAvS,EAAA,EAAAA,EAAAoc,WAAAnc,OAAAD,GAAA,EACAoc,WAAApc,GAAAmS,MAAAC,QAAA,QAyFAiK,GAEAJ,aAKAK,UA7EA,SAAA5d,MACA,IAAAsd,WAAAtd,KAAA6T,iBAAAqI,gBACA,IAAA,IAAA5a,EAAA,EAAAA,EAAAgc,WAAA/b,OAAAD,GAAA,EACAgc,WAAAhc,GAAA7E,MAAA,GAGAsgB,gBAAA/c,OAwEA+c,oBCrJA,SAAAla,QACA,aAEAA,OAAAiW,cAAAjW,OAAAiW,eAAA,GAEA,MAAA+E,4BAAAhb,OAAAiW,cAAAgF,oBACA,IAAAA,oBAAA,GAEA,MAAAC,qBAAA,CACAC,sBAAA,EACAC,uBAAA,EACAhZ,SAAA,KACAiZ,gBAAA,MAUAC,oBAAAC,SACAL,qBAAAE,uBAAA,EACAF,qBAAAC,sBAAA,EACAI,OAAA,IAAAC,MAAA,wCAQAC,qBAAAC,UACAjgB,OAAAkgB,OAAAC,SAAA3Y,GAAAkI,WAAA,CACA0Q,UAAAX,qBAAA9Y,SACA0Z,SAAAZ,qBAAAG,gBACAU,uBAAA,EAGAC,aAAA,EACAC,sBAAA,IAEAf,qBAAAC,sBAAA,EACAO,WAUAQ,yBAAA,CAAAR,QAAAH,UACA,MAAAY,OAAA5f,SAAA6f,cAAA,UACAD,OAAAE,IAAA,yCACAF,OAAA5S,OAAA,EACA4S,OAAAG,OAAA,EACAH,OAAAI,QAAAjB,oBAAAkB,KAAAlZ,KAAAiY,QACAY,OAAA1b,OAAAgb,qBAAAe,KAAAlZ,KAAAoY,SACAnf,SAAAkgB,KAAAC,YAAAP,SAQAhB,qBAAAO,UACAR,qBAAAC,qBACAO,UAEAvU,WAAAgU,qBAAAqB,KAAA,KAAAd,SAzDA,MA8EA,SAAAiB,iBAAAC,8BAIA,OAHA1B,qBAAA9Y,SAAAwa,6BAAAxa,SACA8Y,qBAAAG,gBAAAuB,6BAAAvB,gBAEAH,qBAAAE,sBAQAF,qBAAAC,qBAEA0B,QAAAnB,UACAoB,KAAAF,6BAAAG,iBACAC,MAAAJ,6BAAAK,kBA7BA,IAAAJ,SAAAnB,UACAvU,WAAAgU,qBAAAqB,KAAA,KAAAd,SAlEA,QAmGAoB,KAAAF,6BAAAG,iBACAC,MAAAJ,6BAAAK,mBAhBA/B,qBAAAE,uBAAA,EACA,IAAAyB,QAAAX,0BACAY,KAAAF,6BAAAG,iBACAC,MAAAJ,6BAAAK,mBAmBA,SAAAC,wBACAzhB,OAAAkgB,OAAAC,SAAA3Y,GAAAka,SAqBA,MAeA9B,gBAAA9R,MAAA6T,iBACA,MAAAC,QAhBA,CAAAC,QACA,MACAC,OADAD,MAAA9e,MAAA,KAAA,GACAnD,QAAA,KAAA,KAAAA,QAAA,KAAA,KACAmiB,YAAA7d,mBAAAlE,OAAAgiB,KAAAF,QACA/e,MAAA,IACAuE,KAAA2a,WAAA,KAAA,KAAAA,UAAAC,WAAA,GAAAnV,SAAA,KAAAoV,OAAA,KACArG,KAAA,KAEA,OAAA5b,KAAA8a,MAAA+G,cAQAK,CAAAT,eAAAU,YACAtW,WAAA,CACAuW,QAAA,CACAC,OAAAX,QAAAW,OACAC,QAAAZ,QAAAY,QACAC,MAAAb,QAAAa,MACAtgB,KAAAyf,QAAAzf,KACAugB,UAAAd,QAAAe,WACAC,WAAAhB,QAAAiB,YACAC,QAAAlB,QAAAmB,IACAC,SAAApB,QAAAqB,IACAC,cAAAtB,QAAAuB,eACAC,qBAAAxB,QAAAyB,IACAC,aAAA1B,QAAA2B,GACAC,OAAA5B,QAAA6B,IACAC,oBAAA9B,QAAA+B,IACAC,sBAAAhC,QAAAiC,IACAC,MAAAlC,QAAAmC,KAEAC,cAAA,GAGAC,eAAAC,MAAA,0BAAA,CACAC,OAAA,OACAlP,KAAA/U,KAAAkkB,UAAArY,YACAsY,QAAA,CACAC,eAAA,sBAIA,GAAAL,SAAAM,GAAA,CACA,MAAA/kB,WAAAykB,SAAAO,OAEAhlB,MAAAA,KAAAilB,SACAzkB,OAAAY,SAAAD,WAUA+O,WAAA,KACA,MAAAgV,qBAAA5jB,SAAAO,cAAA,6BAGAsjB,gBAAA7jB,SAAAO,cAAA,kBAEA,GAAAqjB,uBAAAC,eAAA,CAQAzD,iBAPA,CACAI,gBAAAG,sBACAD,iBAAA,KACA5B,gBACAjZ,SAAA+d,qBAAAvmB,UAUAqhB,oBAAA,KACA,aAAA1e,SAAA8jB,WACAlV,aAEAnL,OAAAjD,iBAAA,OAAAoO,aASA8P,oBAAA9e,WAAA,WAEA,OADA6D,OAAAiW,cAAAgF,oBAAAD,4BACAC,qBAGAA,sBAEA1e,SAAAQ,iBAAA,eAAA,KAnHAtB,OAAAkgB,QAAAlgB,OAAAkgB,OAAAC,UACAngB,OAAAkgB,OAAAC,SAAA3Y,GAAAqd,YAnIA,CA0PA7kB","file":"../nhsshell2014topbundle-e2719c7619.min.js","sourceRoot":"..","sourcesContent":["//NameSpace Declaration \r\n\r\nwindow.NHS = window.NHS || {};\r\nif (\"undefined\" === typeof NHS || null === NHS) {\r\n NHS = {};\r\n}\r\n\r\nif (\"undefined\" === typeof NHS.Scripts || null === NHS.Scripts) {\r\n NHS.Scripts = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.Helper || null === NHS.Scripts.Helper) {\r\n NHS.Scripts.Helper = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.Helper.JSON || null === NHS.Scripts.Helper.JSON) {\r\n NHS.Scripts.Helper.JSON = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.Globals || null === NHS.Scripts.Globals) {\r\n NHS.Scripts.Globals = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.CommunityResults || null === NHS.Scripts.CommunityResults) {\r\n NHS.Scripts.CommunityResults = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.CommunityDetail || null === NHS.Scripts.CommunityDetail) {\r\n NHS.Scripts.CommunityDetail = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.HomeDetail || null === NHS.Scripts.HomeDetail) {\r\n NHS.Scripts.HomeDetail = {};\r\n} \r\n\r\nif (\"undefined\" === typeof NHS.Scripts.PropertyMap || null === NHS.Scripts.PropertyMap) {\r\n NHS.Scripts.PropertyMap = {};\r\n}\r\n\r\nif (\"undefined\" === typeof NHS.Scripts.MediaPlayer || null === NHS.Scripts.MediaPlayer) {\r\n NHS.Scripts.MediaPlayer = {};\r\n}\r\n\r\nvar tempNum;\r\nvar fromP;\r\n//Renaming the $ function\r\nvar $jq = jQuery.noConflict();\r\n\r\njQuery(document).ready(function () {\r\n if (jQuery.isFunction(NHS.Scripts.Helper.initMegaMenu)) {\r\n NHS.Scripts.Helper.initMegaMenu();\r\n }\r\n});\r\n\r\nNHS.Scripts.Helper.initMegaMenu = function () {\r\n ReferModuleHandler.SetRefer();\r\n\r\n var input = document.querySelector('[data-component=\"search-autocomplete\"]');\r\n\r\n function attachSearchEvents() {\r\n var url = document.getElementById(\"typeaheadComponentJs\").value;\r\n NHS.loadJs(url, \"\", function () {\r\n\r\n const form = document.getElementById(\"nhs_megaMenuSearchForm\");\r\n\r\n if(form)\r\n var search = new SearchFormComponent({\r\n form: form,\r\n shouldAlwaysSubmitForm: true,\r\n submitButton: document.querySelector(\"[data-search-submit-megamenu]\"),\r\n useAutocompleteForSubmit: true,\r\n validationError: document.querySelector(\"#nhs_field_validation_error\")\r\n });\r\n\r\n var cssInput = document.getElementById(\"typeAheadCss\");\r\n if(cssInput){\r\n NHS.loadCss(cssInput.value);\r\n }\r\n });\r\n input.removeEventListener(\"mouseover\", attachSearchEvents);\r\n }\r\n\r\n if (input) {\r\n input.addEventListener(\"mouseover\", attachSearchEvents);\r\n }\r\n\r\n}\r\n\r\n// Cookies Write Function\r\nNHS.Scripts.Helper.createCookie = function (name, value, days) {\r\n if (days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n var expires = \"; expires=\" + date.toGMTString();\r\n }\r\n else {\r\n var expires = \"\";\r\n }\r\n\r\n document.cookie = name + \"=\" + value + expires + \"; path=/; domain=newhomesource.com\";\r\n};\r\n\r\n// Cookies Read Function\r\nNHS.Scripts.Helper.readCookie = function (name) {\r\n var nameEQ = name + \"=\";\r\n var ca = document.cookie.split(\";\");\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) == \" \") c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n};\r\n\r\n// Cookies Erase Function\r\nNHS.Scripts.Helper.eraseCookie = function (name) {\r\n NHS.Scripts.Helper.createCookie(name, \"\", -1);\r\n};\r\n\r\nNHS.Scripts.Helper.stopBubble = function (e) {\r\n if (!e) var e = window.event;\r\n e.cancelBubble = true;\r\n if (e.stopPropagation) e.stopPropagation();\r\n};\r\n\r\nfunction reload(url) {\r\n window.location.href = url;\r\n}\r\n\r\n//This code just check for the refer after a # in the url, if is pass by QueryString or post the controller handle that\r\nvar ReferModuleHandler = (function ($) {\r\n /// the $ is just to handle a common way for jQuery, under this scope\r\n \"use strict\";\r\n var my = {}; // This is our internal object where we define the \r\n\r\n ///Private Properties \r\n var finalUrl = \"/common/setrefer\";\r\n ///END Private Properties\r\n\r\n ///Private Methods\r\n function getHashTagRefer() {\r\n var parameterName = \"refer\";\r\n var exp = \"[#|&]\" + parameterName + \"=\" + \"([^&]+)(&|$)\";\r\n var val = (RegExp(exp).exec(decodeURIComponent(location.hash)) || [, null])[1];\r\n\r\n if (val === null || val === \"null\") {\r\n val = \"\";\r\n }\r\n\r\n return val;\r\n }\r\n\r\n function setReferTag() {\r\n var refVal = getHashTagRefer();\r\n var refUrl = \"\";\r\n\r\n if (refVal != null && refVal != \"\") {\r\n if (typeof (document.referrer) != \"undefined\" && document.referrer != \"\") {\r\n refUrl = document.referrer;\r\n }\r\n\r\n $.ajax({\r\n type: \"GET\",\r\n url: finalUrl,\r\n data: { refVal: refVal, refUrl: refUrl }\r\n }).done(function (data) {\r\n //...do something here if is required \r\n });\r\n }\r\n }\r\n ///END Private Methods\r\n\r\n\r\n ///Public Methods\r\n my.SetRefer = function () {\r\n setReferTag();\r\n };\r\n ///END Public Methods\r\n\r\n return my; //return the object when you define your public logic\r\n}(jQuery));","jQuery.extend({\r\n googlepush: function (events, action, label, value, flag) {\r\n if (NHS.Scripts !== undefined && NHS.Scripts.Helper !== undefined) \r\n NHS.Scripts.Helper.createCookie(\"CTAName\", action);\r\n if (typeof dataLayer != 'undefined') {\r\n dataLayer.push({\r\n 'event': 'GAEvent',\r\n 'eventCategory': events,\r\n 'eventAction': action,\r\n 'eventLabel': label,\r\n 'eventValue': undefined\r\n });\r\n }\r\n },\r\n \r\n SetDataLayerPair: function (key, optValue) {\r\n var finalUrl = \"/GoogleAnalytics/SetDataLayerPair\";\r\n\r\n if (typeof (optValue) == 'undefined')\r\n optValue = 0;\r\n \r\n jQuery.ajax({\r\n type: \"GET\",\r\n url: finalUrl,\r\n data: { key: key, optValue: optValue },\r\n success: function (data) {\r\n if (data != \"\" && typeof data === 'string') {\r\n if (typeof (dataLayer) == 'undefined') {\r\n var tmpData = data;\r\n var finalData = tmpData.replace(\"dataLayer\", \"window.parent.dataLayer\");\r\n eval(finalData);\r\n }\r\n else\r\n eval(data); \r\n }\r\n },\r\n error: function (data) {\r\n }\r\n });\r\n },\r\n SetDataLayer: function(key, value) {\r\n if (typeof dataLayer != 'undefined') {\r\n dataLayer.push({ key: value });\r\n }\r\n else {\r\n window.parent.dataLayer.push({ key: value });\r\n }\r\n },\r\n});","(function (global, factory) {\r\n \"use strict\";\r\n if (\"function\" === typeof define && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // // and to the global (window) object in case any JS module.\r\n define([], function () {\r\n return (global.performanceEventsQueue = factory(global));\r\n });\r\n } else if (\"object\" === typeof exports) {\r\n // If supports for Common JS is available export the module\r\n // // and pass is value to the global (window) object in case non Common JS code\r\n // // is expected to work\r\n module.exports = (global.performanceEventsQueue = factory(global));\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.performanceEventsQueue = factory(global);\r\n }\r\n})(\"undefined\" !== typeof window ? window : {}, function (root) {\r\n /*\r\n * This queue is going to hold all the urls that needs GA values before GA has been downloaded by the browser\r\n */\r\n var eventsQueue = [];\r\n /*\r\n * This module exposes a function for queuing to the eventsQueue property\r\n */\r\n var enqueueEvent = function (url) {\r\n if (eventsQueue) {\r\n eventsQueue.push(url);\r\n }\r\n };\r\n /*\r\n * This function takes the values from GA and fires the logging of all the queued events considering these values as part of the request\r\n */\r\n function fireEvents() {\r\n if (eventsQueue.length > 0 && typeof (ga) === \"function\") {\r\n ga(function() {\r\n var urlWithGaValues = analyticsHelper.addAnalyticsUrlParameters(\"\");\r\n for (var i = eventsQueue.length - 1; i >= 0; i--) {\r\n var url = eventsQueue.pop();\r\n var xhr = new XMLHttpRequest();\r\n var indexOfQueryString = url.indexOf(\"?\");\r\n if (indexOfQueryString === -1) {\r\n url = url + urlWithGaValues;\r\n } else {\r\n url = url.substring(0, indexOfQueryString) +\r\n urlWithGaValues +\r\n url.substring(indexOfQueryString, url.length);\r\n }\r\n // the 3rd param sets async = true\r\n xhr.open(\"POST\", url, true);\r\n xhr.send();\r\n }\r\n delete eventsQueue;\r\n });\r\n }\r\n };\r\n\r\n window.onload = fireEvents;\r\n\r\n return {\r\n enqueueEvent: enqueueEvent\r\n }\r\n});","(function (global, factory) {\r\n 'use strict';\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n // If AMD is supported and the global object (window) in case any JS module is expecting\r\n // the analyticsHelper to exists on the window object.\r\n define([],\r\n () => {\r\n global.analyticsHelper = factory(global);\r\n return global.analyticsHelper;\r\n });\r\n } else if (typeof exports === 'object') {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code\r\n // is expected to work with this analyticsHelper Module.\r\n global.analyticsHelper = factory(global);\r\n module.exports = global.analyticsHelper;\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.analyticsHelper = factory(global);\r\n }\r\n}(typeof window !== 'undefined' ? window : {}, (root) => {\r\n 'use strict';\r\n\r\n const CONFIGURATION = (function () {\r\n const constants = {\r\n nhsTrackingId: 'UA-40843711-4'\r\n };\r\n\r\n const get = function (key) {\r\n return constants[key];\r\n };\r\n\r\n return {\r\n get\r\n };\r\n }());\r\n\r\n /**\r\n * Helper to get values from google analytics trackers.\r\n * For reference:\r\n * {@link https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference}.\r\n * @param {array} keys Key Values we want to get from the tracker.\r\n * @returns {object} values Object with key/values pairs containing the requested key values.\r\n */\r\n const getGoogleAnalyticsValues = function (keys) {\r\n const nhsTrackingId = CONFIGURATION.get('nhsTrackingId');\r\n\r\n const trackers = root.ga.getAll().filter((element) => element.get('trackingId') === nhsTrackingId);\r\n const values = {};\r\n\r\n for (let i = 0; i < trackers.length; i += 1) {\r\n for (let j = 0; j < keys.length; j += 1) {\r\n if (values[keys[j]]) {\r\n // eslint-disable-next-line no-continue\r\n continue;\r\n }\r\n\r\n values[keys[j]] = trackers[i].get(keys[j]);\r\n }\r\n }\r\n\r\n return values;\r\n };\r\n\r\n const addAnalyticsUrlParameters = function (urlToWork) {\r\n let url = urlToWork;\r\n const analyticsValues = getGoogleAnalyticsValues(['clientId', 'userId']);\r\n\r\n const gaClientId = analyticsValues.clientId !== undefined\r\n ? analyticsValues.clientId\r\n : '';\r\n const gaUserId = analyticsValues.userId !== undefined\r\n ? analyticsValues.userId\r\n : '';\r\n\r\n if (gaClientId) {\r\n url = url + '/GAClientId-' + gaClientId;\r\n }\r\n\r\n if (gaUserId) {\r\n url = url + '/GAUserId-' + gaUserId;\r\n }\r\n\r\n return url;\r\n };\r\n\r\n return {\r\n addAnalyticsUrlParameters,\r\n getGoogleAnalyticsValues\r\n };\r\n}));\r\n","// Class EventLogger\r\nvar _callAddThis = true;\r\nvar _commIdHD = 0;\r\nvar _builderIdHD = 0;\r\nvar _marketIdCR = 0;\r\n// Constructor, it receives a json object with parameters\r\nNHS.Scripts.Globals.EventLogger = function (logParameters) {\r\n this._siteRoot = logParameters.siteRoot;\r\n this._partnerId = logParameters.partnerID;\r\n this._marketId = logParameters.marketId;\r\n this._fromPage = logParameters.fromPage;\r\n this._communityId = logParameters.communityId;\r\n this._builderId = logParameters.builderId;\r\n this._planId = logParameters.planId;\r\n this._specId = logParameters.specId;\r\n this._homeSearchViewMetricDisplayed = logParameters.homeSearchViewMetricDisplayed;\r\n this._homeSearchViewMetricHidden = logParameters.homeSearchViewMetricHidden;\r\n this._partnerName = logParameters.partnerName;\r\n this._marketName = logParameters.marketName;\r\n this._communityName = logParameters.communityName;\r\n this._builderName = logParameters.builderName;\r\n this._performanceLogUrl = logParameters.performanceLogUrl;\r\n this._mpcCommunityId = logParameters.isMpcCommunity === true ? logParameters.parentCommunityId : 0;\r\n this._parentCommunityId = logParameters.parentCommunityId;\r\n this._eventLoggerUrl = \"eventlogger/logevent-\";\r\n this._timeOut = 2000;\r\n};\r\n\r\nNHS.Scripts.Globals.EventLogger.prototype =\r\n {\r\n // Public Members\r\n logListHubEvent: function (listHubProviderId, testkey, desckey, listingKey) {\r\n try {\r\n var _lh = new ListHubTracker({ provider: listHubProviderId, test: testkey });\r\n _lh.submit(desckey, listingKey);\r\n } catch (err) { }\r\n },\r\n\r\n logAndRedirect: function (e, url, eventCode, cid, bid, pid, sid, mid, external) {\r\n this._marketId = mid;\r\n this.logEvent(eventCode, cid, bid, pid, sid);\r\n this._redirect(e, url, external);\r\n return false;\r\n },\r\n\r\n logBasicListingAndRedirect: function (e, url, eventCode, bsid, mid) {\r\n var self = this;\r\n\r\n setTimeout(function () {\r\n var params = { basiclistingId: bsid, marketId: mid };\r\n self.logEventWithParameters(eventCode, params);\r\n self._redirect(e, url);\r\n return false;\r\n }, self._timeOut);\r\n },\r\n\r\n logWithParametersAndRedirect: function (e, url, eventCode, params, external) {\r\n var self = this;\r\n\r\n setTimeout(function () {\r\n self.logEventWithParameters(eventCode, params);\r\n self._redirect(e, url, external);\r\n return false;\r\n }, self._timeOut);\r\n },\r\n\r\n logEventWithParameters: function (eventCode, parameters) {\r\n var self = this;\r\n\r\n setTimeout(function () {\r\n if (eventCode) {\r\n var url = self._siteRoot + self._eventLoggerUrl + eventCode;\r\n\r\n if (self._siteRoot.substring(self._siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n self._logViewWithParameters(url, eventCode, parameters);\r\n }\r\n }, self._timeOut);\r\n },\r\n\r\n logEventWithoutEcommerce: function (eventCode, parameters) {\r\n var self = this;\r\n\r\n setTimeout(function () {\r\n if (eventCode) {\r\n var url = self._siteRoot + self._eventLoggerUrl + eventCode;\r\n\r\n if (self._siteRoot.substring(self._siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n self._logViewWithoutEcommerce(url, eventCode, parameters);\r\n }\r\n }, self._timeOut);\r\n },\r\n\r\n logBasicListingEvent: function (eventCode, bsid) {\r\n if (eventCode) {\r\n var url = this._siteRoot + this._eventLoggerUrl + eventCode;\r\n\r\n if (this._siteRoot.substring(this._siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n this._logView(url, eventCode, 0, 0, 0, 0, bsid);\r\n }\r\n },\r\n\r\n logEvent: function (eventCode, cid, bid, pid, sid) {\r\n if (eventCode) {\r\n var url = this._siteRoot + this._eventLoggerUrl + eventCode;\r\n\r\n if (this._siteRoot.substring(this._siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n this._logView(url, eventCode, cid, bid, pid, sid, 0);\r\n }\r\n },\r\n\r\n setAllowAddThis: function () {\r\n _callAddThis = false;\r\n setTimeout(function () {\r\n _callAddThis = true;\r\n }, 2000);\r\n },\r\n\r\n logMultiEvent: function (eventCode, communityId, builderId, planId, specId) {\r\n if (eventCode) {\r\n var url = this._siteRoot + this._eventLoggerUrl + eventCode;\r\n\r\n if (this._siteRoot.substring(this._siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n this._logView(url, eventCode, communityId, builderId, planId, specId, 0);\r\n }\r\n },\r\n\r\n logHomeResultsMetrics: function (eventCode, flag) {\r\n\r\n if (eventCode) {\r\n var logString;\r\n\r\n if (flag == 1) {\r\n logString = this._homeSearchViewMetricDisplayed;\r\n }\r\n else {\r\n logString = this._homeSearchViewMetricHidden;\r\n\r\n }\r\n\r\n\r\n this._logMetrics(eventCode, logString);\r\n }\r\n },\r\n\r\n attachEventsToAddThis: function () {\r\n var self = this;\r\n\r\n if (typeof addthis != 'undefined') {\r\n addthis.addEventListener('addthis.menu.share', function (evt) {\r\n if (_callAddThis) {\r\n var serviceShared = evt.data.service.toString().toLowerCase();\r\n var eventCode = 'MHSMS';\r\n var hdPage = self._planId > 0 || self._specId > 0;\r\n\r\n if (serviceShared.indexOf('favorites') == -1 && serviceShared.indexOf('print') == -1 && serviceShared.indexOf('email') == -1) {\r\n if (self._planId == 0 && self._specId == 0 && self._communityId == 0) {\r\n eventCode = 'MHSMS';\r\n } else {\r\n hdPage = self._planId > 0 || self._specId > 0;\r\n eventCode = hdPage ? 'HDSMS' : 'CDSMS';\r\n }\r\n self.logMultiEvent(eventCode, self._communityId, self._builderId, self._planId, self._specId);\r\n }\r\n else if (serviceShared.indexOf('email') > -1) {\r\n hdPage = self._planId > 0 || self._specId > 0;\r\n eventCode = hdPage ? 'HOMSTF' : 'COMSTF';\r\n self.logMultiEvent(eventCode, self._communityId, self._builderId, self._planId, self._specId);\r\n self.setAllowAddThis();\r\n } else if (serviceShared.indexOf('print') > -1) {\r\n hdPage = self._planId > 0 || self._specId > 0;\r\n eventCode = hdPage ? 'HOMPR' : 'COMPR';\r\n\r\n if (jQuery(this).hasClass('nextStepsPrint')) {\r\n eventCode = hdPage ? 'HDNSPRN' : 'CDNSPRN';\r\n }\r\n\r\n var logInfo = self.getLogInfo();\r\n\r\n self.logEventWithParameters(eventCode, logInfo);\r\n self.setAllowAddThis();\r\n }\r\n }\r\n });\r\n }\r\n },\r\n\r\n getLogInfo: function () {\r\n var logInformationObject;\r\n var logInfo =\r\n {\r\n communityId: self._communityId,\r\n builderId: self._builderId,\r\n planId: self._planId,\r\n specId: self._specId\r\n };\r\n if (typeof commDetail != \"undefined\") {\r\n logInformationObject = commDetail._parameters || commDetail.parameters;\r\n logInfo = logInformationObject.logInfo;\r\n }\r\n else if (typeof homeDetail != \"undefined\") {\r\n logInformationObject = homeDetail._parameters || homeDetail.parameters;\r\n logInfo = logInformationObject.logInfo;\r\n }\r\n\r\n return logInfo;\r\n },\r\n\r\n // Redirect function\r\n _redirect: function (e, url, newWin) {\r\n if (!e) {\r\n var e = window.event;\r\n }\r\n\r\n try {\r\n e.cancelBubble = true;\r\n } catch (err) {\r\n\r\n }\r\n\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (url) {\r\n if (newWin) {\r\n window.open(url);\r\n } else {\r\n setTimeout(function () { window.location.href = url; }, 500);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Checks if the Google Analytics library has been downloaded yet\r\n * @function\r\n */\r\n isGaLoaded: function () {\r\n return typeof (ga) === \"function\" && typeof (ga.getAll) === \"function\";\r\n },\r\n\r\n /**\r\n * Handles the url event log, if GA is ready then we log the event,\r\n * otherwise we are going to enqueue it and wait for the pageLoad event before trying to log them\r\n * @function\r\n * @param {String} url String\r\n * @param {String} isGaReady String\r\n * @param {Boolean} areGaParamsNeeded Boolean\r\n * @param {Boolean} isAsync Boolean\r\n */\r\n handleLogEvent: function (url, isGaReady, areGaParamsNeeded, isAsync) {\r\n if (!isGaReady) {\r\n performanceEventsQueue.enqueueEvent(url);\r\n } else {\r\n if (areGaParamsNeeded) {\r\n url = analyticsHelper.addAnalyticsUrlParameters(url);\r\n }\r\n jQuery.ajax({ type: \"Post\", url: url, async: isAsync });\r\n }\r\n },\r\n\r\n _logViewWithParameters: function (url, eventCode, parameters) {\r\n var wturl = url;\r\n\r\n if (this._fromPage == 'communityresults') {\r\n wturl = url;\r\n\r\n if (this._siteRoot == '/') {\r\n wturl = \"/NewHomeSource\" + url;\r\n }\r\n }\r\n\r\n var isGaReady = this.isGaLoaded();\r\n\r\n var result = this.createUrl(url, parameters, isGaReady);\r\n\r\n var communityId = result.communityId;\r\n var specId = result.specId;\r\n var planId = result.planId;\r\n\r\n url = result.url;\r\n\r\n var async = true;\r\n if (typeof parameters.async != 'undefined')\r\n async = parameters.async;\r\n\r\n //GA Performance event (with enhaced ecomm)\r\n this._logGoogleEcommerceEvent(eventCode, communityId, specId, planId, null, parameters.builderCommunityList, parameters.homeList);\r\n\r\n this.handleLogEvent(url, isGaReady, false, async);\r\n },\r\n\r\n _logViewWithoutEcommerce: function (url, eventCode, parameters) {\r\n var wturl = url;\r\n\r\n if (this._fromPage == 'communityresults') {\r\n wturl = url;\r\n\r\n if (this._siteRoot == '/') {\r\n wturl = \"/NewHomeSource\" + url;\r\n }\r\n }\r\n\r\n var isGaReady = this.isGaLoaded();\r\n\r\n var result = this.createUrl(url, parameters, isGaReady);\r\n\r\n url = result.url;\r\n\r\n var async = true;\r\n if (typeof parameters.async != 'undefined') {\r\n async = parameters.async;\r\n }\r\n\r\n this.handleLogEvent(url, isGaReady, false, async);\r\n },\r\n\r\n createUrl: function (url, parameters, isGaReady) {\r\n var communityId = 0, specId = 0, planId = 0;\r\n\r\n if (parameters.builderId) {\r\n url = url + \"/builder-\" + parameters.builderId;\r\n }\r\n\r\n if (parameters.communityId || parameters.commId) {\r\n url = url + \"/community-\" + (parameters.communityId || parameters.commId);\r\n communityId = (parameters.communityId || parameters.commId);\r\n }\r\n\r\n if (parameters.communityList) {\r\n url = url + \"/communitylist-\" + parameters.communityList;\r\n }\r\n\r\n if (parameters.marketId) {\r\n url = url + \"/market-\" + parameters.marketId;\r\n }\r\n\r\n if (parameters.planId) {\r\n url = url + \"/planid-\" + parameters.planId;\r\n planId = parameters.planId;\r\n }\r\n\r\n if (parameters.specId) {\r\n url = url + \"/specid-\" + parameters.specId;\r\n specId = parameters.specId;\r\n }\r\n\r\n if (isGaReady) {\r\n url = analyticsHelper.addAnalyticsUrlParameters(url);\r\n }\r\n\r\n if (parameters.parentCommunityId) {\r\n url = url + \"/parentcommunityid-\" + parameters.parentCommunityId;\r\n }\r\n\r\n if (parameters.basicListingId) {\r\n url = url + \"/basiclistingid-\" + parameters.basicListingId;\r\n }\r\n\r\n if (parameters.refer) {\r\n url = url + \"/refer-\" + parameters.refer;\r\n }\r\n\r\n if (parameters.totalHomes) {\r\n url = url + \"/totalhomes-\" + parameters.totalHomes;\r\n }\r\n\r\n if (parameters.builderCommunityList) {\r\n url = url + \"?buildercommunitylist=\" + parameters.builderCommunityList;\r\n }\r\n\r\n if (parameters.basicListingList) {\r\n url = url + \"?basiclistinglist=\" + parameters.basicListingList;\r\n }\r\n\r\n if (parameters.homeList) {\r\n url = url + \"?homeList=\" + parameters.homeList;\r\n }\r\n\r\n return {\r\n url: url,\r\n communityId: communityId,\r\n planId: planId,\r\n specId: specId\r\n }\r\n },\r\n\r\n _logView: function (url, eventCode, cid, bid, planId, specId, bsId) {\r\n if (url.indexOf(\"http://\") < 0) {\r\n url = url.replace(' ', '').replace('//', '/');\r\n }\r\n\r\n var fromPageUrl = this._fromPage;\r\n var wturl = url;\r\n\r\n var hdPage = planId > 0 || specId > 0;\r\n\r\n if (cid == 0 && hdPage) {\r\n cid = _commIdHD;\r\n }\r\n\r\n if (bid == 0 && hdPage) {\r\n bid = _builderIdHD;\r\n }\r\n\r\n if (this._fromPage == 'communityresults') {\r\n wturl = url;\r\n fromPageUrl = this._siteRoot + \"communityresults\";\r\n\r\n if (this._siteRoot == '/') {\r\n wturl = \"/NewHomeSource\" + url;\r\n fromPageUrl = \"/NewHomeSource/communityresults\";\r\n }\r\n }\r\n\r\n //Log to custom via http req \r\n if (bsId == 0) {\r\n url = url +\r\n \"/builder-\" + bid +\r\n \"/community-\" + cid +\r\n \"/planid-\" + planId +\r\n \"/specid-\" + specId +\r\n \"/market-\" + this._marketId;\r\n } else {\r\n url = url + \"/basiclistingid-\" + bsId + \"/market-\" + this._marketId;\r\n }\r\n\r\n var isGaReady = this.isGaLoaded();\r\n this.handleLogEvent(url, isGaReady, true, true);\r\n\r\n // GA Performance event (with enhaced ecomm)\r\n this._logGoogleEcommerceEvent(eventCode, cid, specId, planId, null);\r\n },\r\n\r\n _logMetrics: function (event, logString) {\r\n var dataPost = { logsInChains: logString, eventName: event };\r\n jQuery.ajax({\r\n type: \"POST\",\r\n url: \"https://\" + location.host + \"/metricseventlogger/\",\r\n data: dataPost,\r\n dataType: \"json\"\r\n });\r\n },\r\n\r\n _logGoogleEcommerceEvent: function (eventName, communityId, specId, planId, builderName, communitiesIdsList, homesIdsList) {\r\n if (typeof this._performanceLogUrl == 'undefined')\r\n return;\r\n\r\n var params = {\r\n \"eventName\": eventName,\r\n \"communityId\": typeof (communityId) != 'undefined' && communityId != null ? communityId : 0,\r\n \"specId\": typeof (specId) != 'undefined' && specId != null ? specId : 0,\r\n \"planId\": typeof (planId) != 'undefined' && planId != null ? planId : 0,\r\n \"builderName\": builderName,\r\n \"communitiesIdsList\": communitiesIdsList,\r\n \"homesIdsList\": homesIdsList\r\n\r\n };\r\n\r\n var performanceLogUrl = this._performanceLogUrl;\r\n\r\n jQuery.ajax({\r\n type: \"POST\",\r\n url: performanceLogUrl,\r\n data: params,\r\n success: function (result) {\r\n // The GetDataLayerPush method of the Google Analytics Controller returns a js that needs to be executed\r\n eval(result);\r\n }\r\n });\r\n },\r\n\r\n googlepush: function (events, action, label, value) {\r\n var instance = this;\r\n NHS.Scripts.Helper.createCookie(\"CTAName\", action, 1);\r\n if (typeof dataLayer !== \"undefined\") {\r\n dataLayer.push({\r\n 'event': \"GAEvent\",\r\n 'eventCategory': events,\r\n 'eventAction': action,\r\n 'eventLabel': label,\r\n 'eventValue': undefined\r\n });\r\n } \r\n },\r\n\r\n /**\r\n * Sets a Pair to the Data Layer\r\n * @method\r\n * @param {String} key Key\r\n * @param {*} optValue Optional value\r\n */\r\n SetDataLayerPair: function (key, optValue) {\r\n try {\r\n var finalUrl = \"/GoogleAnalytics/SetDataLayerPair\";\r\n\r\n if (typeof (optValue) == \"undefined\") {\r\n optValue = 0;\r\n }\r\n\r\n ajax.request({\r\n type: \"GET\",\r\n url: finalUrl,\r\n data: {\r\n key: key,\r\n optValue: optValue\r\n },\r\n success: function (data) {\r\n if (!(data !== \"\" && typeof data === \"string\")) return;\r\n if (typeof (dataLayer) == \"undefined\") {\r\n var tmpData = data;\r\n var finalData = tmpData.replace(\"dataLayer\", \"window.parent.dataLayer\");\r\n eval(finalData);\r\n } else {\r\n eval(data);\r\n }\r\n\r\n }\r\n });\r\n } catch (ex) { }\r\n }\r\n }\r\n\r\nfunction getValueFromObjectArray(arrayObject, propertyId) {\r\n var mpcValue = null;\r\n\r\n if (arrayObject !== null && arrayObject !== undefined) {\r\n mpcValue = arrayObject.map(function (obj) {\r\n if (obj.id === propertyId && obj.id !== \"0\") {\r\n return obj.mpcId;\r\n }\r\n return undefined;\r\n }).filter(function (x) { return typeof x !== 'undefined' });\r\n }\r\n\r\n return mpcValue === null || mpcValue[0] === undefined ? null : mpcValue;\r\n}","// Loads the enhanced ecommerce pluggin inside GA required to used the encanced commands\r\n\r\nwindow.addEventListener(\"DOMContentLoaded\",\r\n function () {\r\n setTimeout(function() {\r\n if (typeof ga !== \"undefined\") {\r\n ga(\"require\", \"ec\");\r\n }\r\n }, 500);\r\n });\r\n\r\n","NHS.Scripts.Search = function (typeAheadUrl, callInitialize, functionAutoCompleteSelect, parameters) {\r\n this._typeAheadUrl = typeAheadUrl; \r\n this.alreadyiInitialize = false;\r\n this._parameters = parameters;\r\n callInitialize = (typeof callInitialize === 'undefined') ? true : callInitialize;\r\n if (callInitialize) {\r\n this.initialize();\r\n }\r\n\r\n this.AutoCompleteSelect = functionAutoCompleteSelect;\r\n};\r\n\r\n\r\nNHS.Scripts.Search.prototype =\r\n{\r\n initialize: function () {\r\n var self = this;\r\n if (self.alreadyiInitialize == false) {\r\n\r\n jQuery('#SearchText').on('focus', function () {\r\n jQuery('#nhs_HomeSearchOptions').slideDown(250, function () {\r\n jQuery('#nhs_HomeSearchOptions > fieldset').fadeIn(1000);\r\n });\r\n });\r\n jQuery('#SearchTextCms').on('focus', function () {\r\n jQuery('#nhs_HomeSearchOptionsCms').slideDown(250, function () {\r\n jQuery('#nhs_HomeSearchOptionsCms > fieldset').fadeIn(1000);\r\n });\r\n });\r\n\r\n jQuery('#PriceLow, #PriceHigh, #PriceLowCms, #PriceHighCms').on('focus', function () {\r\n var control = jQuery(this);\r\n if (!control.is('select') && control.val() != null && control.val().length != 0) {\r\n control.priceFormat({\r\n prefix: '$',\r\n thousandsSeparator: ',',\r\n centsLimit: 0,\r\n insertPlusSign: false,\r\n limit: 7\r\n });\r\n }\r\n });\r\n\r\n jQuery('#PriceLow, #PriceHigh,#PriceLowCms, #PriceHighCms').on('blur', function () {\r\n var control = jQuery(this);\r\n if (!control.is('select') && control.val() != null && control.val().length != 0) {\r\n control.priceFormat({\r\n prefix: '$',\r\n thousandsSeparator: ',',\r\n centsLimit: 0,\r\n insertPlusSign: false,\r\n limit: 7\r\n });\r\n }\r\n });\r\n\r\n this.validateSearchBox(jQuery('#frmHomePageCms'), jQuery(\"#nhs_field_validation_error_homeCms\"), jQuery('#SearchTextCms'), false);\r\n jQuery(\"#nhs_GlobalSearchNavSubmit\").click(function () {\r\n //alert('#nhs_GlobalSearchNavSubmit');\r\n var validateFuncion = self.showErrorSearchTextMessage;\r\n var value = jQuery(\"#nhs_GlobalSearchNavLocation\").val();\r\n if (!validateFuncion(value)) {\r\n value = jQuery.trim(value);\r\n if (value.length > 0 && value != \"Enter Location or Community Name\") {\r\n jQuery.googlepush('Search Events', 'Search Action', 'Search - NavigationNew');\r\n return true;\r\n }\r\n }\r\n jQuery(\"#nhs_field_validation_error\").show();\r\n var homepageSearchText = jQuery(\"#SearchText\").val(\"\");\r\n if (homepageSearchText)\r\n homepageSearchText.val(\"\");\r\n jQuery(\"#nhs_GlobalSearchNavSubmit\").removeAttr(\"disabled\");\r\n return false;\r\n });\r\n\r\n var megaMenuInputText = jQuery(\"#nhs_GlobalSearchNavLocation\");\r\n self.validateSearchBox(megaMenuInputText.closest('form'), jQuery('span.field-validation-error'), megaMenuInputText, false);\r\n\r\n if (typeof self._parameters != 'undefined') {\r\n if (!self._parameters.isFromHomePage && !self._parameters.isFromErrorPage) {\r\n self.closeSlideDownPanel();\r\n }\r\n }\r\n\r\n //SetTextBoxesDescriptions();\r\n self.alreadyiInitialize = true;\r\n }\r\n },\r\n\r\n showErrorSearchTextMessage: function (textInput) {\r\n var text = String(textInput).trim();\r\n \r\n var hasError = false;\r\n\r\n if (typeof text == \"undefined\"\r\n || text == \"\") {\r\n hasError = true;\r\n } else if (text.indexOf(',') == -1 && !isNaN(text) && new RegExp(/(?:^|[^\\d])(\\d{5})(?:$|[^\\d])/mg).test(text) == false) {\r\n hasError = true;\r\n } else if ((text.split(',').length > 1 && (text.split(',')[0].trim() === \"\" || text.split(',')[1].trim() === \"\" || text.split(',')[1].trim().length < 2))) {\r\n hasError = true;\r\n } else if ((text.indexOf(',') == -1 && new RegExp(\"[a-zA-Z0-9 ]+$\").test(text) == false)) {\r\n hasError = true;\r\n } /*else {\r\n var url = this._typeAheadUrl + '?term=' + text;\r\n jQuery.ajaxSetup({\r\n async: false\r\n });\r\n\r\n var titleList = jQuery.getJSON(url);\r\n\r\n jQuery.ajaxSetup({\r\n async: true\r\n });\r\n\r\n if (titleList.responseJSON.length === 0) {\r\n hasError = true;\r\n } \r\n } // */ \r\n return hasError;\r\n },\r\n\r\n validateSearchBox: function (formElement, errorDiv, searchText, useAlert) { \r\n var self = this;\r\n jQuery(formElement).on('submit', function (e) {\r\n var text = jQuery(searchText.selector).val().trim();\r\n var innerSelf = self;\r\n if (innerSelf.showErrorSearchTextMessage(text)) {\r\n e.preventDefault();\r\n if (useAlert) {\r\n alert(\"Enter a valid text to search\");\r\n } else {\r\n jQuery(errorDiv).show();\r\n }\r\n jQuery(\"#nhs_GlobalSearchNavLocation\").val(\"\");\r\n return false;\r\n }\r\n return true;\r\n });\r\n },\r\n setupSearchBox: function (textBoxName, typeElement, useAlert) {\r\n var self = this;\r\n useAlert = (typeof useAlert === 'undefined') ? false : useAlert;\r\n jQuery(\"#\" + textBoxName).keypress(function () {\r\n jQuery(\".field-validation-error\").hide().addClass(\"resource-center-validation\");\r\n });\r\n\r\n //Autocomplete\r\n var searchTextBox = jQuery('#' + textBoxName);\r\n //check search text box exists\r\n if (searchTextBox !== null && searchTextBox.length > 0) {\r\n\r\n self.validateSearchBox(searchTextBox.closest('form'), searchTextBox.closest('form').find('.field-validation-error'), searchTextBox, useAlert);\r\n\r\n searchTextBox.autocomplete({\r\n source: this._typeAheadUrl,\r\n select: function (event, ui) {\r\n event.preventDefault();\r\n var value = ui.item.Type;\r\n var text = ui.item.Name;\r\n\r\n jQuery(\"#\" + typeElement).val(value);\r\n jQuery(\"#\" + textBoxName).val(text);\r\n if (jQuery.isFunction(self.AutoCompleteSelect)) {\r\n self.AutoCompleteSelect(value, text, self);\r\n }\r\n },\r\n focus: function (event, ui) {\r\n event.preventDefault();\r\n }\r\n }).data(\"ui-autocomplete\")._renderItem = function (ul, item) {\r\n item.label = item.Name;\r\n item.label = item.label.replace(new RegExp(\"(?![^&;]+;)(?!<[^<>]*)(\" + jQuery.ui.autocomplete.escapeRegex(this.term.trim()) + \")(?![^<>]*>)(?![^&;]+;)\", \"gi\"), \"$1\");\r\n\r\n if (item.label.indexOf(\" in \") != -1)\r\n item.label = item.label.substring(0, item.label.indexOf(\" in \")) + \" in \" + item.label.substring(item.label.indexOf(\" in \") + 4) + \"\";\r\n\r\n return jQuery(\"
\")\r\n .data(\"item.autocomplete\", item)\r\n .append(\"\" + item.label + \"\")\r\n .appendTo(ul);\r\n };\r\n searchTextBox.autocomplete().data(\"ui-autocomplete\").menu.element.detach().appendTo(jQuery('#' + textBoxName).parent());\r\n }\r\n },\r\n\r\n closeSlideDownPanel: function () {\r\n // When user clicks out of the container hide the search options\r\n jQuery(document).mouseup(function(e) {\r\n var container = jQuery(\"#nhs_HomeSearchForm\"); \r\n if (!container.is(e.target) // if the target of the click isn't the container...\r\n && container.has(e.target).length === 0) // ... nor a descendant of the container\r\n {\r\n jQuery(\"#nhs_HomeSearchOptions\").hide();\r\n }\r\n if (jQuery(\"#nhs_HomeSearchFormCms\")) {\r\n container = jQuery(\"#nhs_HomeSearchFormCms\");\r\n if (!container.is(e.target) // if the target of the click isn't the container...\r\n && container.has(e.target).length === 0) // ... nor a descendant of the container\r\n {\r\n jQuery(\"#nhs_HomeSearchOptionsCms\").hide();\r\n } \r\n }\r\n \r\n });\r\n }\r\n};\r\n","var LeadModal = function (parameters) {\r\n this.parameters = parameters;\r\n\r\n this.formSelector = parameters.leadFormSelector == null ? (\".nhs_RequestInfoForm\") : parameters.leadFormSelector;\r\n};\r\n\r\nLeadModal.prototype = {\r\n initialize: function () {\r\n var self = this;\r\n this.checkCounts = 0;\r\n var form = jQuery(this.formSelector);\r\n\r\n const phoneInput = form[0].querySelector('[name=Phone]');\r\n if (phoneInput && window.VMasker) {\r\n window.VMasker(phoneInput).maskPattern('(999) 999-9999');\r\n }\r\n\r\n var closeModalBtn = document.getElementById(\"nhs_closeModal\");\r\n if (closeModalBtn) {\r\n closeModalBtn.addEventListener(\"click\", function () {\r\n self.logFormAnalyticsEvent(\"CLOSE\", \"CONTACT\");\r\n });\r\n }\r\n\r\n jQuery(this.formSelector).on('change', \"[name='International'], [name='LivesOutside']\", function () {\r\n var zip = jQuery(this).closest('.nhs_RequestInfoForm').find(\"[id='Zip']\");\r\n var errorZipTextContent = document.getElementById(\"nhs_ErrorForHoursZipCodeReg\");\r\n if (jQuery(this).is(':checked')) {\r\n zip.attr(\"disabled\", \"disabled\");\r\n zip.val(\"\");\r\n zip.removeClass(\"nhs_Error\");\r\n zip.removeClass(\"nhs_ErrorSpan\");\r\n errorZipTextContent.textContent = \"\";\r\n jQuery(this).closest('.nhs_RequestInfoForm').find(\"label[for='Zip']\").removeClass(\"nhs_ErrorLabel\");\r\n } else {\r\n zip.removeAttr(\"disabled\");\r\n }\r\n });\r\n\r\n jQuery(this.formSelector).on('keyup', '#Zip, #Name, #Email', function () {\r\n var control = jQuery(this);\r\n control.removeClass(\"nhs_Error\");\r\n control.prev(\"label[for]\").removeClass(\"nhs_ErrorLabel\");\r\n });\r\n\r\n jQuery(this.formSelector).on('change', '#IncludeRecoComm', function () {\r\n if (jQuery(this).is(\":checked\") && self.checkCounts == 0) {\r\n if (NHS.Scripts.Helper.readCookie) {\r\n jQuery.googlepush('Lead Events', NHS.Scripts.Helper.readCookie('CTAName'), 'Option Checked - Send Me More');\r\n self.checkCounts++;\r\n }\r\n }\r\n });\r\n\r\n jQuery(this.formSelector).on('click', '#RequestBrochureDate', function () {\r\n jQuery.googlepush('Lead Events', NHS.Scripts.Helper.readCookie('CTAName'), 'Option Checked - Appointment Calendar');\r\n });\r\n\r\n\r\n form.find(\"#AppointmentDateTime\").attr(\"disabled\", \"disabled\");\r\n\r\n jQuery(this.formSelector).on(\"change\", \"input[type=checkbox]\", function () {\r\n var control = jQuery(this);\r\n control.val(control.is(\":checked\"));\r\n });\r\n\r\n function onChangeRealtorAnswer(event) {\r\n let selectedOption = event.target.options ? event.target.options[event.target.selectedIndex] : event.target;\r\n if (event.target.options) {\r\n for (let element of event.target.options) {\r\n element.removeAttribute(\"selected\");\r\n } \r\n }\r\n \r\n selectedOption.setAttribute(\"selected\", \"\");\r\n };\r\n\r\n if (this.formSelector && document.querySelector(this.formSelector)) {\r\n document.querySelector(this.formSelector).addEventListener(\"change\", (event) => {\r\n if (event.target.id === \"nhs-real-agent\") {\r\n onChangeRealtorAnswer(event);\r\n }\r\n }); \r\n }\r\n\r\n jQuery(document.body).on(\"click\", \".showLoginLink\", function (event) {\r\n var modalContainer = event.target.closest(\".nhs_ModalBox\");\r\n\r\n var confirmationSection = modalContainer.querySelector(\".nhs_confirmationLeadForm\");\r\n confirmationSection.style.display = \"none\";\r\n\r\n var loginSection = modalContainer.querySelector(\".nhs_LogInFormContent\");\r\n var loginInputs = loginSection.querySelectorAll(\".emailSignIn, .passwordSignIn\");\r\n\r\n for (var i = 0; i < loginInputs.length; ++i) {\r\n //removes error classes\r\n loginInputs[i].className = loginInputs[i].className.replace(/\\binput-validation-error\\b/g, \"\");\r\n }\r\n\r\n var errorSection = modalContainer.querySelector(\".validation-summary-errors\");\r\n errorSection.style.display = \"none\";\r\n\r\n loginSection.style.display = \"block\";\r\n });\r\n\r\n jQuery(this.formSelector).on(\"click\", \".nhs_FormButton\", function (event) {\r\n var element = this;\r\n var buttonForm = jQuery(element).closest('.nhs_RequestInfoForm');\r\n var valid = formValidator.validateForm(buttonForm[0]);\r\n const leadForm = element.closest('#nhs_LeadForm');\r\n\r\n if (valid) {\r\n var buttonForm = jQuery(this).closest('.nhs_RequestInfoForm');\r\n const includeRecommendationsCommunities = leadForm.querySelector('#IncludeRecoComm');\r\n const realtorQuestionAnswerInput = leadForm.querySelector('[data-realtor-answer]')\r\n const selectedRealtorAnswerText = realtorQuestionAnswerInput && realtorQuestionAnswerInput.selectedIndex > 0\r\n ? realtorQuestionAnswerInput.options[realtorQuestionAnswerInput.selectedIndex].text : '';\r\n const realtorQuestionAnswerId = realtorQuestionAnswerInput\r\n ? realtorQuestionAnswerInput.options[realtorQuestionAnswerInput.selectedIndex].value : '';\r\n\r\n let dataset = this.dataset;\r\n\r\n let eventForSegment = {\r\n event: 'Lead Modal Form Submitted',\r\n eventType: 'segmentEvent',\r\n builder_id: dataset.builder_id,\r\n builder_name: dataset.builder_name,\r\n community_id: dataset.community,\r\n community_name: dataset.community_name,\r\n state: dataset.state,\r\n city: dataset.city,\r\n community_low_price: dataset.community_low_price,\r\n community_high_price: dataset.community_high_price,\r\n home_price: dataset.home_price,\r\n home_type: dataset.home_type,\r\n primary_image_url: dataset.primary_image_url,\r\n isIdentifyEvent: false,\r\n button_action: dataset.button_action,\r\n realtor_question: selectedRealtorAnswerText\r\n };\r\n document.body.dispatchEvent && document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n detail: { data: eventForSegment }\r\n }));\r\n\r\n if (self.parameters.IsAskQuestion) {\r\n var action = (self.parameters.FromPage === \"communitydetail\" ? \"Community\" : \"Home\") +\r\n \" - Ask the Builder a Question - CTA - Submit\";\r\n jQuery.googlepush(\"Lead Events\", action, \"Ask Question\");\r\n } else {\r\n jQuery.googlepush(\"Lead Events\", \"\", \"Submit Form - Get Brochure\");\r\n }\r\n\r\n if (buttonForm.find(\"#RequestBrochureDate\").val() !== undefined) {\r\n self.IsAppt = true;\r\n } else {\r\n self.IsAppt = false;\r\n }\r\n\r\n var requestedFromMediaViewer = (document.getElementById(\"nhs_fullViewerLeadForm\") !== null &&\r\n typeof (document.getElementById(\"nhs_fullViewerLeadForm\")) !== \"undefined\");\r\n\r\n var isRequestVirtualTour =\r\n self.parameters.AppointmentType === \"vc\" || self.parameters.AppointmentType === \"vt\";\r\n\r\n var data = buttonForm.find(\"input, textarea\").serialize() +\r\n \"&AppointmentDateTime=\" +\r\n buttonForm.find(\"#RequestBrochureDate\").val() +\r\n \"&IsAskQuestion=\" +\r\n self.parameters.IsAskQuestion +\r\n \"&IsAppointment=\" +\r\n self.IsAppt +\r\n \"&RequestedFromGallery=\" +\r\n requestedFromMediaViewer +\r\n \"&IsSoldHome=\" +\r\n self.parameters.IsSoldHome +\r\n \"&Is55PlusLead=\" +\r\n self.parameters.Is55PlusLead +\r\n \"&IsRequestVirtualTour=\" +\r\n isRequestVirtualTour +\r\n \"&IsComingSoon=\" +\r\n self.parameters.IsComingSoon;\r\n\r\n data = `${data}&HasUserOptedIntoRecommendationEmail=${includeRecommendationsCommunities && includeRecommendationsCommunities.checked}`;\r\n data = `${data}&RealtorQuestionAnswerId=${realtorQuestionAnswerId}`;\r\n data = `${data}&IsFullImageViewerLead=${this.dataset.isFullImageViewerLead}`;\r\n const comments = self.GetCommentsData(buttonForm[0]);\r\n if (comments) {\r\n data = `${data}&Comments=${comments}`;\r\n }\r\n\r\n var control = jQuery(this);\r\n var isCustomLocation = buttonForm.find(\"[name='IsCustomLocation']\").val() === \"true\";\r\n data.IsCustomLocation = isCustomLocation;\r\n if (isCustomLocation) {\r\n var url = buttonForm.find(\"[name='AskQuestionUrl']\").val();\r\n self.SendAskQuestionLead(control, data, url);\r\n } else {\r\n var action = self.parameters.postLeadSendFunc != null\r\n ? self.parameters.postLeadSendFunc\r\n : self.initializeRecoModal;\r\n\r\n const formData = new FormData(leadForm);\r\n const dataEntries = Object.fromEntries(formData.entries());\r\n\r\n const recommendedModalCommand = {\r\n MailAddress: dataEntries.Email,\r\n SpecId: dataEntries.SpecId,\r\n PlanId: dataEntries.PlanId,\r\n CommunityId: dataEntries.CommunityId,\r\n FromPage: dataEntries.FromPage,\r\n GenerateLeadFrom: dataEntries.GenerateLeadFrom,\r\n ButtonNameSource: dataEntries.ButtonNameSource,\r\n Phone: dataEntries.Phone,\r\n BuilderId: dataEntries.BuilderId,\r\n MarketId: dataEntries.MarketId,\r\n UserPostalCode: dataEntries.postal,\r\n Name: dataEntries.name\r\n }\r\n\r\n // emit a new event with the response from the server.\r\n document.dispatchEvent(new CustomEvent(\"openRecommendedModal\", {\r\n detail: { data: recommendedModalCommand }\r\n }));\r\n\r\n self.GeneralAjaxCallAction(control, data, self.parameters.BrochureUrl, action);\r\n\r\n document.body.dispatchEvent(new CustomEvent('onLeadPosted', {\r\n detail: {\r\n name: dataEntries.name,\r\n emailAddress: dataEntries.Email,\r\n phoneNumber: dataEntries.Phone,\r\n postalCode: dataEntries.postal,\r\n livesOutside: dataEntries.LivesOutside == 'true',\r\n realtorQuestionAnswer: realtorQuestionAnswerId,\r\n sendAlerts: includeRecommendationsCommunities ? includeRecommendationsCommunities.checked : null\r\n }\r\n }));\r\n }\r\n } else {\r\n var errorMessages = buttonForm[0].querySelectorAll(\".nhs_ErrorSpan\");\r\n for (var i = 0; i < errorMessages.length; i++) {\r\n errorMessages[i].style.display = \"block\";\r\n }\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * throw the event to persona.js\r\n * @param {object} element Dom element with the data attributes required\r\n */\r\n sendSegmentEventFavorites: function (element) {\r\n if (!element || !window.NewHomeSource.UserCredentials) {\r\n return;\r\n }\r\n // if user is logged and if is free brochure, send the segment event\r\n const userSession = window.NewHomeSource.UserCredentials.isUserLogged() || false;\r\n\r\n if (userSession) {\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent(\"trackIdentifySaveItems\", {\r\n detail: { data: element }\r\n }));\r\n }\r\n },\r\n\r\n initializeRecoModal: function (element) {\r\n var self = this;\r\n if (jQuery(\"#nhs_RecoCommsBox\").length > 0) {\r\n\r\n jQuery(\"#nhs_RecoCommsBox .nhs_RecoCommsCheckbox\").change(function () {\r\n if (jQuery(\"#nhs_RecoCommsBox .nhs_RecoCommsCheckbox\").is(\":checked\")) {\r\n jQuery(\".nhs_ModalActions #nhs_GetFreeBrochure, [data-get-brochure]\").removeClass(\"Inactive\");\r\n jQuery(\".nhs_ModalActions #nhs_GetFreeBrochure, [data-get-brochure]\").removeAttr(\"disabled\");\r\n } else {\r\n jQuery(\".nhs_ModalActions #nhs_GetFreeBrochure, [data-get-brochure]\").addClass(\"Inactive\");\r\n jQuery(\".nhs_ModalActions #nhs_GetFreeBrochure, [data-get-brochure]\").attr(\"disabled\", \"disabled\");\r\n }\r\n });\r\n\r\n var closeModalBtn = document.getElementById(\"nhs_closeModal\");\r\n if (closeModalBtn) {\r\n closeModalBtn.addEventListener(\"click\", function () {\r\n self.logFormAnalyticsEvent(\"CLOSE\", \"RECO\");\r\n });\r\n }\r\n\r\n var recommendationBox = document.querySelectorAll('[data-recommended-checkbox]');\r\n recommendationBox.forEach((element) => {\r\n element.addEventListener('change', self.onRecommendationBoxChange);\r\n });\r\n }\r\n\r\n self.sendSegmentEventFavorites(element[0]);\r\n },\r\n\r\n onRecommendationBoxChange: function(event) {\r\n if (!event.target.checked) {\r\n document.body.dispatchEvent(new CustomEvent('onRecommendationUnCheck'));\r\n }\r\n },\r\n\r\n logFormAnalyticsEvent: function (action, label) {\r\n var jsonForFormEvents;\r\n var inputForGaForms = document.getElementById(\"FormAbandonmentEvents\");\r\n\r\n if (inputForGaForms && inputForGaForms.value !== \"\" && window.ga) {\r\n jsonForFormEvents = JSON.parse(inputForGaForms.value);\r\n ga(\"gtm2.send\", \"event\", \"Form Abandonment\", JSON.parse(jsonForFormEvents[0])[action], JSON.parse(jsonForFormEvents[1])[label]);\r\n }\r\n },\r\n\r\n GeneralAjaxCallAction: function (control, data, url, action) {\r\n var self = this;\r\n control.attr(\"disabled\", \"disabled\");\r\n\r\n jQuery.ajax({\r\n url: url,\r\n type: \"POST\",\r\n data: data,\r\n success: function (html) {\r\n if (window.NewHomeSource.ModalLoader) {\r\n window.NewHomeSource.ModalLoader.resetIsModalLoadedFlag();\r\n }\r\n\r\n if (self.parameters.postLeadSendFunc != null || typeof html !== 'string') {\r\n if (typeof (action) != \"undefined\") {\r\n action.call(self, html);\r\n }\r\n }\r\n else if (typeof html === 'string') {\r\n const container = document.querySelector('[data-trackers-container]');\r\n\r\n if (container) {\r\n const fragment = document.createRange().createContextualFragment(html);\r\n container.innerHTML = '';\r\n container.append(fragment);\r\n container.style.display = 'none';\r\n }\r\n\r\n if (typeof (action)!= \"undefined\") {\r\n action.call(self, control);\r\n }\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: {\r\n eventType: \"GAEvent\",\r\n price_reduction: '',\r\n }\r\n }\r\n }));\r\n }\r\n }, error: function () {\r\n control.removeAttr(\"disabled\");\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * Gets the additional information that should be included in the comment field for the on page form.\r\n * @param {element} form The form element.\r\n * @returns The information that should be appended to the comment field.\r\n */\r\n GetCommentsData: function (form) {\r\n const optionTextSelected = Array.from(form.querySelectorAll(\"[name='form-options']:checked\")).map(x => x.dataset.comment).join(\", \");\r\n\r\n if (optionTextSelected.length > 0) {\r\n return `Interested in: ${optionTextSelected}.`;\r\n }\r\n\r\n return optionTextSelected;\r\n },\r\n\r\n SendAskQuestionLead: function (control, data, url) {\r\n const self = this;\r\n control.attr(\"disabled\", \"disabled\");\r\n jQuery.ajax({\r\n url: url,\r\n type: \"POST\",\r\n data: data,\r\n success: function (html) {\r\n if (window.NewHomeSource.ModalLoader) {\r\n window.NewHomeSource.ModalLoader.resetIsModalLoadedFlag();\r\n }\r\n self.sendSegmentEventFavorites(control[0]);\r\n jQuery(\"#nhs_ajaxContent\").html(html);\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: {\r\n eventType: \"GAEvent\",\r\n price_reduction: '',\r\n }\r\n }\r\n }));\r\n }\r\n });\r\n }\r\n};\r\n\r\n(function () {\r\n \"use strict\";\r\n\r\n if (\"function\" === typeof define && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // and to the global (window) object in case any JS module is expecting\r\n // the lazyLoad to exists on the window object.\r\n define([], function () {\r\n return LeadModal;\r\n });\r\n } else if (\"object\" === typeof exports) {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code \r\n // is expected to work with this lazyLoad.\r\n module.exports = LeadModal;\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n\r\n if (\"undefined\" === typeof NHS || null === NHS) {\r\n NHS = {};\r\n }\r\n if (\"undefined\" === typeof NHS.Scripts || null === NHS.Scripts) {\r\n NHS.Scripts = {};\r\n }\r\n\r\n NHS.Scripts.LeadModal = LeadModal;\r\n }\r\n\r\n // polyfill for closest method\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n }\r\n\r\n if (!Element.prototype.closest) {\r\n Element.prototype.closest = function (s) {\r\n var element = this;\r\n\r\n do {\r\n if (element.matches(s)) {\r\n return element;\r\n }\r\n element = element.parentElement || element.parentNode;\r\n } while (element !== null && element.nodeType === 1);\r\n\r\n return null;\r\n };\r\n }\r\n\r\n const observerOptions = {\r\n childList: true,\r\n subtree: true\r\n };\r\n\r\n function callback(mutations) {\r\n mutations.forEach((mutation) => {\r\n for (const node of mutation.addedNodes) {\r\n if (!(node instanceof HTMLElement)) { continue; }\r\n\r\n if (node.matches('[data-thank-you-modal]') || node.closest('[data-thank-you-modal]') || node.querySelector('[data-thank-you-modal]')) {\r\n const button = node.querySelector('[data-back-to-search]');\r\n const isSearchPage = document.querySelector('#nhs_ResultList');\r\n const isBuilderShowcase = document.querySelector('[data-component=\"builder-showcase-data\"]');\r\n const breadcrumb = document.querySelector('.nhs_Breadcrumb:not(.nhs_StateBreadcrumb)');\r\n const signInButton = node.querySelector('[data-sign-in]');\r\n\r\n if(signInButton){\r\n signInButton.addEventListener('click', () => {\r\n window.openedModal._hide();\r\n if (window.NewHomeSource && window.NewHomeSource.ModalLoader) {\r\n window.NewHomeSource.ModalLoader.hideModal();\r\n }\r\n window.auth0Dom.signIn({});\r\n });\r\n }\r\n\r\n // if it's a search page, close the modal instead of reloading the page\r\n if (isSearchPage) {\r\n button.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n if (window.NewHomeSource && window.NewHomeSource.ModalLoader) {\r\n window.window.NewHomeSource.ModalLoader.hideModal();\r\n }\r\n });\r\n }\r\n\r\n // if there's no href, the user entered the detail page directly\r\n if (button && !button.href && breadcrumb) {\r\n const url = breadcrumb.href;\r\n button.href = url;\r\n }\r\n\r\n // if the page is builder showcase, hide the back to search CTA since we don't have a way of getting the previous SRP link\r\n if(button && isBuilderShowcase){\r\n button.parentElement.removeChild(button);\r\n }\r\n \r\n }\r\n }\r\n });\r\n }\r\n\r\n const observer = new MutationObserver(callback);\r\n observer.observe(document.documentElement, observerOptions);\r\n}());","(function (global, factory) {\r\n 'use strict';\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // and to the global (window) object in case any JS module.\r\n define([], function () {\r\n return (global.formValidator = factory(global));\r\n });\r\n } else if (typeof exports === 'object') {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code\r\n // is expected to work\r\n module.exports = (global.formValidator = factory(global));\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.formValidator = factory(global);\r\n }\r\n}(typeof window !== 'undefined' ? window : {}, function () {\r\n 'use strict';\r\n\r\n let inputsSelector = \"fieldset input:enabled:not([type='checkbox']):not([type='button']):not([type='submit']):not([type='hidden']), fieldset textarea, fieldset select:not([disabled])\";\r\n\r\n let validateInput = function (inputField) {\r\n let input = inputField;\r\n input.value = input.value.trim();\r\n let isValidInput = true;\r\n let pattern = new RegExp(input.getAttribute('data-pattern'));\r\n let errorElement = input.parentElement.querySelector('[data-error-message]') ||\r\n input.parentElement.parentElement.querySelector('[data-error-message]') ||\r\n input.parentElement.querySelector('.ao-form-error-message');\r\n\r\n if (!input.required && (input.value === '' || input.getAttribute('data-pattern') === null || pattern.test(input.value)) ||\r\n (input.required && pattern.test(input.value)) ||\r\n (input.required && input.getAttribute('data-pattern') == null && input.value.trim().length > 0)) {\r\n errorElement.textContent = '';\r\n input.removeAttribute('aria-invalid');\r\n inputField.setCustomValidity('');\r\n } else {\r\n isValidInput = false;\r\n input.setAttribute('aria-invalid', true);\r\n input.setAttribute('aria-describedby', errorElement.id);\r\n input.classList.add('nhs_Error');\r\n\r\n if (input.required && input.value === '') {\r\n const errorRequiredMessage = errorElement.getAttribute('data-required-message');\r\n errorElement.textContent = errorRequiredMessage;\r\n inputField.setCustomValidity(errorRequiredMessage);\r\n } else {\r\n const errorInvalidMessage = errorElement.getAttribute('data-invalid-message');\r\n errorElement.textContent = errorInvalidMessage;\r\n inputField.setCustomValidity(errorInvalidMessage);\r\n }\r\n }\r\n\r\n return isValidInput;\r\n };\r\n\r\n let displayFormErrors = function () {\r\n let errorsList = document.querySelectorAll('[data-error-message]');\r\n\r\n for (let i = 0; i < errorsList.length; i += 1) {\r\n errorsList[i].style.display = 'block';\r\n }\r\n };\r\n\r\n let clearFormErrors = function (form) {\r\n let errorElements = form.querySelectorAll('[data-error-message]');\r\n let invalidInputs = form.querySelectorAll(\"[aria-invalid='true'][aria-describedby]\");\r\n\r\n for (let i = 0; i < invalidInputs.length; i += 1) {\r\n invalidInputs[i].removeAttribute('aria-invalid');\r\n invalidInputs[i].removeAttribute('aria-describedby');\r\n invalidInputs[i].classList.remove('nhs_Error');\r\n }\r\n\r\n for (let i = 0; i < errorElements.length; i += 1) {\r\n errorElements[i].textContent = '';\r\n }\r\n };\r\n\r\n let clearForm = function (form) {\r\n let inputsList = form.querySelectorAll(inputsSelector);\r\n for (let i = 0; i < inputsList.length; i += 1) {\r\n inputsList[i].value = '';\r\n }\r\n\r\n clearFormErrors(form);\r\n };\r\n\r\n function addErrorClassToEmailSuggestions(form){\r\n const suggestionsContainer = form.parentElement.querySelector('[data-suggestions-container]');\r\n\r\n if(suggestionsContainer){\r\n suggestionsContainer.classList.add('suggestion_error');\r\n }\r\n }\r\n\r\n let validateForm = function (form, avoidFocusFirstInput) {\r\n let inputsList = form.querySelectorAll(inputsSelector);\r\n let isValidForm = true;\r\n\r\n clearFormErrors(form);\r\n\r\n for (let i = 0; i < inputsList.length; i += 1) {\r\n let currentInput = inputsList[i];\r\n let isValidInput;\r\n const inputName = currentInput.name.toLowerCase();\r\n\r\n // recommended name attributes by google\r\n // https://developers.google.com/web/updates/2015/06/checkout-faster-with-autofill\r\n switch (inputName) {\r\n case 'fname':\r\n case 'lname':\r\n case 'firstname':\r\n case 'lastname':\r\n case 'first': // Required by external code used to handle basic leads\r\n case 'last': // Required by external code used to handle basic leads\r\n case 'name':\r\n case 'postal':\r\n case 'zipcode':\r\n case 'password':\r\n case 'passwordconfirm':\r\n case 'businessphone':\r\n case 'phone':\r\n case 'userphonenumber':\r\n case 'realtorquestion':\r\n case 'textcomment':\r\n case 'preferredarrivaltime':\r\n case 'askstatelist':\r\n case 'askcommunitylist':\r\n isValidInput = validateInput(currentInput);\r\n isValidForm = isValidForm && isValidInput;\r\n break;\r\n case 'email':\r\n case 'mailaddress':\r\n isValidInput = validateInput(currentInput);\r\n isValidForm = isValidForm && isValidInput;\r\n addErrorClassToEmailSuggestions(form);\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n if (!isValidForm && avoidFocusFirstInput !== true) {\r\n let firstInvalidElement = form.querySelector(\"input[aria-invalid='true']\");\r\n if (firstInvalidElement) {\r\n firstInvalidElement.focus();\r\n }\r\n }\r\n\r\n displayFormErrors(form);\r\n\r\n return isValidForm;\r\n };\r\n\r\n return {\r\n validateForm: validateForm,\r\n clearForm: clearForm,\r\n clearFormErrors: clearFormErrors\r\n };\r\n}));\r\n","/**\r\n * This JavaScript code defines a module, NewHomeSource.GoogleOneTapHandler, responsible for handling Google One Tap\r\n * authentication on NewHomeSource.\r\n * The module provides functions for loading the Google One Tap API asynchronously, displaying the One Tap login modal,\r\n * and parsing the JSON Web Token (JWT) obtained from the authentication process.\r\n * It utilizes promises for handling the asynchronous operations, ensures single-loading of the Google One Tap API,\r\n * and includes callbacks for various events such as library loading and authentication success.\r\n * The module is designed to seamlessly integrate Google One Tap authentication into NewHomeSource, promoting a\r\n * simplified and secure user authentication experience.\r\n */\r\n(function googleOneTapHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousGoogleOneTapHandler = global.NewHomeSource.GoogleOneTapHandler;\r\n let GoogleOneTapHandler = {};\r\n\r\n const googleOneTapInstance = {\r\n isGoogleOneTapLoaded: false,\r\n isGoogleOneTapLoading: false,\r\n clientId: null,\r\n onAuthenticated: null,\r\n };\r\n\r\n // Interval to sample waiting for the load event; this number is arbitrary.\r\n const googleOneTapLoadSampleRate = 100;\r\n\r\n /**\r\n * If the Google One Tap API fails to load, set the loading and loaded flags to false and reject the promise.\r\n * @param reject - A function that rejects the promise.\r\n */\r\n const onGoogleOneTapError = (reject) => {\r\n googleOneTapInstance.isGoogleOneTapLoading = false;\r\n googleOneTapInstance.isGoogleOneTapLoaded = false;\r\n reject(new Error('Unable to load Google One Tap API.'));\r\n };\r\n\r\n /**\r\n * When the Google One Tap API is loaded, set the isGoogleOneTapLoaded property of the googleOneTapInstance object to\r\n * true and resolve the promise.\r\n * @param resolve - A function that is called when the promise is resolved.\r\n */\r\n const onGoogleOneTapLoaded = (resolve) => {\r\n window.google.accounts.id.initialize({\r\n client_id: googleOneTapInstance.clientId,\r\n callback: googleOneTapInstance.onAuthenticated,\r\n cancel_on_tap_outside: false,\r\n // Due to Intelligent Tracking Prevention (ITP), the normal One Tap UX doesn't work on\r\n // Chrome on iOS, Safari, or Firefox. A different UX is provided instead on these browsers.\r\n itp_support: true,\r\n use_fedcm_for_prompt: true,\r\n });\r\n googleOneTapInstance.isGoogleOneTapLoaded = true;\r\n resolve();\r\n };\r\n\r\n /**\r\n * Create a script element, set its source to the Google One Tap source,\r\n * set its onerror property to a function that rejects the promise,\r\n * set its onload property to a function that resolves the promise.\r\n * @param resolve - The function to call when the script has loaded.\r\n * @param reject - A function that is called when the promise is rejected.\r\n */\r\n const appendGoogleOneTapScript = (resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://accounts.google.com/gsi/client';\r\n script.async = true;\r\n script.defer = true;\r\n script.onerror = onGoogleOneTapError.bind(this, reject);\r\n script.onload = onGoogleOneTapLoaded.bind(this, resolve);\r\n document.head.appendChild(script);\r\n };\r\n\r\n /**\r\n * If the Google One Tap is loaded, resolve the promise.\r\n * If not, wait the amount of time from googleOneTapLoadSampleRate and try again.\r\n * @param resolve - The resolve function of the promise.\r\n */\r\n const isGoogleOneTapLoaded = (resolve) => {\r\n if (googleOneTapInstance.isGoogleOneTapLoaded) {\r\n resolve();\r\n } else {\r\n setTimeout(isGoogleOneTapLoaded.bind(null, resolve), googleOneTapLoadSampleRate);\r\n }\r\n };\r\n\r\n /**\r\n * Wait the amount of time from googleOneTapLoadSampleRate for Google One Tap to load, and then resolve the promise.\r\n * @returns A promise that will resolve when the Google One Tap API is loaded.\r\n */\r\n const waitForGoogleOneTap = () => new Promise((resolve) => {\r\n setTimeout(isGoogleOneTapLoaded.bind(null, resolve), googleOneTapLoadSampleRate);\r\n });\r\n\r\n /**\r\n * loadGoogleOneTap: if the Google One Tap instance is not loading, then load it.\r\n * If it is loading, wait for it to load.\r\n * If it is loaded, resolve the promise\r\n * @param googleOneTapSetUpInformation - contains information needed to initialize Google One Tap,\r\n * this object contains callbacks for events like library loaded, library errored, on authentication,\r\n * and a value representing the client ID of NewHomeSource in Google Project Console platform.\r\n * @returns A promise.\r\n */\r\n function loadGoogleOneTap(googleOneTapSetUpInformation) {\r\n googleOneTapInstance.clientId = googleOneTapSetUpInformation.clientId;\r\n googleOneTapInstance.onAuthenticated = googleOneTapSetUpInformation.onAuthenticated;\r\n\r\n if (!googleOneTapInstance.isGoogleOneTapLoading) {\r\n // Set the Google One Tap instance as loading to prevent multiple requests.\r\n googleOneTapInstance.isGoogleOneTapLoading = true;\r\n return new Promise(appendGoogleOneTapScript)\r\n .then(googleOneTapSetUpInformation.onLibraryLoaded)\r\n .catch(googleOneTapSetUpInformation.onLibraryErrored);\r\n }\r\n\r\n if (googleOneTapInstance.isGoogleOneTapLoaded) {\r\n // If the Google One Tap instance is already loaded resolve the promise.\r\n return Promise.resolve()\r\n .then(googleOneTapSetUpInformation.onLibraryLoaded)\r\n .catch(googleOneTapSetUpInformation.onLibraryErrored);\r\n }\r\n\r\n // Otherwise wait to review if the Google One Tap instance has loaded.\r\n return waitForGoogleOneTap()\r\n .then(googleOneTapSetUpInformation.onLibraryLoaded)\r\n .catch(googleOneTapSetUpInformation.onLibraryErrored);\r\n }\r\n\r\n /**\r\n * showGoogleOneTapModal: this function will prompt the google one tap login modal to the user.\r\n */\r\n function showGoogleOneTapModal() {\r\n window.google.accounts.id.prompt();\r\n }\r\n\r\n /**\r\n * showGoogleOneTapModal: this function will hide the google one tap login modal to the user.\r\n */\r\n function hideGoogleOneTapModal() {\r\n if (window.google && window.google.accounts) {\r\n window.google.accounts.id.cancel();\r\n }\r\n }\r\n\r\n /**\r\n * parseJsonWebToken: This function is designed to parse a JSON Web Token (JWT) by extracting\r\n * and decoding its payload.\r\n * JWTs consist of three parts: a header, a payload, and a signature, each separated by a period ('.').\r\n * This function focuses on the payload, which is base64-encoded.\r\n * The function decodes the base64-encoded payload and returns the corresponding JSON object.\r\n * @param {string} token the JWT from which the payload needs to be extracted and decoded.\r\n * @returns a json object containing the payload information retrieved from the JWT.\r\n */\r\n const parseJsonWebToken = (token) => {\r\n const base64Url = token.split('.')[1];\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n const jsonPayload = decodeURIComponent(window.atob(base64)\r\n .split('')\r\n .map((character) => '%' + ('00' + character.charCodeAt(0).toString(16)).slice(-2))\r\n .join(''));\r\n\r\n return JSON.parse(jsonPayload);\r\n };\r\n\r\n /**\r\n * onAuthenticated: callback executed when Google One Tap successfully authenticated an user.\r\n * @param {object} googleResponse containing the information needed to authenticate the user in NewHomeSource.\r\n */\r\n const onAuthenticated = async (googleResponse) => {\r\n const idToken = parseJsonWebToken(googleResponse.credential);\r\n const parameters = {\r\n payload: {\r\n locale: idToken.locale,\r\n picture: idToken.picture,\r\n email: idToken.email,\r\n name: idToken.name,\r\n givenName: idToken.given_name,\r\n familyName: idToken.family_name,\r\n subject: idToken.sub,\r\n audience: idToken.aud,\r\n emailVerified: idToken.email_verified,\r\n notBeforeTimeSeconds: idToken.nbf,\r\n hostedDomain: idToken.hd,\r\n issuer: idToken.iss,\r\n issuedAtTimeSeconds: idToken.iat,\r\n expirationTimeSeconds: idToken.exp,\r\n jwtId: idToken.jti\r\n },\r\n keepMeLogged: true\r\n };\r\n\r\n const response = await fetch('/ajax/googleOneTapLogin', {\r\n method: 'POST',\r\n body: JSON.stringify(parameters),\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n if (response.ok) {\r\n const data = await response.json();\r\n\r\n if (data && data.Success) {\r\n window.location.reload();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * initialize: this is the entrance point of the Google Authentication with One Tap flow.\r\n * This function gets executed after the page has finished loading to avoid any performance\r\n * affectation to core functionality.\r\n */\r\n const initialize = () => {\r\n const googleOneTapClientId = document.querySelector('#nhs_googleOneTapClientId');\r\n\r\n // If the element [data-sign-in] is in the DOM, the user has NOT logged In\r\n const isUserLoggedIn = !document.querySelector('[data-sign-in]');\r\n\r\n if (googleOneTapClientId && !isUserLoggedIn) {\r\n const googleOneTapInformation = {\r\n onLibraryLoaded: showGoogleOneTapModal,\r\n onLibraryErrored: null,\r\n onAuthenticated,\r\n clientId: googleOneTapClientId.value,\r\n };\r\n\r\n loadGoogleOneTap(googleOneTapInformation);\r\n }\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.GoogleOneTapHandler\r\n */\r\n GoogleOneTapHandler = () => {\r\n if (document.readyState === 'complete') {\r\n initialize();\r\n } else {\r\n global.addEventListener('load', initialize);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.GoogleOneTapHandler to the previous script.\r\n */\r\n GoogleOneTapHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.GoogleOneTapHandler = previousGoogleOneTapHandler;\r\n return GoogleOneTapHandler;\r\n };\r\n\r\n GoogleOneTapHandler();\r\n\r\n document.addEventListener('modalOpened', () => {\r\n hideGoogleOneTapModal();\r\n });\r\n\r\n return GoogleOneTapHandler;\r\n}(window));\r\n"]}