{"version":3,"sources":["base.js"],"names":["fetchNext","el","endpoint","insertCallback","indexParams","JSON","parse","dataset","params","updatedIndexParams","Object","assign","controller_action","urlParams","URLSearchParams","toString","indexOf","fetchUrl","nextPage","parseInt","Date","now","replace","window","fetch","then","response","json","entries","length","loadingElement","document","getElementById","style","display","done","catch","err","console","log","insertNext","buildCallback","indexContainer","containerAction","action","matchingAction","newFollowersHTML","listId","forEach","entry","elId","id","newHTML","followList","insertAdjacentHTML","fetching","buildFollowsHTML","follows","path","username","profile_image","name","buildTagsHTML","tag","followingButtonContainer","unhideButtonContainer","explicit_points","tag_id","short_summary","taggings_count","toLocaleString","fetchNextFollowingPage","includes","fetchNextFollowersPage","buildVideoArticleHTML","videoArticle","cloudinary_video_url","title","video_duration_in_minutes","user","insertVideos","videoArticles","newVideosHTML","documentElement","scrollHeight","body","scrollTop","parentNode","querySelector","frag","createRange","createContextualFragment","appendChild","fetchNextVideoPage","insertArticles","articles","newArticlesHTML","currentUser","userData","currentUserId","outerHTML","article","existingEl","location","pathname","parentElement","classList","contains","buildArticleHTML","initializeReadingListIcons","newNode","createElement","add","innerHTML","addEventListener","event","target","element","articlePath","InstantClick","preload","singleArticles","querySelectorAll","insertAfter","observeFeedElements","paginate","requiresApproval","searchHash","per_page","page","tag_names","push","approved","homeEl","feed","class_name","hidden_tags","followed_tags","reduce","array","points","sort_by","articlesSince","searchParams","keys","key","value","Array","isArray","arrayValue","append","method","headers","Accept","X-CSRF-Token","csrfToken","Content-Type","credentials","content","result","checkBlockedContentEvent","CustomEvent","dispatchEvent","fetchNextPageIfNearBottom","fetchCallback","scrollableElem","indexWhich","which","scrollY","checkIfNearBottomOfPage","getElementsByClassName","search","setInterval","initScrolling","called","initializeAllTagEditButtons","tagEditButton","tagAdminButton","admin","moderator_for_tags","initializeProfileImage","src","profile_image_90","addRelevantButtonsToArticle","articleContainer","buttonsInitialized","actions","published","scheduled","authorId","clickToEditButton","articleId","pinnedArticleId","join","addRelevantButtonsToComments","settingsButts","i","butt","commentableUserId","userId","remove","trusted","modButts","className","setCurrentUserToNavBar","userNavLink","href","getElementsByTagName","textContent","initializeBaseUserData","initializeBillboardVisibility","billboards","ad","display_sponsors","trackAdImpression","adBox","isBot","test","navigator","userAgent","adSeen","impressionRecorded","tokenMeta","getAttribute","dataBody","billboard_event","billboard_id","context_type","contextType","category","categoryImpression","stringify","error","trackAdClick","adClicked","clickRecorded","categoryClick","observeBillboards","observer","IntersectionObserver","isIntersecting","elem","intersectionRatio","setTimeout","root","rootMargin","threshold","observe","removeEventListener","removeExistingCSRF","csrfTokenMeta","csrfParamMeta","removeChild","fetchBaseData","token","param","broadcast","creator","newCsrfParamMeta","head","newCsrfTokenMeta","loaded","checkUserLoggedIn","browserStoreCache","ga","gtag","initializeBodyData","broadcastData","camelizedBroadcastKey","match","string","toUpperCase","addCloseButtonClickHandle","onclick","localStorage","setItem","renderBroadcast","broadcastElement","data","banner_class","html","defaultClass","additionalClass","split","closeButton","initializeBroadcast","shouldHideBroadcast","frameElement","display_announcements","getItem","firstElementChild","toggle","initializeCommentDate","addLocalizedDateTimeToElementsTitles","initializeCommentsPage","toggleCodeOfConduct","userStatus","commentableId","commentableType","hasRecentCommentActivity","commentableIdList","ajaxReq","XMLHttpRequest","onreadystatechange","readyState","DONE","responseObj","reactions","allNodes","publicReactionCounts","public_reaction_counts","buttForComment","reactable_id","setAttribute","reactionsCountWrapper","reactionsLabelWrapper","count","I18n","t","toLowerCase","commentAuthorId","current_user","currentUserComment","userActionsEl","buttEl","commentId","open","send","butts","successCb","reactionCount","thisButt","reactionLabel","this","preventDefault","sendHapticMessage","disabled","formData","FormData","getCsrfToken","sendFetch","status","showModalAfterError","action_ing","action_past","showLoginModal","referring_source","trigger","replyButts","parentId","closest","waitingOnCSRF","clearInterval","commentWrapper","buildCommentFormHTML","focus","handleCommentSubmit","listenForDetailsToggle","handleHiddenComments","codeOfConduct","checked_code_of_conduct","checkboxWrapper","form","textarea","height","blur","parentComment","commentParentId","comment","body_markdown","commentable_id","commentable_type","parent_id","newComment","buildCommentHTML","docBody","checkbox","mainCommentsForm","handleFormClose","depth","replyTrigger","threadIndicator","iconSmallThread","actionsNode","insertBefore","nextSibling","commentInputs","input","comment_template","preview","togglePreview","container","firstChild","newDiv","url","replaceWith","updateCommentsCount","activateRunkitTags","handleFocus","handleButtonsActivation","area","handleSizeChange","Forem","initializeEnhancedCommentTextArea","handleKeyUp","handleSubmit","trim","click","handleKeyDown","Runtime","hasOSSpecificModifier","keyCode","ENTER_KEY_CODE","oldHeight","buttons","from","button","validateField","handleChange","generateUploadFormdata","image","updateItemSummaryHtml","item","itemSummaryContent","usernames","number","itemUsername","detailItems","commentsCountDiv","commentsCountData","commentsCount","commentsSidebarCountDiv","commentsDates","commentableAuthorIds","coAuthorIds","coAuthorId","commentsContainer","commentableAuthorId","commentableCoAuthorIds","podCastEpisodeContainer","creatorId","collapseCommentsHiddenByCommentableUser","initializeCreditsPage","localizeTimeElements","year","month","day","hour","minute","second","initializeLocalStorageRender","initializeOnboardingTaskCard","taskCard","createdAt","created_at","setDate","getDate","initializePaymentPointers","userPointer","basePointer","meta","paymentPointer","setReadingListButtonsState","addReadingListCountToHomePage","readingListButtons","highlightButton","buttonIdInt","reactableId","reading_list_ids","reactToReadingListButtonClick","saveInitialized","readingListContainers","e","readingListCount","renderOptimisticResult","properButtonFromEvent","buttonFormData","renderButtonState","renderNewSidebarCount","newCount","tagName","isReadingListButtonHoverTarget","readingListButtonMouseHandler","textReplacement","config_body_class","removeItem","cookieEnabled","undefined","tagIcon","bg_color_hex","podcast","slug","image_url","summary","parsedDocument","DOMParser","parseFromString","alt","info","flareTag","currentTag","flare_tag","tagString","tagList","tag_list","cached_tag_list_array","filter","commentsDisplay","comments_count","commentsAriaLabelText","picUrl","profileUsername","userName","reactionsCount","public_reactions_count","reactionsDisplay","reactionsText","reactionIcons","icons","public_reaction_categories","icon","concat","reverse","main_image","filterXSS","forOrganization","organizationLogo","organizationClasses","organization","timeAgoInWords","published_at_int","timeAgo","oldTimeInSeconds","publishDate","readable_publish_date","published_timestamp","isArticle","previewCardContent","user_id","bodyTextSnippet","searchSnippetHTML","highlight","body_text","firstSnippetChar","startingEllipsis","readingTimeHTML","reading_time","saveButton","saveSVG","saveFilledSVG","videoHTML","video_duration_string","navigationLink","feedContentAttribute","authToken","commentCount","Math","floor","random","iconSmallOverflowHorizontal","iconCollapse","iconExpand","depthClass","detailsStartHTML","detailsEndHTML","commentHeader","commentFooter","commentAvatar","newly_created","profile_pic","react","reply","body_html","iconSmallComment","replyButton","num","iconSmallHeart","iconSmallHeartFilled","heart_ids","dynamicallyLoadScript","script","Promise","resolve","reject","metaTag","MAX_RETRIES","Honeybadger","notify","Error","RETRY_INTERVAL","getCurrentPage","classString","getImageForLink","imageUrl","$fetchedImageUrls","Image","referenceNode","isTouchDevice","timestampToLocalDateTime","timestamp","locale","options","time","formattedTime","Intl","DateTimeFormat","format","elements","timestampAttribute","localDateTime","timestampToLocalDateTimeLong","timeOptions","language","weekday","timestampToLocalDateTimeShort","currentYear","getFullYear","localStorageTest","preventDefaultAction","switchStatement","addTokenToBody","message","webkit","messageHandlers","haptic","postMessage","trackingData","showModal","contentSelector","overlay","onOpen","ahoyTracking","ahoy","track","version","source","slideSidebar","side","direction","mainContent","secondsToHumanUnitAgo","seconds","times","scale","wholeUnits","formatter","humanTime","maxDisplayedAge","timeNow","diff","round","watchForLongTouch","longTouchEvent","Event","minDuration","timer","dispatcher","onTouchStart","onTouchEnd","clearTimeout","oncontextmenu","stopPropagation","stopImmediatePropagation","callInitializers","initializePage","waitingForDataLoad","initializeBaseApp","on","init","client","globalThis","n","r","s","o","u","a","require","f","code","l","exports","call","1","module","getDefaultWhiteList","onTag","onIgnoreTag","onTagAttr","onIgnoreTagAttr","escapeHtml","REGEXP_LT","REGEXP_GT","safeAttrValue","cssFilter","friendlyAttrValue","_","substr","REGEXP_DEFAULT_ON_TAG_ATTR_4","lastIndex","REGEXP_DEFAULT_ON_TAG_ATTR_7","REGEXP_DEFAULT_ON_TAG_ATTR_8","defaultCSSFilter","process","escapeAttrValue","escapeQuote","str","REGEXP_QUOTE","unescapeQuote","REGEXP_QUOTE_2","escapeHtmlEntities","REGEXP_ATTR_VALUE_1","String","fromCharCode","escapeDangerHtml5Entities","REGEXP_ATTR_VALUE_COLON","REGEXP_ATTR_VALUE_NEWLINE","clearNonPrintableCharacter","str2","len","charCodeAt","charAt","onIgnoreTagStripAll","StripTagBody","tags","next","isRemoveTag","isRemoveAllTag","removeList","posStart","isClosing","ret","end","position","rethtml","lastPos","pos","slice","stripCommentTag","STRIP_COMMENT_TAG_REGEXP","stripBlankChar","chars","char","c","FilterCSS","getDefaultCSSWhiteList","whiteList","./util","cssfilter","2","FilterXSS","DEFAULT","parser","./default","./parser","./xss","3","getTagName","parseTag","tagStart","quoteStart","currentPos","currentHtml","currentTagName","parseAttr","onAttr","addAttr","REGEXP_ATTR_NAME","retAttrs","tmpName","j","findNextEqual","findBeforeEqual","stripQuoteWrap","isQuoteWrapString","text","4","arr","prototype","fn","scope","5","isNull","obj","getAttrs","closing","shallowCopyObject","stripIgnoreTag","css","me","allowCommentTag","stripIgnoreTagBody","retHtml","sourcePosition","isWhite","attrs","whiteAttrList","attrsHtml","isWhiteAttr","6","onIgnoreAttr","parseStyle","check","RegExp","opts","7","align-content","align-items","align-self","alignment-adjust","alignment-baseline","all","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","box-snap","box-suppress","break-after","break-before","break-inside","caption-side","chains","clear","clip","clip-path","clip-rule","color","color-interpolation-filters","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","counter-increment","counter-reset","counter-set","crop","cue","cue-after","cue-before","cursor","display-inside","display-list","display-outside","dominant-baseline","elevation","empty-cells","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flood-color","flood-opacity","flow-from","flow-into","font","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","hyphens","image-orientation","image-resolution","ime-mode","initial-letters","inline-box-align","justify-content","justify-items","justify-self","left","letter-spacing","lighting-color","line-box-contain","line-break","line-grid","line-height","line-snap","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marker-side","marks","mask","mask-box","mask-box-outset","mask-box-repeat","mask-box-slice","mask-box-source","mask-box-width","mask-clip","mask-image","mask-origin","mask-position","mask-repeat","mask-size","mask-source-type","mask-type","max-height","max-lines","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","presentation-level","quotes","region-fragment","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-merge","ruby-position","shape-image-threshold","shape-outside","shape-margin","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","text-align","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-orientation","text-overflow","text-shadow","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","wrap-flow","wrap-through","writing-mode","z-index","8","filterCSS","./css","9","addNewAttr","isParenthesisOpen","retCSS","trimRight","cssLength","10","global","factory","define","amd","self","getDefaultExportFromCjs","x","__esModule","hasOwnProperty","getAugmentedNamespace","default","apply","arguments","defineProperty","k","d","getOwnPropertyDescriptor","get","enumerable","stackString","stack","line","parseResult","parseChrome","parseWinjs","parseGecko","parseNode","parseJSC","parts","chromeRe","exec","isNative","isEval","submatch","chromeEvalRe","file","methodName","UNKNOWN_FUNCTION","lineNumber","column","winjsRe","geckoRe","geckoEvalRe","javaScriptCoreRe","nodeRe","stringNameOfElement","stringClassNames","attrName","attr","siblings","getSiblings","stringSelectorOfElement","parentName","stringTextOfElement","innerText","type","truncate","nativeFetch","globalThisOrWindow","sandbox","contentWindow","warn","func","parseURL","protocol","host","localURLPathname","parsed","parsedDocURL","URL","decodeCookie","pair","_a","encodeCookie","object","cookies","nodes","childNodes","siblings_1","node","ignoreNextOnError","ignoreOnError","currentTimeout","onError","_window","util_1$5","load","instrument$4","original","onerror","msg","col","logger","debug","config","enableUncaught","notice","makeNotice","addBreadcrumb","metadata","default_1$3","util_1$4","enableUnhandledRejection","instrument$3","onunhandledrejection","promiseRejectionEvent","reason","fileName","stackFallback","default_1$2","util_1$3","breadcrumbsEnabled","inspectArray","map","level","instrument$2","args","sanitize$1","Function","selector","xhr","__hb_xhr","onreadystatechangeHandler","status_code","Request","recordUrlChange","to","lastHref","historyWrapper","history","default_1$1","util_1$2","instrumentTimer","wrapOpts","delay","args_1","__wrap","instrument$1","component","default_1","util_1$1","prop","instrument","listener","useCapture","wantsUntrusted","handleEvent","objectEntries","commonjsGlobal","browser$1","util$1","require$$0","freeze","__proto__","merge","obj1","obj2","mergeNotice","notice1","notice2","context","objectIsEmpty","objectIsExtensible","isExtensible","makeBacktrace","filterHbSourceCode","backtrace","stackTraceParser","splice","calculateBacktraceShift","isFrameFromHbSourceCode","frame","hasHbFile","hasHbMethod","shift","nextFrame","DEFAULT_BACKTRACE_SHIFT","getCauses","cause","causes","class","getSourceForBacktrace","getSourceFileHandler","__awaiter","index","trace","fileContent","__generator","label","sent","getSourceCodeSnippet","runBeforeNotifyHandlers","handlers","handler","runAfterNotifyHandlers","afterNotify","shallowClone","sanitize","maxDepth","seen","seenObjects","canSerialize","typeOfObj","serialize","safeSerialize","v","_i","unshift","thing","isErrorObject","replacement","__hb_original","_e","base","generateStackTrace","maxStackSize","curr","callee","$1","caller","filters","newObj","is","filterMatch","klass","filterUrl","query","formatCGIData","vars","prefix","formattedVars","formattedKey","clone","fileData","sourceRadius","lines","isBrowserConfig","async","__createBinding","create","m","k2","desc","writable","configurable","__setModuleDefault","__importStar","mod","thisArg","_arguments","P","generator","adopt","fulfilled","step","rejected","verb","op","TypeError","y","ops","pop","trys","g","throw","return","Symbol","iterator","store","GlobalStore","util_1$7","contents","breadcrumbsLimit","available","getContents","setContext","breadcrumb","breadcrumbs","run","callback","__assign","p","Client","util_1$6","store_1","notifier","TAG_SEPARATOR","NOT_BLANK","transport","__pluginsExecuted","__store","__beforeNotifyHandlers","__afterNotifyHandlers","apiKey","environment","hostname","projectRoot","revision","reportData","maxBreadcrumbs","maxObjectDepth","developmentEnvironments","afterUncaught","__plugins","__initStore","__transport","getVersion","configure","_this","plugin","beforeNotify","resetContext","noticeable","extra","preConditionError","__developmentMode","sourceCodeData","beforeNotifyResult","__breadcrumbs","__getSourceFileHandler","sourcePerTrace","payload","__buildPayload","X-API-Key","res","statusCode","uuid","notifyAsync","partialNotice","originalAfterNotify","applyAfterNotify","noticeTags","__constructTags","contextTags","configTags","uniqueTags","toISOString","__getBreadcrumbs","__getContext","cgiData","enabled","trail","fingerprint","request","cgi_data","session","server","project_root","environment_name","toUTCString","details","types","__exportStar","Util","Types","client_1","util","preferCatch","atob","ErrorEvent","colno","core_1$5","core_1$3","timers","event_listeners","BrowserTransport","util_1","headerArray","requestInit","extendStatics","__extends","b","setPrototypeOf","__","constructor","__importDefault","getUserFeedbackScriptUrl","core_1","onerror_1","onunhandledrejection_1","breadcrumbs_1","timers_1","event_listeners_1","transport_1","getProjectRoot","majorMinorVersion","_super","userFeedbackEndpoint","maxErrors","__errorsSent","__lastWrapErr","__lastNoticeId","__exceedsMaxErrors","__incrementErrorsCount","_error","resetMaxErrors","checkIn","showUserFeedbackForm","isUserFeedbackScriptUrlAlreadyVisible","noticeId","getUserFeedbackSubmitUrl","onLoad","onload","feedbackScriptUrl","scripts","cookiesObject","HTTP_USER_AGENT","HTTP_REFERER","HTTP_COOKIE","referrer","___hb","core_2","toFixed","precision","decimalAdjust","isObject","isFunction","isSet","val","isString","isNumber","isBoolean","exp","isNaN","NaN","lazyEvaluate","dest","DATE","day_names","abbr_day_names","month_names","abbr_month_names","meridian","NUMBER_FORMAT","separator","delimiter","strip_insignificant_zeros","CURRENCY_FORMAT","unit","sign_first","PERCENTAGE_FORMAT","SIZE_UNITS","DEFAULT_OPTIONS","defaultLocale","defaultSeparator","placeholder","fallbacks","translations","missingBehaviour","missingTranslationPrefix","reset","initializeOptions","locales","list","localeParts","firstFallback","secondFallback","nullableFallbackLocale","pluralization","currentLocale","lookup","scopes","fullScope","getFullScope","defaultValue","pluralizationLookupWithoutFallback","pluralizerKey","pluralizerKeys","pluralizer","pluralizationLookup","date","am","pm","prepareOptions","subject","createTranslationOptions","translationOptions","defaults","translate","translation","usedScope","optionsWithoutDefault","some","translationOption","interpolate","pluralize","missingTranslation","regex","matches","nullPlaceholder","missingPlaceholder","p1","p2","toNumber","formattedNumber","negative","abs","buffer","sign","max","toCurrency","localize","toPercentage","localizedValue","toTime","parseDate","convertedDate","fraction","UTC","setTime","$2","$3","$6","$4","$5","strftime","meridianOptions","getTime","weekDay","getDay","getMonth","getHours","hour12","secs","getSeconds","mins","getMinutes","offset","getTimezoneOffset","absOffsetHours","absOffsetMinutes","timezoneoffset","dateString","date_string","toHumanSize","kb","iterations","extend","bind","visitsUrl","urlPrefix","eventsUrl","isEmpty","canTrackNow","useBeacon","trackNow","canStringify","withCredentials","setCookie","ttl","Cookies","set","cookieDomain","domain","getCookie","destroyCookie","setReady","queue","isReady","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","onEvent","eventName","matchedElement","skip","getClosest","documentReady","generateId","saveEventQueue","eventQueue","csrfParam","CSRFProtection","setRequestHeader","sendRequest","success","$","ajax","contentType","dataType","beforeSend","xhrFields","header","eventData","events","visit_token","visitor_token","trackEvent","ready","trackEventNow","events_json","sendBeacon","presence","cleanObject","eventProperties","section","attribute","hasAttribute","createVisit","visitId","getVisitId","visitorId","getVisitorId","trackVisits","visitDuration","visitorDuration","platform","landing_page","screen_width","screen","screen_height","js","visitParams","expires","toGMTString","cookie","escape","nameEQ","ca","substring","unescape","startOnReady","Ahoy","jQuery","Zepto","getVisitToken","getVisitorToken","properties","trackView","additionalProperties","propName","trackClicks","trackSubmits","trackChanges","start","instantClick","$userAgent","removeHash","getLinkTarget","nodeName","isNotPreloadable","isPreloadable","$currentLocationWithoutHash","triggerPageEvent","eventType","arg1","arg2","arg3","returnValue","$eventsCallbacks","altered","changePage","newUrl","pageContentDiv","memberMenuButton","replaceChild","routeChangeTarget","pushState","hashIndex","hashElem","samePage","offsetParent","offsetTop","scrollTo","$isChromeForIOS","instantanize","setPreloadingAsHalted","$isPreloading","$isWaitingForCompletion","removeNoscriptTags","mousedownListener","$lastTouchTimestamp","mouseoverListener","mouseoutListener","$delayBeforePreload","$urlToPreload","$preloadTimer","touchstartListener","$preloadOnMousedown","focusListener","clickListener","metaKey","ctrlKey","$xhr","abort","readystatechangeListener","processXHR","$url","$timing","getResponseHeader","doc","implementation","createHTMLDocument","responseText","alteredOnReceive","$fetchedBodies","elems","children","found","$trackedAssets","$mustRedirect","popstateListener","loc","$history","pageYOffset","isInitializing","originalElement","copyElement","scriptElementsInDOM","scriptElementsToCopy","attributes","option","internalUrl","removeExpiredKeys","getURLInfo","preloadingMode","supported","addRefreshBehavior","waitingOnPTR","PullToRefresh","mainElement","passive","onRefresh","reload","receive","wait","change","restore","honeybadgerKey","releaseFootprint","pattern"],"mappings":"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","sourceRoot":"/assets","sourcesContent":["/* global insertAfter, insertArticles, buildArticleHTML, nextPage:writable, fetching:writable, done:writable, InstantClick */\n\n// The purpose of initScrolling is to start paginating the page once you reach the bottom of the page.\n// It does this for majority of the views on the dashboard page as well as the home feed.\n\nvar client;\n/**\n *\n * @param {String} el is an HTML element that contains the container that we want to append items to. It contains id: indexContainer.\n * @param {String} endpoint is the relative URL of the endpoint to call to get the data\n * @param {Function} insertCallback is a function from the return of the callback function (insertNext). The function is passed the data as an argument to build the HTML.\n * @returns nil but calls the insertCallback (i.e. the insertEntries function) with the data as an argument to update the HTML. It also handles the loading spinner.\n */\nfunction fetchNext(el, endpoint, insertCallback) {\n var indexParams = JSON.parse(el.dataset.params);\n // I change the name of the param from \"action\" to \"controller_action\" prior to the fetch because Rails ignores the\n // \"action\" param in the corresponding endpoint controller because it is a reserved word in Rails. Based on the above\n // I thought it would be safe to do the param name update for now until we can refactor this file and change the coupled architecture.\n // \"action\" renamed to \"controller_action\" is the name of the action from the originating server side request e.g. hidden_tags in the dashboard_controller.\n const updatedIndexParams = {};\n if (indexParams['action']) {\n delete Object.assign(updatedIndexParams, indexParams, {\n ['controller_action']: indexParams['action'],\n })['action'];\n }\n\n var urlParams = new URLSearchParams(updatedIndexParams).toString();\n if (urlParams.indexOf('q=') \u003e -1) {\n return;\n }\n\n var fetchUrl =\n `${endpoint}?page=${nextPage}\u0026${urlParams}\u0026signature=${parseInt(\n Date.now() / 400000,\n 10,\n )}`.replace('\u0026\u0026', '\u0026');\n window\n .fetch(fetchUrl)\n .then(function handleResponse(response) {\n response.json().then(function insertEntries(entries) {\n nextPage += 1;\n insertCallback(entries);\n if (entries.length === 0) {\n const loadingElement = document.getElementById('loading-articles');\n if (loadingElement) {\n loadingElement.style.display = 'none';\n }\n done = true;\n }\n });\n })\n .catch(function logError(err) {\n // eslint-disable-next-line no-console\n console.log(err);\n });\n}\n\n/**\n *\n * @param {*} params are the dataset params on an wrapping container like 'index-container'. It contains the action and the elID.\n * The elID is the id of the element that we are appending to.\n * The action like 'following_tags' is the action that we are taking.\n * @param {*} buildCallback is the callback function (the buildFollowsHTML function) that will be called after the data is fetched.\n * It will be passed the data as an argument, and insert the HTML into the DOM.\n * @returns a function that will be called after the data is fetched from the caller.\n */\nfunction insertNext(params, buildCallback) {\n return function insertEntries(entries = []) {\n var indexContainer = document.getElementById('index-container');\n var containerAction =\n JSON.parse(indexContainer.dataset.params).action || null;\n var action = params.action || null;\n var matchingAction = action === containerAction;\n var list = document.getElementById(params.listId || 'sublist');\n var newFollowersHTML = '';\n entries.forEach(function insertAnEntry(entry) {\n let existingEl = document.getElementById(\n (params.elId || 'element') + '-' + entry.id,\n );\n if (!existingEl) {\n var newHTML = buildCallback(entry);\n newFollowersHTML += newHTML;\n }\n });\n\n var followList = document.getElementById('following-wrapper');\n if (followList \u0026\u0026 matchingAction) {\n followList.insertAdjacentHTML('beforeend', newFollowersHTML);\n }\n if (nextPage \u003e 0) {\n fetching = false;\n }\n };\n}\n\n/**\n * Constructs the HTML for a follows entry using the data from the follows entries object.\n *\n * @param {*} follows is the entries for the follows that we are building HTML for.\n * @returns an HTML block for the follows.\n */\nfunction buildFollowsHTML(follows) {\n return (\n '\u003cdiv class=\"crayons-card p-4 m:p-6 flex s:grid single-article\" id=\"follows-' +\n follows.id +\n '\"\u003e' +\n '\u003ca href=\"' +\n follows.path +\n '\" class=\"crayons-avatar crayons-avatar--2xl s:mb-2 s:mx-auto\"\u003e' +\n '\u003cimg alt=\"@' +\n follows.username +\n ' profile image\" class=\"crayons-avatar__image\" src=\"' +\n follows.profile_image +\n '\" /\u003e' +\n '\u003c/a\u003e' +\n '\u003cdiv class=\"pl-4 s:pl-0 self-center\"\u003e' +\n '\u003ch3 class=\"s:mb-1 p-0\"\u003e' +\n '\u003ca href=\"' +\n follows.path +\n '\"\u003e' +\n follows.name +\n '\u003c/a\u003e' +\n '\u003c/h3\u003e' +\n '\u003cp class=\"s:mb-4\"\u003e' +\n '\u003ca href=\"' +\n follows.path +\n '\" class=\"crayons-link crayons-link--secondary\"\u003e' +\n '@' +\n follows.username +\n '\u003c/a\u003e' +\n '\u003c/p\u003e' +\n '\u003c/div\u003e' +\n '\u003c/div\u003e'\n );\n}\n\n/**\n * Constructs the HTML for a tag entry using the data from the tag object.\n * @param {*} tag is the entry for which we are building HTML for.\n * @returns an HTML block for a tag follow.\n */\nfunction buildTagsHTML(tag) {\n let followingButtonContainer = '';\n let unhideButtonContainer = '';\n\n if (tag.explicit_points \u003c 0) {\n unhideButtonContainer = `\u003cdiv\u003e\n \u003cbutton class=\"c-btn c-btn--primary c-btn--destructive unhide-button\"\u003eUnhide\u003c/button\u003e\n \u003c/div\u003e`;\n }\n\n if (tag.explicit_points \u003e= 0) {\n followingButtonContainer = `\u003cdiv class=\"flex justify-between\"\u003e\n \u003cdiv\u003e\n \u003cbutton class=\"crayons-btn crayons-btn--outlined follow-button\" aria-label=\"Following tag:${tag.name}\"\u003eFollowing\u003c/button\u003e\n \u003c/div\u003e\n \u003cdiv class=\"dropdown-trigger-container relative\"\u003e\n \u003cbutton type=\"button\" aria-label=\"Unhide tag: ${tag.name}\" class=\"c-btn c-btn--icon-alone dropdown-trigger\" id=\"options-dropdown-trigger-${tag.tag_id}\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-controls=\"options-dropdown\"\u003e\n \u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" class=\"crayons-icon\" role=\"img\" aria-labelledby=\"arimcllskwkmbfpxyu52b8vzin20raon\"\u003e\u003ctitle id=\"arimcllskwkmbfpxyu52b8vzin20raon\"\u003eOptions\u003c/title\u003e\u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7 12a2 2 0 11-4 0 2 2 0 014 0zm7 0a2 2 0 11-4 0 2 2 0 014 0zm5 2a2 2 0 100-4 2 2 0 000 4z\"\u003e\u003c/path\u003e\u003c/svg\u003e\n \u003c/button\u003e\n \u003cdiv class=\"crayons-dropdown right-0 left-0 s:left-auto\" id=\"options-dropdown-${tag.tag_id}\"\u003e\n \u003cul class=\"p-0\"\u003e\n \u003cli\u003e\n \u003cbutton type=\"button\" class=\"hide-button c-btn w-100 align-left flex items-center\" aria-label=\"Hide tag: ${tag.name}\"\u003e\n \u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" class=\"crayons-icon\" role=\"img\" aria-labelledby=\"avelns726vzvmu4rpqxq8olxhll9obh\"\u003e\u003ctitle id=\"avelns726vzvmu4rpqxq8olxhll9obh\"\u003eHide tag\u003c/title\u003e\n \u003cpath d=\"M17.882 19.297A10.95 10.95 0 0 1 12 21c-5.392 0-9.878-3.88-10.82-9a10.982 10.982 0 0 1 3.34-6.066L1.393 2.808l1.415-1.415 19.799 19.8-1.415 1.414-3.31-3.31zM5.935 7.35A8.965 8.965 0 0 0 3.223 12a9.006 9.006 0 0 0 13.2 5.838l-2.027-2.028A4.5 4.5 0 0 1 8.19 9.604L5.935 7.35zm6.979 6.978-3.242-3.242a2.5 2.5 0 0 0 3.24 3.241l.002.001zm7.893 2.264-1.431-1.43a8.936 8.936 0 0 0 1.4-3.162A9.006 9.006 0 0 0 9.553 5.338L7.974 3.76A10.99 10.99 0 0 1 12 3c5.392 0 9.878 3.88 10.819 9a10.949 10.949 0 0 1-2.012 4.592zm-9.084-9.084a4.5 4.5 0 0 1 4.769 4.77l-4.77-4.77z\"\u003e\u003c/path\u003e\n \u003c/svg\u003e\n \u003cspan class=\"ml-2\"\u003eHide tag\u003c/span\u003e\n \u003c/button\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e`;\n }\n\n let short_summary = '';\n if (tag.short_summary) {\n short_summary = `\u003cp class=\"mb-6 fs-s color-base-70 truncate-at-3\"\u003e${tag.short_summary}\u003c/p\u003e`;\n }\n\n // TODO: remove the data-follow-id and the data-tag-id in the child components\n return `\n \u003cdiv class=\"dashboard__tag__container crayons-card p-3 pt-2 m:p-5 m:pt-4 relative flex flex-col single-article break-word content-center\" id=\"follows-${\n tag.id\n }\" data-follow-id=\"${tag.id}\" data-tag-id=\"${tag.tag_id}\"\u003e\n \u003cdiv class=\"mb-1 flex items-center justify-between\"\u003e\n \u003ch4 class=\"-ml-2\"\u003e\n \u003ca href=\"/t/${tag.name}\" class=\"crayons-tag crayons-tag--l\"\u003e\n \u003cspan class=\"crayons-tag__prefix\"\u003e#\u003c/span\u003e${tag.name}\n \u003c/a\u003e\n \u003c/h4\u003e\n \u003cdiv class=\"fs-xs color-base-60\"\u003e${tag.taggings_count.toLocaleString()} posts\u003c/div\u003e\n \u003c/div\u003e\n ${short_summary}\n\n ${unhideButtonContainer}\n ${followingButtonContainer}\n \u003c/div\u003e`;\n}\n\n/**\n * Fetches the next page for the given element.\n *\n * @param {*} el is the element that we are fetching the next page for.\n * @returns nil but carries out actions to fetch, build and insert the HTML into the DOM for the next page\n */\nfunction fetchNextFollowingPage(el) {\n var indexParams = JSON.parse(el.dataset.params);\n var action = indexParams.action;\n if (action.includes('users')) {\n fetchNext(\n el,\n '/followings/users',\n insertNext({ elId: 'follows', action }, buildFollowsHTML),\n );\n } else if (action.includes('podcasts')) {\n fetchNext(\n el,\n '/followings/podcasts',\n insertNext({ elId: 'follows', action }, buildFollowsHTML),\n );\n } else if (action.includes('organizations')) {\n fetchNext(\n el,\n '/followings/organizations',\n insertNext({ elId: 'follows', action }, buildFollowsHTML),\n );\n } else if (action.includes('hidden_tags')) {\n fetchNext(\n el,\n '/followings/tags',\n insertNext({ elId: 'follows', action }, buildTagsHTML),\n );\n } else {\n // This \"else\" accounts for `followings_tags`, it would make more sense to explicitly check for\n // the condition rather than have a catch-all else statement. Hence, we need to double check\n // what cases the catch-all cover and then move it into an explicit condition.\n fetchNext(\n el,\n '/followings/tags',\n insertNext({ elId: 'follows', action }, buildTagsHTML),\n );\n }\n}\n\nfunction fetchNextFollowersPage(el) {\n fetchNext(\n el,\n '/api/followers/users',\n insertNext({ elId: 'follows' }, buildFollowsHTML),\n );\n}\n\nfunction buildVideoArticleHTML(videoArticle) {\n return `\u003ca href=\"${videoArticle.path}\" id=\"video-article-${videoArticle.id}\" class=\"crayons-card media-card\"\u003e\n \u003cdiv class=\"media-card__artwork\"\u003e\n \u003cimg src=\"${videoArticle.cloudinary_video_url}\" class=\"w-100 object-cover block aspect-16-9 h-auto\" width=\"320\" height=\"180\" alt=\"${videoArticle.title}\"\u003e\n \u003cspan class=\"media-card__artwork__badge\"\u003e${videoArticle.video_duration_in_minutes}\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"media-card__content\"\u003e\n \u003ch2 class=\"fs-base mb-2 fw-medium\"\u003e${videoArticle.title}\u003c/h2\u003e\n \u003csmall class=\"fs-s\"\u003e\n ${videoArticle.user.name}\n \u003c/small\u003e\n \u003c/div\u003e\n \u003c/a\u003e`;\n}\n\nfunction insertVideos(videoArticles) {\n var list = document.getElementById('subvideos');\n var newVideosHTML = '';\n videoArticles.forEach(function insertAVideo(videoArticle) {\n var existingEl = document.getElementById(\n 'video-article-' + videoArticle.id,\n );\n if (!existingEl) {\n var newHTML = buildVideoArticleHTML(videoArticle);\n newVideosHTML += newHTML;\n }\n });\n\n var distanceFromBottom =\n document.documentElement.scrollHeight - document.body.scrollTop;\n\n var parentNode = document.querySelector('.js-video-collection');\n var frag = document.createRange().createContextualFragment(newVideosHTML);\n parentNode.appendChild(frag);\n\n if (nextPage \u003e 0) {\n fetching = false;\n }\n}\n\nfunction fetchNextVideoPage(el) {\n fetchNext(el, '/api/videos', insertVideos);\n}\n\nfunction insertArticles(articles) {\n var list = document.getElementById('substories');\n var newArticlesHTML = '';\n var el = document.getElementById('home-articles-object');\n var currentUser = userData();\n var currentUserId = currentUser \u0026\u0026 currentUser.id;\n if (el) {\n el.outerHTML = '';\n }\n articles.forEach(function insertAnArticle(article) {\n var existingEl = document.getElementById('article-link-' + article.id);\n if (\n ![\n '/',\n '/top/week',\n '/top/month',\n '/top/year',\n '/top/infinity',\n '/latest',\n ].includes(window.location.pathname) \u0026\u0026\n existingEl \u0026\u0026\n existingEl.parentElement \u0026\u0026\n existingEl.parentElement.classList.contains('crayons-story') \u0026\u0026\n !document.getElementById('video-player-' + article.id)\n ) {\n existingEl.parentElement.outerHTML = buildArticleHTML(\n article,\n currentUserId,\n );\n } else if (!existingEl) {\n var newHTML = buildArticleHTML(article, currentUserId);\n newArticlesHTML += newHTML;\n initializeReadingListIcons();\n }\n });\n var distanceFromBottom =\n document.documentElement.scrollHeight - document.body.scrollTop;\n var newNode = document.createElement('div');\n newNode.classList.add('paged-stories');\n newNode.innerHTML = newArticlesHTML;\n\n newNode.addEventListener('click', (event) =\u003e {\n const { classList } = event.target;\n\n // This looks a little messy, but it's the only\n // way to make the entire card clickable.\n if (\n classList.contains('crayons-story') ||\n classList.contains('crayons-story__top') ||\n classList.contains('crayons-story__body') ||\n classList.contains('crayons-story__indention') ||\n classList.contains('crayons-story__title') ||\n classList.contains('crayons-story__tags') ||\n classList.contains('crayons-story__bottom')\n ) {\n let element = event.target;\n let { articlePath } = element.dataset;\n\n while (!articlePath) {\n articlePath = element.dataset.articlePath;\n element = element.parentElement;\n }\n\n InstantClick.preload(articlePath);\n InstantClick.display(articlePath);\n }\n });\n\n var singleArticles = document.querySelectorAll(\n '.single-article, .crayons-story',\n );\n var lastElement = singleArticles[singleArticles.length - 1];\n insertAfter(newNode, lastElement);\n if (window.observeFeedElements \u0026\u0026 articles.length \u003e 0) {\n window.observeFeedElements();\n }\n if (nextPage \u003e 0) {\n fetching = false;\n }\n}\n\nfunction paginate(tag, params, requiresApproval) {\n const searchHash = Object.assign(\n { per_page: 15, page: nextPage },\n JSON.parse(params),\n );\n\n if (tag \u0026\u0026 tag.length \u003e 0) {\n searchHash.tag_names = searchHash.tag_names || [];\n searchHash.tag_names.push(tag);\n }\n searchHash.approved = requiresApproval === 'true' ? 'true' : '';\n\n var homeEl = document.getElementById('index-container');\n if (homeEl.dataset.feed === 'base-feed') {\n searchHash.class_name = 'Article';\n const isHomePageFeed = window.location.pathname == '/';\n if (isHomePageFeed \u0026\u0026 userData()) {\n const hidden_tags = JSON.parse(userData().followed_tags).reduce(function (\n array,\n tag,\n ) {\n if (tag.points \u003c 0) {\n array.push(tag.name);\n }\n return array;\n },\n []);\n\n searchHash.hidden_tags = hidden_tags;\n }\n } else if (homeEl.dataset.feed === 'latest') {\n searchHash.class_name = 'Article';\n searchHash.sort_by = 'published_at';\n } else {\n searchHash.class_name = 'Article';\n searchHash['published_at[gte]'] = homeEl.dataset.articlesSince;\n searchHash.sort_by = 'public_reactions_count';\n }\n\n // Brute force copying code from a utility for quick fix\n const searchParams = new URLSearchParams();\n Object.keys(searchHash).forEach((key) =\u003e {\n const value = searchHash[key];\n if (Array.isArray(value)) {\n value.forEach((arrayValue) =\u003e {\n searchParams.append(`${key}[]`, arrayValue);\n });\n } else {\n searchParams.append(key, value);\n }\n });\n\n fetch(`/search/feed_content?${searchParams.toString()}`, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-Token': window.csrfToken,\n 'Content-Type': 'application/json',\n },\n credentials: 'same-origin',\n })\n .then((response) =\u003e response.json())\n .then((content) =\u003e {\n nextPage += 1;\n insertArticles(content.result);\n const checkBlockedContentEvent = new CustomEvent('checkBlockedContent');\n window.dispatchEvent(checkBlockedContentEvent);\n initializeReadingListIcons();\n if (content.result.length === 0) {\n const loadingElement = document.getElementById('loading-articles');\n if (loadingElement) {\n loadingElement.style.display = 'none';\n }\n done = true;\n }\n });\n}\n\nfunction fetchNextPageIfNearBottom() {\n var indexContainer = document.getElementById('index-container');\n var elCheck = indexContainer \u0026\u0026 !document.getElementById('query-wrapper');\n if (!elCheck) {\n return;\n }\n\n var indexWhich = indexContainer.dataset.which;\n\n var fetchCallback;\n var scrollableElem;\n\n if (indexWhich === 'videos') {\n scrollableElem = document.getElementById('main-content');\n fetchCallback = function fetch() {\n fetchNextVideoPage(indexContainer);\n };\n } else if (indexWhich === 'followers') {\n scrollableElem = document.getElementById('user-dashboard');\n fetchCallback = function fetch() {\n fetchNextFollowersPage(indexContainer);\n };\n } else if (indexWhich === 'following') {\n scrollableElem = document.getElementById('user-dashboard');\n fetchCallback = function fetch() {\n fetchNextFollowingPage(indexContainer);\n };\n } else {\n scrollableElem =\n document.getElementById('main-content') ||\n document.getElementById('articles-list');\n\n fetchCallback = function fetch() {\n paginate(\n indexContainer.dataset.tag,\n indexContainer.dataset.params,\n indexContainer.dataset.requiresApproval,\n );\n };\n }\n\n if (\n !done \u0026\u0026\n !fetching \u0026\u0026\n window.scrollY \u003e scrollableElem.scrollHeight - 3700\n ) {\n fetching = true;\n fetchCallback();\n }\n}\n\n/**\n * Checks if the user is near the bottom of the page and if so, fetches the next page.\n * It also sets up an interval to check if the user is near the bottom of the page.\n */\nfunction checkIfNearBottomOfPage() {\n const loadingElement = document.getElementById('loading-articles');\n if (\n (document.getElementsByClassName('crayons-story').length \u003c 2 \u0026\u0026\n document.getElementsByClassName('single-article').length \u003c 2) ||\n window.location.search.indexOf('q=') \u003e -1\n ) {\n if (loadingElement) {\n loadingElement.style.display = 'none';\n }\n done = true;\n } else if (loadingElement) {\n loadingElement.style.display = 'block';\n }\n\n fetchNextPageIfNearBottom();\n setInterval(function handleInterval() {\n fetchNextPageIfNearBottom();\n }, 210);\n}\n\n/**\n * Initializes the scrolling for the page. It looks for the index-container element and if it exists, it sets up the scrolling.\n */\nfunction initScrolling() {\n var elCheck = document.getElementById('index-container');\n\n if (elCheck) {\n initScrolling.called = true;\n checkIfNearBottomOfPage();\n }\n};\n'use strict';\n\nfunction initializeAllTagEditButtons() {\n var tagEditButton = document.getElementById('tag-edit-button');\n var tagAdminButton = document.getElementById('tag-admin-button');\n var user = userData();\n if (user.admin \u0026\u0026 tagAdminButton) {\n tagAdminButton.style.display = 'inline-block';\n document.getElementById('tag-admin-button').style.display = 'inline-block';\n }\n if (\n user \u0026\u0026\n tagEditButton \u0026\u0026\n (user.moderator_for_tags.indexOf(tagEditButton.dataset.tag) \u003e -1 ||\n user.admin)\n ) {\n tagEditButton.style.display = 'inline-block';\n document.getElementById('tag-mod-button').style.display = 'inline-block';\n }\n};\n/* global filterXSS */\nfunction initializeProfileImage(user) {\n if (!document.getElementById('comment-primary-user-profile--avatar')) return;\n document.getElementById('comment-primary-user-profile--avatar').src =\n user.profile_image_90;\n}\n\nfunction addRelevantButtonsToArticle(user) {\n var articleContainer = document.getElementById('article-show-container');\n\n if (\n articleContainer \u0026\u0026\n articleContainer.dataset.buttonsInitialized !== 'true'\n ) {\n let actions = [];\n\n const published = JSON.parse(articleContainer.dataset.published);\n const scheduled = JSON.parse(articleContainer.dataset.scheduled);\n\n if (parseInt(articleContainer.dataset.authorId, 10) === user.id) {\n actions.push(\n `\u003ca class=\"crayons-btn crayons-btn--s crayons-btn--ghost px-2\" href=\"${articleContainer.dataset.path}/edit\" rel=\"nofollow\"\u003eEdit\u003c/a\u003e`,\n );\n\n let clickToEditButton = document.getElementById('author-click-to-edit');\n if (clickToEditButton) {\n clickToEditButton.style.display = 'inline-block';\n }\n\n if (published === true \u0026\u0026 !scheduled) {\n actions.push(\n `\u003ca class=\"crayons-btn crayons-btn--s crayons-btn--ghost px-2\" id =\"article-action-space-manage\" href=\"${articleContainer.dataset.path}/manage\" rel=\"nofollow\"\u003eManage\u003c/a\u003e`,\n );\n }\n\n actions.push(\n `\u003ca class=\"crayons-btn crayons-btn--s crayons-btn--ghost px-2\" href=\"${articleContainer.dataset.path}/stats\" rel=\"nofollow\"\u003eStats\u003c/a\u003e`,\n );\n }\n\n const { articleId, pinnedArticleId } = articleContainer.dataset;\n\n // we hide the buttons for draft articles, for non admins and\n // if there's already a pinned post different from the current one\n if (user.admin) {\n actions.push(\n `\u003ca class=\"crayons-btn crayons-btn--s crayons-btn--ghost px-2\" href=\"/admin/content_manager/articles/${articleId}\" data-no-instant\u003eAdmin\u003c/a\u003e`,\n );\n }\n\n document.getElementById('action-space').innerHTML = actions.join('');\n articleContainer.dataset.buttonsInitialized = 'true';\n }\n}\n\nfunction addRelevantButtonsToComments(user) {\n if (document.getElementById('comments-container')) {\n // buttons are actually \u003cspan\u003e's\n var settingsButts = document.getElementsByClassName('comment-actions');\n\n for (let i = 0; i \u003c settingsButts.length; i += 1) {\n let butt = settingsButts[i];\n const { action, commentableUserId, userId } = butt.dataset;\n if (parseInt(userId, 10) === user.id \u0026\u0026 action === 'settings-button') {\n butt.innerHTML =\n '\u003ca href=\"' +\n butt.dataset.path +\n '\" rel=\"nofollow\" class=\"crayons-link crayons-link--block\" data-no-instant\u003eSettings\u003c/a\u003e';\n butt.classList.remove('hidden');\n butt.classList.add('block');\n }\n\n if (\n action === 'hide-button' \u0026\u0026\n parseInt(commentableUserId, 10) === user.id\n ) {\n butt.classList.remove('hidden');\n butt.classList.add('block');\n }\n }\n\n if (user.trusted) {\n var modButts = document.getElementsByClassName('mod-actions');\n for (let i = 0; i \u003c modButts.length; i += 1) {\n let butt = modButts[i];\n if (butt.classList.contains('mod-actions-comment-button')) {\n butt.innerHTML =\n '\u003ca href=\"' +\n butt.dataset.path +\n '\" rel=\"nofollow\" class=\"crayons-link crayons-link--block\"\u003eModerate\u003c/a\u003e';\n }\n butt.className = 'mod-actions';\n butt.classList.remove('hidden');\n butt.classList.add('block');\n }\n }\n }\n}\n\nfunction setCurrentUserToNavBar(user) {\n const userNavLink = document.getElementById('first-nav-link');\n userNavLink.href = `/${user.username}`;\n userNavLink.getElementsByTagName('span')[0].textContent = user.name;\n userNavLink.getElementsByTagName(\n 'small',\n )[0].textContent = `@${user.username}`;\n document.getElementById('nav-profile-image').src = user.profile_image_90;\n if (user.admin) {\n document\n .getElementsByClassName('js-header-menu-admin-link')[0]\n .classList.remove('hidden');\n }\n}\n\nfunction initializeBaseUserData() {\n const user = userData();\n setCurrentUserToNavBar(user);\n initializeProfileImage(user);\n addRelevantButtonsToArticle(user);\n addRelevantButtonsToComments(user);\n};\nfunction initializeBillboardVisibility() {\n var billboards = document.querySelectorAll('[data-display-unit]');\n\n if (billboards \u0026\u0026 billboards.length == 0) {\n return;\n }\n\n var user = userData();\n\n billboards.forEach((ad) =\u003e {\n if (user \u0026\u0026 !user.display_sponsors \u0026\u0026 ad.dataset['typeOf'] == 'external') {\n ad.classList.add('hidden');\n } else {\n ad.classList.remove('hidden');\n }\n });\n}\n\nfunction trackAdImpression(adBox) {\n var isBot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex/i.test(\n navigator.userAgent,\n ); // is crawler\n var adSeen = adBox.dataset.impressionRecorded;\n if (isBot || adSeen) {\n return;\n }\n\n var tokenMeta = document.querySelector(\"meta[name='csrf-token']\");\n var csrfToken = tokenMeta \u0026\u0026 tokenMeta.getAttribute('content');\n\n var dataBody = {\n billboard_event: {\n billboard_id: adBox.dataset.id,\n context_type: adBox.dataset.contextType,\n category: adBox.dataset.categoryImpression,\n },\n };\n\n window\n .fetch('/billboard_events', {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': csrfToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(dataBody),\n credentials: 'same-origin',\n })\n .catch((error) =\u003e console.error(error));\n\n adBox.dataset.impressionRecorded = true;\n}\n\nfunction trackAdClick(adBox) {\n var isBot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex/i.test(\n navigator.userAgent,\n ); // is crawler\n var adClicked = adBox.dataset.clickRecorded;\n if (isBot || adClicked) {\n return;\n }\n\n var tokenMeta = document.querySelector(\"meta[name='csrf-token']\");\n var csrfToken = tokenMeta \u0026\u0026 tokenMeta.getAttribute('content');\n\n var dataBody = {\n billboard_event: {\n billboard_id: adBox.dataset.id,\n context_type: adBox.dataset.contextType,\n category: adBox.dataset.categoryClick,\n },\n };\n window.fetch('/billboard_events', {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': csrfToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(dataBody),\n credentials: 'same-origin',\n });\n\n adBox.dataset.clickRecorded = true;\n}\n\nfunction observeBillboards() {\n let observer = new IntersectionObserver(\n (entries) =\u003e {\n entries.forEach((entry) =\u003e {\n if (entry.isIntersecting) {\n let elem = entry.target;\n\n if (entry.intersectionRatio \u003e= 0.25) {\n setTimeout(function () {\n trackAdImpression(elem);\n }, 1);\n }\n }\n });\n },\n {\n root: null, // defaults to browser viewport\n rootMargin: '0px',\n threshold: 0.25,\n },\n );\n\n document.querySelectorAll('[data-display-unit]').forEach((ad) =\u003e {\n observer.observe(ad);\n ad.removeEventListener('click', trackAdClick, false);\n ad.addEventListener('click', function (e) {\n trackAdClick(ad);\n });\n });\n}\n\nwindow.addEventListener(\n 'load',\n (event) =\u003e {\n observeBillboards();\n },\n false,\n);\n/* global checkUserLoggedIn */\n\nfunction removeExistingCSRF() {\n var csrfTokenMeta = document.querySelector(\"meta[name='csrf-token']\");\n var csrfParamMeta = document.querySelector(\"meta[name='csrf-param']\");\n if (csrfTokenMeta \u0026\u0026 csrfParamMeta) {\n csrfTokenMeta.parentNode.removeChild(csrfTokenMeta);\n csrfParamMeta.parentNode.removeChild(csrfParamMeta);\n }\n}\n\nfunction fetchBaseData() {\n fetch('/async_info/base_data')\n .then((response) =\u003e response.json())\n .then(({ token, param, broadcast, user, creator }) =\u003e {\n if (token) {\n removeExistingCSRF();\n }\n\n const newCsrfParamMeta = document.createElement('meta');\n newCsrfParamMeta.name = 'csrf-param';\n newCsrfParamMeta.content = param;\n document.head.appendChild(newCsrfParamMeta);\n\n const newCsrfTokenMeta = document.createElement('meta');\n newCsrfTokenMeta.name = 'csrf-token';\n newCsrfTokenMeta.content = token;\n document.head.appendChild(newCsrfTokenMeta);\n document.body.dataset.loaded = 'true';\n\n if (broadcast) {\n document.body.dataset.broadcast = broadcast;\n }\n\n if (checkUserLoggedIn()) {\n document.body.dataset.user = user;\n document.body.dataset.creator = creator;\n browserStoreCache('set', user);\n\n setTimeout(() =\u003e {\n if (typeof ga === 'function') {\n ga('set', 'userId', JSON.parse(user).id);\n }\n if (typeof gtag === 'function') {\n gtag('set', 'user_Id', JSON.parse(user).id);\n }\n }, 400);\n } else {\n // Ensure user data is not exposed if no one is logged in\n delete document.body.dataset.user;\n delete document.body.dataset.creator;\n browserStoreCache('remove');\n }\n });\n}\n\nfunction initializeBodyData() {\n fetchBaseData();\n};\n/* eslint-disable camelcase */\n/**\n * Parses the broadcast object on the document into JSON.\n *\n * @function broadcastData\n * @returns {Object} Returns an object of the parsed broadcast data.\n */\nfunction broadcastData() {\n const { broadcast = null } = document.body.dataset;\n\n return JSON.parse(broadcast);\n}\n\n/**\n * Parses the broadcast object on the document into JSON.\n *\n * @function camelizedBroadcastKey\n * @param {string} title The title of the broadcast.\n * @returns {string} Returns the camelized title appended with \"Seen\".\n */\nfunction camelizedBroadcastKey(title) {\n const camelizedTitle = title.replace(/\\W+(.)/g, (match, string) =\u003e {\n return string.toUpperCase();\n });\n\n return `${camelizedTitle}Seen`;\n}\n\n/**\n * A function that finds the close button and adds a click handler to it.\n * The click handler sets a key in local storage and removes the broadcast\n * element entirely from the DOM.\n *\n * @function addCloseButtonClickHandle\n * @param {string} title The title of the broadcast.\n */\nfunction addCloseButtonClickHandle(title) {\n var closeButton = document.getElementsByClassName(\n 'close-announcement-button',\n )[0];\n closeButton.onclick = (e) =\u003e {\n localStorage.setItem(camelizedBroadcastKey(title), true);\n document.getElementById('active-broadcast').remove();\n };\n}\n\n/**\n * A function to insert the broadcast's HTML into the `active-broadcast` element.\n * Determines what classes to add to the broadcast element,\n * and inserts a close button and adds a click handler to it.\n *\n * Adds a `.broadcast-visible` class to the broadcastElement to make it display.\n *\n * @function initializeBroadcast\n * @param {string} broadcastElement The HTML element for the broadcast, with a class of `.active-broadcast`.\n * @param {Object} data An object representing the parsed broadcast data.\n */\nfunction renderBroadcast(broadcastElement, data) {\n const { banner_class, html, title } = data;\n\n if (banner_class) {\n const [defaultClass, additionalClass] = banner_class.split(' ');\n if (additionalClass) {\n broadcastElement.classList.add(defaultClass, additionalClass);\n } else {\n broadcastElement.classList.add(defaultClass);\n }\n }\n\n const closeButton = `\u003cbutton class=\"close-announcement-button crayons-btn crayons-btn--icon-rounded crayons-btn--inverted crayons-btn--ghost\"\u003e\n \u003csvg class=\"crayons-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636l4.95 4.95z\" /\u003e\u003c/svg\u003e\n \u003c/button\u003e`;\n\n broadcastElement.insertAdjacentHTML(\n 'afterbegin',\n `\u003cdiv class='broadcast-data'\u003e${html}\u003c/div\u003e${closeButton}`,\n );\n addCloseButtonClickHandle(title);\n broadcastElement.classList.add('broadcast-visible');\n}\n\n/**\n * A function to determine if a broadcast should render.\n * Does not render a broadcast in an iframe, or on `/connect` and `/new` routes.\n * Does not render a broadcast if the current user has opted-out,\n * if the broadcast has already been inserted, or if the key for\n * the broadcast's title exists in localStorage.\n *\n * @function initializeBroadcast\n */\nfunction initializeBroadcast() {\n const shouldHideBroadcast = window.location.pathname.match(\n /^(?:\\/connect|\\/new)/,\n );\n\n // Iframes will attempt to re-render a broadcast, so we want to explicitly\n // avoid initializing one if we are within `window.frameElement`.\n if (window.frameElement || shouldHideBroadcast) {\n const broadcast = document.getElementById('active-broadcast');\n\n // Hide the broadcast if it exists and we are on a path where it should be hidden.\n if (broadcast) {\n broadcast.classList.remove('broadcast-visible');\n }\n return;\n }\n\n const user = userData();\n const data = broadcastData();\n\n if (user \u0026\u0026 !user.display_announcements) {\n return;\n }\n if (!data) {\n return;\n }\n\n const { title } = data;\n if (JSON.parse(localStorage.getItem(camelizedBroadcastKey(title))) === true) {\n return; // Do not render broadcast if previously dismissed by user.\n }\n\n const el = document.getElementById('active-broadcast');\n if (el.firstElementChild) {\n if (!el.classList.contains('broadcast-visible')) {\n // The articleForm may have hidden the broadcast when\n // it loaded, so we need to explicitly display it again.\n el.classList.toggle('broadcast-visible');\n }\n\n return; // Only append HTML once, on first render.\n }\n\n renderBroadcast(el, data);\n}\n/* eslint-enable camelcase */;\n/* Show comment date/time according to user's locale */\n/* global addLocalizedDateTimeToElementsTitles */\n\n'use strict';\n\nfunction initializeCommentDate() {\n var commentsDates = document.querySelectorAll('.comment-date time');\n\n addLocalizedDateTimeToElementsTitles(commentsDates, 'datetime');\n};\nvar iconSmallThread = `\u003csvg width=\"24\" height=\"24\" class=\"crayons-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z\" /\u003e\u003c/svg\u003e`;\n\n/**\n *\n * A function that triggers all the interactivity when a page with comments are loaded.\n * It calls sub-functions to define functionality for fetching async info, and attaching\n * event listeners related to rich UI interaction and form submission.\n *\n * When comment reaction data needs to be fetched and how we make those choices:\n * When no logged in user only need to fetch reaction numbers if there has been recent comment activity.\n * If no recent comments, we do not need the precision of fetching latest counts async. Static value is almost certainly good enough.\n * Always fetch when user is logged in because we need state of whether the user has reacted.\n *\n * @function initializeCommentsPage\n */\n\nfunction initializeCommentsPage() {\n if (document.getElementById('comments-container')) {\n toggleCodeOfConduct();\n var userStatus = document.body.getAttribute('data-user-status');\n var commentableId = document.getElementById('comments-container').dataset.commentableId;\n var commentableType = document.getElementById('comments-container').dataset.commentableType;\n var hasRecentCommentActivity = document.getElementById('comments-container').dataset.hasRecentCommentActivity;\n commentableIdList = commentableId.split(\",\");\n\n if (userStatus === 'logged-in' || hasRecentCommentActivity !== 'false') {\n var f = (function() {\n for (var i = 0; i \u003c commentableIdList.length; i++) {\n (function(i){\n var ajaxReq;\n ajaxReq = new XMLHttpRequest();\n ajaxReq.onreadystatechange = function () {\n if (ajaxReq.readyState === XMLHttpRequest.DONE) {\n var responseObj = JSON.parse(ajaxReq.response);\n var reactions = responseObj.reactions;\n var allNodes = document.getElementsByClassName('single-comment-node');\n var publicReactionCounts = responseObj.public_reaction_counts;\n for (var i = 0; i \u003c reactions.length; i++) {\n var buttForComment = document.getElementById('button-for-comment-' + reactions[i].reactable_id);\n if (buttForComment) {\n buttForComment.classList.add('reacted');\n buttForComment.setAttribute('aria-pressed', 'true')\n }\n }\n for (var i = 0; i \u003c publicReactionCounts.length; i++) {\n var buttForComment = document.getElementById('button-for-comment-' + publicReactionCounts[i].id);\n if (buttForComment) {\n var reactionsCountWrapper = buttForComment.querySelector('.reactions-count');\n var reactionsLabelWrapper = buttForComment.querySelector('.reactions-label');\n if (publicReactionCounts[i].count \u003e 0 \u0026\u0026 reactionsLabelWrapper) {\n\n if (publicReactionCounts[i].count \u003e 1) {\n reactionsLabelWrapper.innerHTML = `\u0026nbsp;${I18n.t('core.like').toLowerCase()}s`;\n } else {\n reactionsLabelWrapper.innerHTML = `\u0026nbsp;${I18n.t('core.like').toLowerCase()}`;\n }\n\n reactionsCountWrapper.id = 'reactions-count-' + publicReactionCounts[i].id;\n reactionsCountWrapper.innerHTML = publicReactionCounts[i].count;\n reactionsCountWrapper.classList.remove(\"hidden\");\n } else {\n reactionsCountWrapper.classList.add(\"hidden\");\n reactionsCountWrapper.innerHTML = '0';\n }\n\n if (!buttForComment.classList.contains(\"reacted\")) {\n buttForComment.setAttribute('aria-pressed', 'false')\n }\n }\n }\n\n for (var i = 0; i \u003c allNodes.length; i++) {\n if (allNodes[i].dataset.commentAuthorId == responseObj.current_user.id) {\n allNodes[i].dataset.currentUserComment = \"true\";\n var path = allNodes[i].dataset.path;\n var userActionsEl = allNodes[i].querySelector('.current-user-actions');\n var buttEl = document.getElementById('button-for-comment-' + allNodes[i].dataset.commentId);\n if (userActionsEl \u0026\u0026 buttEl) {\n userActionsEl.innerHTML = `\u003cli\u003e\u003ca href=\"${ path }/edit\" class=\"crayons-link crayons-link--block\" aria-label=\"Edit this comment\"\u003eEdit\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca data-no-instant href=\"${ path }/delete_confirm\" class=\"edit-butt crayons-link crayons-link--block\" aria-label=\"Delete this comment\"\u003eDelete\u003c/a\u003e\u003c/li\u003e`\n userActionsEl.classList.remove('hidden');\n }\n }\n }\n }\n };\n\n ajaxReq.open(\"GET\", \"/reactions?commentable_id=\" + commentableIdList[i] + \"\u0026commentable_type=\" + commentableType, true);\n ajaxReq.send();\n })(i);\n }\n })();\n }\n\n var butts = document.getElementsByClassName('reaction-button');\n for (var i = 0; i \u003c butts.length; i++) {\n var butt = butts[i];\n butt.onclick = function (event) {\n var thisButt = this;\n event.preventDefault();\n sendHapticMessage('medium');\n var userStatus = document.body.getAttribute('data-user-status');\n if (userStatus === 'logged-out') {\n showLoginModal({ referring_source: 'comment', trigger: 'like' });\n return;\n }\n\n thisButt.classList.add('reacted');\n thisButt.disabled = true;\n\n function successCb(response) {\n var reactionCount = thisButt.querySelector('.reactions-count');\n var reactionLabel = thisButt.querySelector('.reactions-label');\n if (response.result === 'create') {\n thisButt.classList.add('reacted');\n thisButt.setAttribute('aria-pressed', 'true');\n if (reactionCount) {\n reactionCount.innerHTML = parseInt(reactionCount.innerHTML) + 1;\n reactionCount.classList.remove(\"hidden\");\n if(parseInt(reactionCount.innerHTML) == 1) {\n reactionLabel.innerHTML = \"\u0026nbsp;like\"\n } else if(parseInt(reactionCount.innerHTML) \u003e 1) {\n reactionLabel.innerHTML = \"\u0026nbsp;likes\"\n }\n }\n } else {\n thisButt.classList.remove('reacted');\n thisButt.setAttribute('aria-pressed', 'false');\n if (reactionCount) {\n reactionCount.innerHTML = parseInt(reactionCount.innerHTML) - 1;\n if(parseInt(reactionCount.innerHTML) == 0) {\n reactionCount.classList.add(\"hidden\");\n thisButt.classList.remove('crayons-btn--icon-left');\n thisButt.classList.add('crayons-btn--icon');\n reactionLabel.innerHTML = \"\"\n }\n }\n }\n }\n var formData = new FormData();\n formData.append('reactable_type', 'Comment');\n formData.append('reactable_id', thisButt.dataset.commentId);\n getCsrfToken()\n .then(sendFetch('reaction-creation', formData))\n .then(function (response) {\n thisButt.disabled = false;\n if (response.status === 200) {\n response.json().then(successCb);\n } else {\n showModalAfterError({\n response,\n element: 'reaction',\n action_ing: 'making',\n action_past: 'made',\n });\n }\n });\n };\n }\n var replyButts = document.getElementsByClassName('toggle-reply-form');\n for (var i = 0; i \u003c replyButts.length; i++) {\n var butt = replyButts[i];\n butt.onclick = function (event) {\n event.preventDefault();\n if (event.target.classList.contains(\"thread-indication\")) {\n return false;\n } else {\n var userStatus = document.body.getAttribute('data-user-status');\n if (userStatus == 'logged-out') {\n showLoginModal({ referring_source: 'comment', trigger: 'reply' });\n return;\n }\n var parentId = event.target.closest('.comment').dataset.commentId;\n var waitingOnCSRF = setInterval(function () {\n var metaTag = document.querySelector(\"meta[name='csrf-token']\");\n if (metaTag) {\n clearInterval(waitingOnCSRF);\n commentWrapper = event.target.closest('.comment__details');\n commentWrapper.classList.add(\"replying\");\n commentWrapper.innerHTML += buildCommentFormHTML(commentableId, commentableType, parentId);\n initializeCommentsPage();\n\n setTimeout(function () {\n commentWrapper.getElementsByTagName('textarea')[0].focus();\n }, 30);\n }\n }, 1);\n };\n return false;\n }\n }\n\n if (document.getElementById('new_comment')) {\n document.getElementById('new_comment').addEventListener('submit', handleCommentSubmit);\n }\n }\n listenForDetailsToggle();\n\n handleHiddenComments(commentableType);\n}\n\nfunction toggleCodeOfConduct() {\n var user = userData();\n if (!user) {\n return;\n }\n var codeOfConduct = user.checked_code_of_conduct\n var checkboxWrapper = document.getElementById('toggle-code-of-conduct-checkbox');\n if (checkboxWrapper \u0026\u0026 !codeOfConduct) {\n checkboxWrapper.innerHTML = '\u003cinput type=\"checkbox\" name=\"checked_code_of_conduct\" class=\"checkbox\" required/\u003e\\\n \u003clabel for=\"checked_code_of_conduct\"\u003eI\\'ve read the \u003ca href=\"/code-of-conduct\"\u003ecode of conduct\u003c/a\u003e\u003c/label\u003e'\n }\n}\n\nfunction handleCommentSubmit(event) {\n event.preventDefault();\n var form = event.target;\n form.classList.add('submitting');\n var textarea = form.getElementsByClassName('comment-textarea')[0];\n if (textarea) {\n textarea.style.height = null;\n textarea.blur();\n }\n var parentComment = document.getElementById(\"comment-node-\" + event.target.dataset.commentId);\n\n // as there can be multiple forms rendered in the comments, we need to use querySelector to find descendants\n var commentParentId = form.querySelector(\"#comment_parent_id\");\n var body = JSON.stringify({\n comment: {\n body_markdown: form.getElementsByTagName(\"textarea\")[0].value,\n commentable_id: form.querySelector(\"#comment_commentable_id\").value,\n commentable_type: form.querySelector(\"#comment_commentable_type\").value,\n parent_id: commentParentId ? commentParentId.value : null,\n }\n });\n\n getCsrfToken()\n .then(sendFetch('comment-creation', body))\n .then(function (response) {\n if (response.status === 200) {\n response.json().then(function (newComment) {\n var newNode = document.createElement('div');\n newNode.innerHTML = buildCommentHTML(newComment);\n var docBody = document.body\n\n var userData = JSON.parse(docBody.getAttribute('data-user'))\n userData.checked_code_of_conduct = true;\n\n docBody.dataset.user = JSON.stringify(userData);\n\n var checkbox = form.getElementsByClassName('code-of-conduct')[0]\n if (checkbox) {\n checkbox.innerHTML = \"\"\n }\n\n var mainCommentsForm = document.getElementById(\"new_comment\");\n if (parentComment) {\n handleFormClose(event);\n if (newComment.depth \u003e 3) {\n var replyTrigger = parentComment.getElementsByClassName(\"toggle-reply-form\")[0];\n var threadIndicator = `\u003cspan class=\"fs-s inline-flex items-center fs-italic color-base-50 pl-1\"\u003e${ iconSmallThread }Thread\u003c/span\u003e`;\n replyTrigger.classList.replace(\"inline-flex\", \"hidden\");\n replyTrigger.parentNode.innerHTML += threadIndicator;\n }\n var actionsNode = parentComment.getElementsByClassName(\"comment__inner\")[0];\n actionsNode.parentNode.insertBefore(newNode, actionsNode.nextSibling);\n }\n\n else if (mainCommentsForm) {\n var mainCommentsForm = document.getElementById(\"new_comment\");\n mainCommentsForm.classList.remove(\"submitting\");\n mainCommentsForm.classList.remove('preview-open');\n\n const commentInputs = [...form.getElementsByClassName(\"comment-textarea\")]\n commentInputs[0].closest('.comment-form').classList.remove('comment-form--initiated');\n\n // Clearing out all comment textboxes and resetting their height because\n // there is an additional one generated by the comment\n // mention auto-complete component\n commentInputs.forEach(input =\u003e {\n input.value = newComment.comment_template || \"\";\n input.style.height = null;\n });\n\n const preview = document.getElementById(\"preview-div\");\n const togglePreview = document.querySelector('.preview-toggle');\n preview.innerHTML = \"\";\n togglePreview.innerHTML = \"Preview\";\n const container = document.getElementById(\"comment-trees-container\");\n container.insertBefore(newNode, container.firstChild);\n }\n else if (document.getElementById(\"notifications-container\")) {\n var newDiv = document.createElement(\"span\")\n newDiv.innerHTML = '\u003cdiv class=\"crayons-notice align-center p-2 m-2 crayons-notice--success reply-sent-notice reply-sent-notice\" aria-live=\"polite\"\u003eReply sent — \u003ca href=\"' + newComment.url + '\"\u003eCheck it out\u003c/a\u003e\u003c/div\u003e'\n form.replaceWith(newDiv);\n }\n else {\n window.location.replace(newComment.url)\n }\n updateCommentsCount();\n initializeCommentsPage();\n initializeCommentDate();\n activateRunkitTags();\n })\n } else {\n form.classList.remove('submitting');\n showModalAfterError({\n response,\n element: 'comment',\n action_ing: 'posting',\n action_past: 'posted',\n });\n return false;\n }\n return false;\n });\n return false;\n}\n\nfunction handleFocus(event) {\n handleButtonsActivation(event);\n var userStatus = document.body.getAttribute('data-user-status');\n var area = event.target;\n if (userStatus == 'logged-out') {\n event.preventDefault();\n showLoginModal({ referring_source: 'comments', trigger: 'new_comment'});\n area.blur();\n } else {\n var form = event.target.closest(\".comment-form\");\n if (form) {\n form.classList.add(\"comment-form--initiated\");\n }\n handleSizeChange(event);\n window.Forem.initializeEnhancedCommentTextArea(area);\n }\n}\n\nfunction handleKeyUp(event) {\n handleSizeChange(event);\n handleButtonsActivation(event);\n}\n\n// Handler for when Ctrl+Enter OR Command+Enter is pressed\nfunction handleSubmit(event) {\n // Get user details and extract code of conduct \u0026 comment count\n var user = userData();\n if (!user) {\n return;\n }\n\n var codeOfConduct = user.checked_code_of_conduct;\n if (codeOfConduct \u0026\u0026 event.target.value.trim() !== '') {\n event.target.closest('form').querySelector('button[type=\"submit\"]').click();\n }\n}\n\nvar ENTER_KEY_CODE = 13;\nfunction handleKeyDown(event) {\n if (window.Forem.Runtime.hasOSSpecificModifier(event) \u0026\u0026 event.keyCode === ENTER_KEY_CODE) {\n event.preventDefault();\n handleSubmit(event);\n }\n}\n\nfunction handleFormClose(event) {\n event.target.closest('.inner-comment').classList.remove(\"replying\");\n event.target.closest('.comment-form').remove();\n initializeCommentsPage();\n}\n\nfunction handleSizeChange(event) {\n var textarea = event.target;\n var oldHeight = parseInt(textarea.style.height.replace('px',''));\n textarea.style.height = textarea.scrollHeight + (textarea.scrollHeight \u003e oldHeight ? 15 : 0) + \"px\";\n}\n\nfunction handleButtonsActivation(event) {\n var textarea = event.target;\n var commentForm = textarea.closest('.comment-form');\n if (commentForm) {\n var buttons = textarea.closest('.comment-form').getElementsByClassName('js-btn-enable');\n Array.from(buttons).forEach(function(button) {\n button.disabled = textarea.value.length === 0;\n });\n };\n}\n\nfunction validateField(event) {\n // We only need to validate the textarea that is not the comment mention auto-complete component\n const textArea = event.target.form.querySelector('.comment-textarea:not([role=combobox])');\n\n if (textArea.value === '') {\n event.preventDefault();\n return;\n }\n}\n\nfunction handleChange(event) {\n handleButtonsActivation(event);\n}\n\nfunction generateUploadFormdata(image) {\n var token = document.querySelector(\"meta[name='csrf-token']\").content;\n var formData = new FormData();\n formData.append('authenticity_token', token);\n formData.append('image', image[0]);\n return formData;\n}\n\nfunction updateItemSummaryHtml(item) {\n var itemSummaryContent = item.getElementsByClassName(\"js-collapse-comment-content\")[0];\n var usernames = item.getElementsByClassName(\"js-comment-username\");\n var number = \"\";\n if (usernames.length \u003e 1) {\n number = \" + \" + (usernames.length - 1) + \" replies\"\n }\n var itemUsername = usernames[0].textContent + number\n if (item.open) {\n itemSummaryContent.textContent = \"\";\n } else {\n itemSummaryContent.textContent = itemUsername;\n }\n}\n\nfunction listenForDetailsToggle() {\n var detailItems = document.querySelectorAll(\".js-comment-wrapper\");\n for (var i = 0; i \u003c detailItems.length; i++) {\n detailItems[i].addEventListener(\"toggle\", event =\u003e {\n var item = event.target;\n updateItemSummaryHtml(item);\n });\n }\n}\n\n/**\n * Increment comment, stored in `.js-comments-count`, count by one.\n */\nfunction updateCommentsCount() {\n const commentsCountDiv = document.querySelector(\".js-comments-count\");\n\n // if there's nowhere to put the count return early.\n if(!commentsCountDiv) return;\n\n const commentsCountData = parseInt(commentsCountDiv.dataset.commentsCount, 10) + 1;\n commentsCountDiv.dataset.commentsCount = commentsCountData;\n commentsCountDiv.innerHTML = `(${commentsCountData})`\n\n const commentsSidebarCountDiv = document.getElementById(\"reaction-number-comment\");\n if (!commentsSidebarCountDiv) return;\n commentsSidebarCountDiv.innerHTML = `${commentsCountData}`;\n}\n\nfunction initializeCommentDate() {\n const commentsDates = document.querySelectorAll('.comment-date time');\n\n if (commentsDates) {\n addLocalizedDateTimeToElementsTitles(commentsDates, 'datetime');\n }\n}\n\nfunction handleHiddenComments(commentableType){\n const currentUser = userData();\n const commentableAuthorIds = [];\n let coAuthorIds = '';\n if(commentableType === \"Article\"){\n const articleContainer = document.querySelector('#article-show-container');\n if(articleContainer){\n if (articleContainer.dataset) {\n commentableAuthorIds.push(articleContainer.dataset.authorId);\n coAuthorIds = articleContainer.dataset.coAuthorIds;\n if(coAuthorIds){\n coAuthorIds.split(',').forEach(coAuthorId =\u003e {\n commentableAuthorIds.push(coAuthorId);\n });\n }\n }\n }\n else {\n const commentsContainer = document.querySelector('#comments-container');\n if(commentsContainer){\n if(commentsContainer.dataset) {\n commentableAuthorIds.push(commentsContainer.dataset.commentableAuthorId);\n coAuthorIds = commentsContainer.dataset.commentableCoAuthorIds;\n if(coAuthorIds){\n coAuthorIds.split(',').forEach(coAuthorId =\u003e {\n commentableAuthorIds.push(coAuthorId);\n });\n }\n }\n }\n }\n } else if(commentableType === \"PodcastEpisode\"){\n const podCastEpisodeContainer = document.querySelector('.podcast-episode-container');\n if(podCastEpisodeContainer){\n commentableAuthorIds.push(podCastEpisodeContainer.dataset.creatorId);\n }\n }\n if(currentUser \u0026\u0026 commentableAuthorIds.includes(currentUser.id.toString())){\n collapseCommentsHiddenByCommentableUser();\n }\n else {\n document.querySelectorAll('.element-hidden-by-commentable-user').forEach(element =\u003e {\n element.classList.add('hidden');\n })\n document.querySelectorAll('.comment-hidden-by-author-text').forEach(element =\u003e {\n element.classList.remove('hidden');\n })\n }\n}\n\nfunction collapseCommentsHiddenByCommentableUser() {\n document.querySelectorAll(\".js-comment-wrapper.details-comment-hidden-by-commentable-user\").forEach(item =\u003e {\n if (item.querySelectorAll('.comment-form').length === 0){\n item.open = false;\n updateItemSummaryHtml(item);\n }\n })\n};\n/* global localizeTimeElements */\n\n'use strict';\n\nfunction initializeCreditsPage() {\n const datetimes = document.querySelectorAll('.ledger time');\n\n localizeTimeElements(datetimes, {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n};\nfunction initializeLocalStorageRender() {\n try {\n var userData = browserStoreCache('get');\n if (userData) {\n document.body.dataset.user = userData;\n initializeBaseUserData();\n initializeReadingListIcons();\n initializeBillboardVisibility();\n }\n } catch (err) {\n browserStoreCache('remove');\n }\n};\n/**\n * This script looks for the onboarding task card, which is hidden by default,\n * and displays it if the user is created less than a week ago and hasn't closed\n * the task card yet.\n */\n\nfunction initializeOnboardingTaskCard() {\n if (localStorage.getItem('task-card-closed') === 'yes') {\n return;\n }\n\n var taskCard = document.getElementsByClassName('onboarding-task-card')[0];\n const user = userData();\n if (taskCard == null || !user) {\n return; // Guard against a null/undefined taskCard, and no user data.\n }\n\n var createdAt = new Date(user.created_at);\n var now = new Date();\n var aWeekAgo = now.setDate(now.getDate() - 7);\n\n if (createdAt \u003e aWeekAgo) {\n taskCard.style.display = 'block';\n }\n};\nfunction initializePaymentPointers() {\n var userPointer = document.getElementById('author-payment-pointer');\n var basePointer = document.getElementById('base-payment-pointer');\n var meta = document.querySelector(\"meta[name='monetization']\");\n\n if (userPointer \u0026\u0026 meta) {\n meta.content = userPointer.dataset.paymentPointer;\n } else if (basePointer) {\n meta.content = basePointer.dataset.paymentPointer;\n }\n};\n/* eslint-disable no-use-before-define */\n/* eslint-disable no-undef */\n/* eslint-disable func-names */\n/* eslint-disable consistent-return */\n/* eslint-disable no-unused-vars */\n\nfunction initializeReadingListIcons() {\n setReadingListButtonsState();\n addReadingListCountToHomePage();\n}\n\n// set SAVE or SAVED articles buttons\nfunction setReadingListButtonsState() {\n var readingListButtons = document.querySelectorAll(\n '.bookmark-button:not([data-initial-feed])',\n );\n Array.from(readingListButtons).forEach(highlightButton);\n}\n\n// private\n\nfunction highlightButton(button) {\n var user = userData();\n var buttonIdInt = parseInt(button.dataset.reactableId, 10);\n if (user \u0026\u0026 user.reading_list_ids.indexOf(buttonIdInt) \u003e -1) {\n button.classList.add('selected');\n } else {\n button.classList.remove('selected');\n }\n button.addEventListener('click', reactToReadingListButtonClick);\n button.dataset.saveInitialized = true;\n}\n\nfunction addReadingListCountToHomePage() {\n const user = userData();\n const readingListContainers = document.querySelectorAll(\n '.js-reading-list-count',\n );\n if (user \u0026\u0026 readingListContainers) {\n readingListContainers.forEach(function (e) {\n const readingListCount =\n user.reading_list_ids.length \u003e 0 ? user.reading_list_ids.length : '';\n e.innerHTML = readingListCount;\n e.dataset.count = user.reading_list_ids.length;\n });\n }\n}\n\nfunction reactToReadingListButtonClick(event) {\n var button;\n var userStatus;\n event.preventDefault();\n sendHapticMessage('medium');\n userStatus = document.body.getAttribute('data-user-status');\n if (userStatus === 'logged-out') {\n showLoginModal({\n referring_source: 'post_index_toolbar',\n trigger: 'reading_list',\n });\n return;\n }\n button = properButtonFromEvent(event);\n renderOptimisticResult(button);\n getCsrfToken()\n .then(sendFetch('reaction-creation', buttonFormData(button)))\n .then(function (response) {\n if (response.status === 200) {\n return response.json().then(function (json) {\n renderButtonState(button, json);\n renderNewSidebarCount(button, json);\n });\n } // else {\n // there's currently no errorCb.\n // }\n })\n .catch(function (error) {\n // there's currently no error handling.\n });\n}\n\nfunction renderButtonState(button, json) {\n if (json.result === 'create') {\n button.classList.add('selected');\n } else {\n button.classList.remove('selected');\n }\n}\n\nfunction renderNewSidebarCount(button, json) {\n const readingListContainers = document.querySelectorAll(\n '.js-reading-list-count',\n );\n if (readingListContainers) {\n readingListContainers.forEach(function (e) {\n const count = parseInt(e.dataset.count, 10);\n let newCount;\n if (json.result === 'create') {\n newCount = count + 1;\n } else if (count !== 0) {\n newCount = count - 1;\n }\n e.dataset.count = newCount;\n e.innerHTML = newCount \u003e 0 ? newCount : '';\n });\n }\n}\n\nfunction buttonFormData(button) {\n var formData = new FormData();\n formData.append('reactable_type', 'Article');\n formData.append('reactable_id', button.dataset.reactableId);\n formData.append('category', 'readinglist');\n return formData;\n}\n\nfunction renderOptimisticResult(button) {\n renderButtonState(button, { result: 'create' }); // optimistic create only for now\n}\n\nfunction properButtonFromEvent(event) {\n var properElement;\n if (event.target.tagName === 'BUTTON') {\n properElement = event.target;\n } else {\n properElement = event.target.parentElement;\n }\n return properElement;\n}\n\n/*\n Determines if the element is the target of the reading list button hover.\n*/\nfunction isReadingListButtonHoverTarget(element) {\n var classList = element.classList;\n\n return (\n (element.tagName === 'BUTTON' \u0026\u0026\n classList.contains('bookmark-button') \u0026\u0026\n classList.contains('selected')) ||\n (element.tagName === 'SPAN' \u0026\u0026 classList.contains('bm-success'))\n );\n}\n\nfunction readingListButtonMouseHandler(event) {\n var target = event.target;\n\n if (isReadingListButtonHoverTarget(target)) {\n event.preventDefault();\n\n var textReplacement = this; // `this` is the text to be replaced\n var textSpan;\n if (target.tagName === 'BUTTON') {\n textSpan = target.getElementsByClassName('bm-success')[0];\n } else {\n textSpan = target;\n }\n\n textSpan.innerHTML = textReplacement;\n }\n}\n\n/* eslint-enable no-use-before-define */\n/* eslint-enable no-undef */\n/* eslint-enable func-names */\n/* eslint-enable consistent-return */\n/* eslint-enable no-unused-vars */;\n'use strict';\n\nfunction browserStoreCache(action, userData) {\n try {\n switch (action) {\n case 'set':\n localStorage.setItem('current_user', userData);\n localStorage.setItem(\n 'config_body_class',\n JSON.parse(userData).config_body_class,\n );\n break;\n case 'remove':\n localStorage.removeItem('current_user');\n break;\n default:\n return localStorage.getItem('current_user');\n }\n } catch (err) {\n if (navigator.cookieEnabled) {\n browserStoreCache('remove');\n }\n }\n return undefined;\n};\n/* global timeAgo, filterXSS */\n\n/* eslint-disable no-multi-str */\n\nfunction buildArticleHTML(article, currentUserId = null) {\n var tagIcon = `\u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" class=\"crayons-icon\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M7.784 14l.42-4H4V8h4.415l.525-5h2.011l-.525 5h3.989l.525-5h2.011l-.525 5H20v2h-3.784l-.42 4H20v2h-4.415l-.525 5h-2.011l.525-5H9.585l-.525 5H7.049l.525-5H4v-2h3.784zm2.011 0h3.99l.42-4h-3.99l-.42 4z\"/\u003e\u003c/svg\u003e`;\n if (article \u0026\u0026 article.class_name === 'Tag') {\n return `\u003carticle class=\"crayons-story\"\u003e\n \u003cdiv class=\"crayons-story__body flex items-start gap-2\"\u003e\n \u003cspan class=\"radius-default p-2 shrink-0\" style=\"background: ${\n article.bg_color_hex || '#000000'\n }1a; color: ${article.bg_color_hex || '#000'}\"\u003e\n ${tagIcon}\n \u003c/span\u003e\n \u003cdiv\u003e\n \u003ch3 class=\"crayons-subtitle-2 lh-tight py-2\"\u003e\n \u003ca href=\"/t/${article.name}\" class=\"c-link\"\u003e\n ${article.name}\n \u003c/a\u003e\n \u003c/h3\u003e\n ${\n article.short_summary\n ? `\u003cdiv class=\"truncate-at-3\"\u003e${article.short_summary}\u003c/div\u003e`\n : ''\n }\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/article\u003e`;\n }\n\n if (article \u0026\u0026 article.class_name === 'PodcastEpisode') {\n return `\u003carticle class=\"crayons-story crayons-podcast-episode mb-2\"\u003e\n \u003cdiv class=\"crayons-story__body flex flex-start\"\u003e\n \u003ca href=\"${article.podcast.slug}\" class=\"crayons-podcast-episode__cover\"\u003e\n \u003cimg src=\"${article.podcast.image_url}\" alt=\"${article.podcast.title}\" loading=\"lazy\" /\u003e\n \u003c/a\u003e\n \u003cdiv class=\"pt-2 flex-1\"\u003e\n \u003cp class=\"crayons-podcast-episode__author\"\u003e\n ${article.podcast.title}\n \u003c/p\u003e\n \u003ch2 class=\"crayons-podcast-episode__title crayons-story__title mb-0\"\u003e\n \u003ca href=\"${article.path}\" id=\"article-link-${article.id}\"\u003e\n ${article.podcast.title}\n \u003c/a\u003e\n \u003c/h2\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/article\u003e`;\n }\n\n if (article \u0026\u0026 article.class_name === 'Organization') {\n const html = `\n \u003carticle class=\"crayons-story\"\u003e\n \u003cdiv class=\"crayons-story__body flex items-start gap-2\"\u003e\n \u003ca href=\"${article.slug}\" class=\"crayons-podcast-episode__cover\"\u003e\n \u003cimg src=\"${article.profile_image.url}\" alt=\"\" loading=\"lazy\" /\u003e\n \u003c/a\u003e\n \u003cdiv\u003e\n \u003ch3 class=\"crayons-subtitle-2 lh-tight py-1\"\u003e\n \u003ca href=\"${article.slug}\" class=\"c-link\"\u003e ${article.name} \u003c/a\u003e\n \u003c/h3\u003e\n \u003cp class=\"crayons-story__slug-segment\"\u003e@${article.slug}\u003c/p\u003e\n ${\n article.summary\n ? `\u003cdiv class=\"truncate-at-3 top-margin-4\"\u003e${article.summary}\u003c/div\u003e`\n : ''\n }\n \u003c/div\u003e\n \u003cdiv class=\"print-hidden\" style=\"margin-left: auto\"\u003e\n \u003cbutton class=\"crayons-btn follow-action-button whitespace-nowrap follow-user w-100\" data-info=''\u003eFollow\u003c/button\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/article\u003e\n `;\n\n const parser = new DOMParser();\n const parsedDocument = parser.parseFromString(html, 'text/html');\n parsedDocument.querySelector('img').alt = article.name;\n parsedDocument.querySelector('button').dataset.info = JSON.stringify({\n id: article.id,\n name: article.name,\n className: 'Organization',\n style: 'full',\n });\n\n return parsedDocument.body.innerHTML;\n }\n\n if (article) {\n var container = document.getElementById('index-container');\n\n var flareTag = '';\n var currentTag = '';\n if (container) {\n currentTag = JSON.parse(container.dataset.params).tag;\n }\n if (article.flare_tag \u0026\u0026 currentTag !== article.flare_tag.name) {\n flareTag = `\u003ca href=\"/t/${article.flare_tag.name}\"\n class=\"crayons-tag crayons-tag--filled\"\n style=\"--tag-bg: ${article.flare_tag.bg_color_hex}1a; --tag-prefix: ${article.flare_tag.bg_color_hex}; --tag-bg-hover: ${article.flare_tag.bg_color_hex}1a; --tag-prefix-hover: ${article.flare_tag.bg_color_hex};\"\n \u003e\n \u003cspan class=\"crayons-tag__prefix\"\u003e#\u003c/span\u003e\n ${article.flare_tag.name}\n \u003c/a\u003e`;\n }\n\n var tagString = '';\n var tagList = article.tag_list || article.cached_tag_list_array || [];\n if (flareTag) {\n tagList = tagList.filter(function (tag) {\n return tag !== article.flare_tag.name;\n });\n tagString += flareTag;\n }\n if (tagList) {\n tagList.forEach(function buildTagString(t) {\n tagString =\n tagString +\n `\u003ca href=\"/t/${t}\" class=\"crayons-tag crayons-tag--monochrome\"\u003e\u003cspan class=\"crayons-tag__prefix\"\u003e#\u003c/span\u003e${t}\u003c/a\u003e\\n`;\n });\n }\n\n var commentsDisplay = '';\n var commentsCount = '0';\n if ((article.comments_count || '0') \u003e 0) {\n commentsCount = article.comments_count || '0';\n }\n\n var commentsAriaLabelText = `aria-label=\"Add a comment to post - ${article.title}\"`;\n\n if (article.class_name !== 'User') {\n commentsDisplay =\n '\u003ca href=\"' +\n article.path +\n '#comments\"' +\n commentsAriaLabelText +\n 'class=\"crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left \"\u003e\u003csvg class=\"crayons-icon\" width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z\"/\u003e\u003c/svg\u003e';\n if (commentsCount \u003e 0) {\n commentsDisplay +=\n commentsCount +\n '\u003cspan class=\"hidden s:inline\"\u003e\u0026nbsp;comments\u003c/span\u003e\u003c/a\u003e';\n } else {\n commentsDisplay +=\n '\u003cspan class=\"hidden s:inline\"\u003eAdd\u0026nbsp;Comment\u003c/span\u003e\u003c/a\u003e';\n }\n }\n\n var reactionsCount = article.public_reactions_count;\n var reactionsDisplay = '';\n var reactionsText = reactionsCount === 1 ? 'reaction' : 'reactions';\n var reactionIcons = document.getElementById('reaction-category-resources');\n\n if (article.class_name !== 'User' \u0026\u0026 reactionsCount \u003e 0) {\n var icons = [];\n for (var category of article.public_reaction_categories) {\n var icon = reactionIcons.querySelector(\n `img[data-slug=${category.slug}]`,\n ).outerHTML;\n icons = icons.concat(\n `\u003cspan class=\"crayons_icon_container\"\u003e${icon}\u003c/span\u003e`,\n );\n }\n icons.reverse();\n\n reactionsDisplay = `\u003ca href=\"${\n article.path\n }\" class=\"crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left\" data-reaction-count data-reactable-id=\"${\n article.id\n }\"\u003e\n \u003cdiv class=\"multiple_reactions_aggregate\"\u003e\n \u003cspan class=\"multiple_reactions_icons_container\" dir=\"rtl\"\u003e\n ${icons.join('')}\n \u003c/span\u003e\n \u003cspan class=\"aggregate_reactions_counter\"\u003e\n \u003cspan class=\"hidden s:inline\"\u003e${reactionsCount}\u0026nbsp;${reactionsText}\u003c/span\u003e\n \u003c/span\u003e\n \u003c/span\u003e\n \u003c/div\u003e\n \u003c/a\u003e`;\n }\n\n var picUrl;\n var profileUsername;\n var userName;\n if (article.class_name === 'PodcastEpisode') {\n picUrl = article.main_image;\n profileUsername = article.slug;\n userName = article.title;\n } else {\n picUrl = article.user.profile_image_90;\n profileUsername = article.user.username;\n userName = filterXSS(article.user.name);\n }\n var orgHeadline = '';\n var forOrganization = '';\n var organizationLogo = '';\n var organizationClasses = 'crayons-avatar--l';\n\n if (\n article.organization \u0026\u0026\n !document.getElementById('organization-article-index')\n ) {\n organizationLogo =\n '\u003ca href=\"/' +\n article.organization.slug +\n '\" class=\"crayons-logo crayons-logo--l\"\u003e\u003cimg alt=\"' +\n article.organization.name +\n ' logo\" src=\"' +\n article.organization.profile_image_90 +\n '\" class=\"crayons-logo__image\" loading=\"lazy\"/\u003e\u003c/a\u003e';\n forOrganization =\n '\u003cspan\u003e\u003cspan class=\"crayons-story__tertiary fw-normal\"\u003e for \u003c/span\u003e\u003ca href=\"/' +\n article.organization.slug +\n '\" class=\"crayons-story__secondary fw-medium\"\u003e' +\n article.organization.name +\n '\u003c/a\u003e\u003c/span\u003e';\n organizationClasses =\n 'crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted';\n }\n\n var timeAgoInWords = '';\n if (article.published_at_int) {\n timeAgoInWords = timeAgo({ oldTimeInSeconds: article.published_at_int });\n }\n\n var publishDate = '';\n if (article.readable_publish_date) {\n if (article.published_timestamp) {\n publishDate =\n '\u003ctime datetime=\"' +\n article.published_timestamp +\n '\"\u003e' +\n article.readable_publish_date +\n ' ' +\n timeAgoInWords +\n '\u003c/time\u003e';\n } else {\n publishDate =\n '\u003ctime\u003e' +\n article.readable_publish_date +\n ' ' +\n timeAgoInWords +\n '\u003c/time\u003e';\n }\n }\n\n // We only show profile preview cards for Posts\n var isArticle = article.class_name === 'Article';\n\n // We need to be able to set the data-info hash attribute with escaped characters.\n // NB: Escaping apostrophes with a \"/\" does not have the desired effect, as we eventually render the name inside a double quoted string \"\"\n // To avoid complications with single quotes inside double quotes inside single quotes, we instead replace any apostrophe with its encoded value\n var name = userName.replace(/'/g, '\u0026apos;').replace(/[\\\\\"]/g, '\\\\$\u0026');\n\n var previewCardContent = `\n \u003cdiv id=\"story-author-preview-content-${article.id}\" class=\"profile-preview-card__content crayons-dropdown p-4 pt-0 branded-7\" data-repositioning-dropdown=\"true\" style=\"border-top-color: var(--card-color);\" data-testid=\"profile-preview-card\"\u003e\n \u003cdiv class=\"gap-4 grid\"\u003e\n \u003cdiv class=\"-mt-4\"\u003e\n \u003ca href=\"/${profileUsername}\" class=\"flex\"\u003e\n \u003cspan class=\"crayons-avatar crayons-avatar--xl mr-2 shrink-0\"\u003e\n \u003cimg src=\"${picUrl}\" class=\"crayons-avatar__image\" alt=\"\" loading=\"lazy\" /\u003e\n \u003c/span\u003e\n \u003cspan class=\"crayons-link crayons-subtitle-2 mt-5\"\u003e${userName}\u003c/span\u003e\n \u003c/a\u003e\n \u003c/div\u003e\n \u003cdiv class=\"print-hidden\"\u003e\n \u003cbutton class=\"crayons-btn follow-action-button whitespace-nowrap follow-user w-100\" data-info='{\"id\": ${article.user_id}, \"className\": \"User\", \"style\": \"full\", \"name\": \"${name}\"}'\u003eFollow\u003c/button\u003e\n \u003c/div\u003e\n \u003cdiv class=\"author-preview-metadata-container\" data-author-id=\"${article.user_id}\"\u003e\u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n `;\n\n var meta = `\n \u003cdiv class=\"crayons-story__meta\"\u003e\n \u003cdiv class=\"crayons-story__author-pic\"\u003e\n ${organizationLogo}\n \u003ca href=\"/${profileUsername}\" class=\"crayons-avatar ${organizationClasses}\"\u003e\n \u003cimg src=\"${picUrl}\" alt=\"${profileUsername} profile\" class=\"crayons-avatar__image\" loading=\"lazy\" /\u003e\n \u003c/a\u003e\n \u003c/div\u003e\n \u003cdiv\u003e\n \u003cdiv\u003e\n \u003ca href=\"/${profileUsername}\" class=\"crayons-story__secondary fw-medium ${\n isArticle ? 'm:hidden' : ''\n }\"\u003e${userName}\u003c/a\u003e\n ${\n isArticle\n ? `\u003cdiv class=\"profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block\"\u003e\u003cbutton id=\"story-author-preview-trigger-${article.id}\" aria-controls=\"story-author-preview-content-${article.id}\" class=\"profile-preview-card__trigger fs-s crayons-btn crayons-btn--ghost p-1 -ml-1 -my-2\" aria-label=\"${userName} profile details\"\u003e${userName}\u003c/button\u003e${previewCardContent}\u003c/div\u003e`\n : ''\n }\n ${forOrganization}\n \u003c/div\u003e\n \u003ca href=\"${\n article.path\n }\" class=\"crayons-story__tertiary fs-xs\"\u003e${publishDate}\u003c/a\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n `;\n\n var bodyTextSnippet = '';\n var searchSnippetHTML = '';\n if (article.highlight \u0026\u0026 article.highlight.body_text.length \u003e 0) {\n var firstSnippetChar = article.highlight.body_text[0];\n var startingEllipsis = '';\n if (firstSnippetChar.toLowerCase() !== firstSnippetChar.toUpperCase()) {\n startingEllipsis = '…';\n }\n bodyTextSnippet =\n startingEllipsis + article.highlight.body_text.join('...') + '…';\n if (bodyTextSnippet.length \u003e 0) {\n searchSnippetHTML =\n '\u003cdiv class=\"crayons-story__snippet mb-1\"\u003e' +\n bodyTextSnippet +\n '\u003c/div\u003e';\n }\n }\n\n var readingTimeHTML = '';\n if (article.class_name === 'Article') {\n // we have ` ... || null` for the case article.reading_time is undefined\n readingTimeHTML =\n '\u003csmall class=\"crayons-story__tertiary fs-xs mr-2\"\u003e' +\n ((article.reading_time || null) \u003c 1\n ? '1 min'\n : article.reading_time + ' min') +\n ' read\u003c/small\u003e';\n }\n\n var saveButton = '';\n var saveSVG =\n '\u003csvg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" role=\"presentation\"\u003e\u003cpath d=\"M6.75 4.5h10.5a.75.75 0 01.75.75v14.357a.375.375 0 01-.575.318L12 16.523l-5.426 3.401A.375.375 0 016 19.607V5.25a.75.75 0 01.75-.75zM16.5 6h-9v11.574l4.5-2.82 4.5 2.82V6z\" /\u003e\u003c/svg\u003e';\n var saveFilledSVG =\n '\u003csvg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" role=\"presentation\"\u003e\u003cpath d=\"M6.75 4.5h10.5a.75.75 0 01.75.75v14.357a.375.375 0 01-.575.318L12 16.523l-5.426 3.401A.375.375 0 016 19.607V5.25a.75.75 0 01.75-.75z\"/\u003e\u003c/svg\u003e';\n // \"!=\" instead of \"!==\" used to compare user_id and currentUserId because\n // currentUserId is a String while user_id is an Integer\n if (article.class_name === 'Article' \u0026\u0026 article.user_id != currentUserId) {\n saveButton = `\n \u003cbutton\n type=\"button\"\n id=\"article-save-button-${article.id}\"\n class=\"c-btn c-btn--icon-alone bookmark-button\"\n data-reactable-id=\"${article.id}\"\n data-article-author-id=\"${article.user_id}\"\n aria-label=\"Save post ${article.title} to reading list\"\u003e\n \u003cspan class=\"bm-initial crayons-icon c-btn__icon\"\u003e${saveSVG}\u003c/span\u003e\n \u003cspan class=\"bm-success crayons-icon c-btn__icon\"\u003e${saveFilledSVG}\u003c/span\u003e\n \u003c/button\u003e\n `;\n } else if (article.class_name === 'User') {\n saveButton = `\n \u003cbutton type=\"button\"\n class=\"crayons-btn crayons-btn--secondary crayons-btn--icon-left fs-s bookmark-button article-engagement-count engage-button follow-action-button follow-user\"\n data-info='{\"id\": ${article.id},\"className\":\"User\", \"name\": \"${userName}\"}'\n data-follow-action-button\u003e\n \u0026nbsp;\n \u003c/button\u003e`;\n }\n\n var videoHTML = '';\n if (article.cloudinary_video_url) {\n videoHTML =\n '\u003ca href=\"' +\n article.path +\n '\" class=\"crayons-story__video\" style=\"background-image:url(' +\n article.cloudinary_video_url +\n ')\"\u003e\u003cdiv class=\"crayons-story__video__time\"\u003e' +\n (article.video_duration_string || article.video_duration_in_minutes) +\n '\u003c/div\u003e\u003c/a\u003e';\n }\n\n var navigationLink = `\n \u003ca\n href=\"${article.path}\"\n aria-labelledby=\"article-link-${article.id}\"\n class=\"crayons-story__hidden-navigation-link\"\n \u003e\n ${filterXSS(article.title)}\n \u003c/a\u003e\n `;\n\n let feedContentAttribute = '';\n if (article.class_name === 'Article') {\n feedContentAttribute = `data-feed-content-id=\"${article.id}\"`;\n }\n\n return `\u003carticle class=\"crayons-story\"\n data-article-path=\"${article.path}\"\n id=\"article-${article.id}\"\n ${feedContentAttribute}\n data-content-user-id=\"${article.user_id}\"\u003e\\\n ${navigationLink}\\\n \u003cdiv role=\"presentation\"\u003e\\\n ${videoHTML}\\\n \u003cdiv class=\"crayons-story__body\"\u003e\\\n \u003cdiv class=\"crayons-story__top\"\u003e\\\n ${meta}\n \u003c/div\u003e\\\n \u003cdiv class=\"crayons-story__indention\"\u003e\n \u003ch3 class=\"crayons-story__title\"\u003e\n \u003ca href=\"${article.path}\" id=\"article-link-${article.id}\"\u003e\n ${filterXSS(article.title)}\n \u003c/a\u003e\n \u003c/h3\u003e\\\n \u003cdiv class=\"crayons-story__tags\"\u003e\n ${tagString}\n \u003c/div\u003e\\\n ${searchSnippetHTML}\\\n \u003cdiv class=\"crayons-story__bottom\"\u003e\\\n \u003cdiv class=\"crayons-story__details\"\u003e\n ${reactionsDisplay} ${commentsDisplay}\n \u003c/div\u003e\\\n \u003cdiv class=\"crayons-story__save\"\u003e\\\n ${readingTimeHTML}\\\n ${saveButton}\n \u003c/div\u003e\\\n \u003c/div\u003e\\\n \u003c/div\u003e\\\n \u003c/div\u003e\\\n \u003c/div\u003e\\\n \u003c/article\u003e`;\n }\n\n return '';\n}\n\n/* eslint-enable no-multi-str */;\nfunction buildCommentFormHTML(commentableId, commentableType, parentId) {\n var authToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute('content');\n var user = userData();\n var codeOfConductHTML = \"\"\n if (user \u0026\u0026 !user.codeOfConduct \u0026\u0026 user.commentCount \u003c 1){\n codeOfConductHTML = '\u003cdiv class=\"code-of-conduct sub-comment-code-of-conduct\" style=\"display:block\" id=\"toggle-code-of-conduct-checkbox\"\u003e\\\n \u003cinput class=\"checkbox\" type=\"checkbox\" name=\"checked_code_of_conduct\" required /\u003e\\\n \u003clabel for=\"checked_code_of_conduct\"\u003eI\\'ve read the \u003ca href=\"/code-of-conduct\"\u003ecode of conduct\u003c/a\u003e\u003c/label\u003e\\\n \u003c/div\u003e'\n }\n var randomIdNumber = Math.floor(Math.random() * 1991);\n\n return `\u003cform class=\"comment-form pt-4\" onsubmit=\"handleCommentSubmit.bind(this)(event)\" id=\"new-comment-${parentId}\" action=\"/comments\" accept-charset=\"UTF-8\" method=\"post\" data-comment-id=\"${parentId}\"\u003e\n \u003cinput name=\"utf8\" type=\"hidden\" value=\"\u0026#x2713;\" /\u003e\n \u003cinput type=\"hidden\" name=\"authenticity_token\" value=\"${authToken}\"\u003e\n \u003cinput value=\"${commentableId}\" type=\"hidden\" name=\"comment[commentable_id]\" id=\"comment_commentable_id\" /\u003e\n \u003cinput value=\"${commentableType}\" type=\"hidden\" name=\"comment[commentable_type]\" id=\"comment_commentable_type\" /\u003e\n \u003cinput value=\"${parentId}\" type=\"hidden\" name=\"comment[parent_id]\" id=\"comment_parent_id\" /\u003e\n \u003cdiv class=\"comment-form__inner\"\u003e\n \u003cdiv class=\"comment-form__field\"\u003e\n \u003ctextarea id=\"textarea-for-${parentId}\" class=\"crayons-textfield crayons-textfield--ghost comment-textarea\" name=\"comment[body_markdown]\" data-tracking-name=\"comment_form_textfield\" placeholder=\"Reply...\" aria-label=\"Reply to a comment...\" required=\"required\" onkeydown=\"handleKeyDown(event)\" onfocus=\"handleFocus(event)\" oninput=\"handleChange(event)\" onkeyup=\"handleKeyUp(event)\"\u003e\u003c/textarea\u003e\n \u003c/div\u003e\n \u003cdiv class=\"response-templates-container crayons-card crayons-card--secondary p-4 mb-4 fs-base comment-form__templates hidden\"\u003e\n \u003cheader\u003e\n \u003cbutton type=\"button\" class=\"personal-template-button active\" data-target-type=\"personal\" data-form-id=\"new_comment\"\u003ePersonal\u003c/button\u003e\n \u003cbutton type=\"button\" class=\"moderator-template-button hidden\" data-target-type=\"moderator\" data-form-id=\"new_comment\"\u003eTrusted User\u003c/button\u003e\n \u003c/header\u003e\n \u003cdiv class=\"personal-responses-container\"\u003e\u003c/div\u003e\n \u003cdiv class=\"moderator-responses-container hidden\"\u003e\u003c/div\u003e\n \u003ca target=\"_blank\" rel=\"noopener nofollow\" href=\"/settings/response-templates\"\u003eCreate template\u003c/a\u003e\n \u003cp\u003eTemplates let you quickly answer FAQs or store snippets for re-use.\u003c/p\u003e\n \u003c/div\u003e\n \u003cdiv class=\"comment-form__preview text-styles text-styles--secondary\"\u003e\u003c/div\u003e\n \u003cdiv class=\"comment-form__buttons mb-4 whitespace-nowrap\"\u003e\n \u003cbutton type=\"submit\" class=\"crayons-btn comment-action-button mr-2 js-btn-enable\" name=\"submit\" data-tracking-name=\"comment_reply_submit_button\" disabled\u003eSubmit\u003c/button\u003e\n \u003cbutton type=\"button\" class=\"preview-toggle crayons-btn crayons-btn--secondary comment-action-button comment-action-preview mr-2 js-btn-enable\" data-tracking-name=\"comment_reply_preview_button\" onclick=\"handleCommentPreview(event)\" disabled\u003ePreview\u003c/button\u003e\n \u003cbutton type=\"button\" class=\"crayons-btn crayons-btn--ghost\" data-tracking-name=\"comment_reply_dismiss_button\" onclick=\"handleFormClose(event)\"\u003eDismiss\u003c/button\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/form\u003e`;\n};\nfunction buildCommentHTML(comment) {\n var iconSmallOverflowHorizontal = `\u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" class=\"crayons-icon pointer-events-none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z\" /\u003e\u003c/svg\u003e`;\n var iconCollapse = `\u003csvg width=\"24\" height=\"24\" class=\"crayons-icon expanded\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M12 10.6771L8 6.93529L8.99982 6L12 8.80653L15.0002 6L16 6.93529L12 10.6771ZM12 15.1935L8.99982 18L8 17.0647L12 13.3229L16 17.0647L15.0002 17.9993L12 15.1935Z\" /\u003e\u003c/svg\u003e`;\n var iconExpand = `\u003csvg width=\"24\" height=\"24\" class=\"crayons-icon collapsed\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M12 18L8 14.2287L8.99982 13.286L12 16.1147L15.0002 13.286L16 14.2287L12 18ZM12 7.88533L8.99982 10.714L8 9.77133L12 6L16 9.77133L15.0002 10.7133L12 7.88533Z\" /\u003e\u003c/svg\u003e`;\n\n var depthClass = \"\";\n var customClass = \"\";\n\n var detailsStartHTML = \"\";\n var detailsEndHTML = \"\";\n\n var commentHeader = \"\";\n var commentFooter = \"\";\n var commentAvatar = \"\";\n var commentBody = \"\";\n\n if ( comment.depth == 0 ) {\n depthClass += \"root \";\n } else {\n depthClass += \"child \"\n }\n\n if ( comment.depth \u003e 3 ) {\n depthClass += \"comment--too-deep \";\n }\n\n if (comment.newly_created) {\n customClass = \"comment-created-via-fetch\"\n }\n\n if (comment.depth \u003c 3) {\n detailsStartHTML = `\n \u003cdetails class=\"comment-wrapper comment-wrapper--deep-${ comment.depth } js-comment-wrapper\" open\u003e\n \u003csummary aria-label=\"Toggle this comment (and replies)\" data-tracking-name=\"expand_comment_toggle\"\u003e\n \u003cspan class=\"inline-block align-middle ${ comment.depth \u003e 0 ? 'mx-0' : 'm:mx-1'}\"\u003e\n ${ iconCollapse }\n ${ iconExpand }\n \u003c/span\u003e\n \u003cspan class=\"js-collapse-comment-content inline-block align-middle\"\u003e\u003c/span\u003e\n \u003c/summary\u003e\n `;\n detailsEndHTML = `\u003c/details\u003e`;\n }\n\n commentAvatar = `\u003ca href=\"/${ comment.user.username }\" class=\"shrink-0 crayons-avatar ${ comment.depth == 0 ? 'm:crayons-avatar--l mt-4 m:mt-3' : 'mt-4' }\"\u003e\n \u003cimg class=\"crayons-avatar__image\" width=\"32\" height=\"32\" src=\"${ comment.user.profile_pic }\" alt=\"${ comment.user.username } profile\" /\u003e\n \u003c/a\u003e`;\n\n commentHeader = `\u003cdiv class=\"comment__header\" \u003e\n \u003ca href=\"/${ comment.user.username }\" class=\"crayons-link crayons-link--secondary flex items-center fw-medium m:hidden\"\u003e\n \u003cspan class=\"js-comment-username\"\u003e${ comment.user.name }\u003c/span\u003e\n \u003c/a\u003e\n \u003cdiv class=\"profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block\"\u003e\n \u003cbutton id=\"comment-profile-preview-trigger-${comment.id}\" aria-controls=\"comment-profile-preview-content-${comment.id}\" class=\"profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost\" aria-label=\"${comment.user.name} profile details\"\u003e${comment.user.name}\u003c/button\u003e\n \u003cspan data-js-comment-user-id=\"${comment.user.id}\" data-js-dropdown-content-id=\"comment-profile-preview-content-${comment.id}\" class=\"preview-card-placeholder\"\u003e\u003c/span\u003e\n \u003c/div\u003e\n \u003cspan class=\"color-base-30 px-2 m:pl-0\" role=\"presentation\"\u003e\u0026bull;\u003c/span\u003e\n\n \u003ca href=\"${ comment.url }\" class=\"comment-date crayons-link crayons-link--secondary fs-s\"\u003e\n \u003ctime datetime=\"${ comment.published_timestamp }\" class=\"date-no-year\"\u003e\n ${ comment.readable_publish_date }\n \u003c/time\u003e\n \u003c/a\u003e\n\n \u003cdiv class=\"comment__dropdown\" data-tracking-name=\"comment_dropdown\"\u003e\n \u003cbutton id=\"comment-dropdown-trigger-${comment.id}\" aria-controls=\"comment-dropdown-${comment.id}\" aria-expanded=\"false\" class=\"dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon\" aria-label=\"Toggle dropdown menu\" aria-haspopup=\"true\"\u003e\n ${ iconSmallOverflowHorizontal }\n \u003c/button\u003e\n \u003cdiv id=\"comment-dropdown-${comment.id}\" class=\"crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown\"\u003e\n \u003cul class=\"m-0\"\u003e\n \u003cli\u003e\u003ca href=\"${ comment.url }\" class=\"crayons-link crayons-link--block permalink-copybtn\" aria-label=\"Copy link to ${ comment.user.name }'s comment\" data-no-instant\u003e${ I18n.t('core.copy_link') }\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca href=\"${ comment.url }/settings\" class=\"crayons-link crayons-link--block\" aria-label=\"Go to ${ comment.user.name }'s comment settings\"\u003eSettings\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca href=\"/report-abuse?url=${ comment.url }\" class=\"crayons-link crayons-link--block\" aria-label=\"Report ${ comment.user.name }'s comment as abusive or violating our code of conduct and/or terms and conditions\"\u003e${ I18n.t('core.report_abuse') }\u003c/a\u003e\u003c/li\u003e\n \u003cli class=\"${ comment.newly_created ? '' : 'hidden' }\"\u003e\u003ca href=\"${ comment.url }/edit\" class=\"crayons-link crayons-link--block\" rel=\"nofollow\" aria-label=\"Edit this comment\"\u003eEdit\u003c/a\u003e\u003c/li\u003e\n \u003cli class=\"${ comment.newly_created ? '' : 'hidden' }\"\u003e\u003ca data-no-instant=\"\" href=\"${ comment.url }/delete_confirm\" class=\"crayons-link crayons-link--block\" rel=\"nofollow\" aria-label=\"Delete this comment\"\u003eDelete\u003c/a\u003e\u003c/li\u003e\n \u003c/ul\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e`;\n\n commentFooter = `\u003cfooter class=\"comment__footer\"\u003e\n ${ react(comment) }\n ${ reply(comment) }\n \u003c/footer\u003e`;\n\n commentBody = `${ detailsStartHTML }\n \u003cdiv class=\"comment single-comment-node ${ depthClass } comment--deep-${ comment.depth }\" id=\"comment-node-${ comment.id }\" data-comment-id=\"${ comment.id }\" data-path=\"${ comment.url }\" data-comment-author-id=\"${ comment.user.id }\" data-current-user-comment=\"${ comment.newly_created }\" data-content-user-id=\"${ comment.user.id }\"\u003e\n \u003cdiv class=\"comment__inner\"\u003e\n ${ commentAvatar }\n \u003cdiv class=\"inner-comment comment__details\"\u003e\n \u003cdiv class=\"comment__content crayons-card\"\u003e\n ${ commentHeader }\n \u003cdiv class=\"comment__body text-styles text-styles--secondary body\"\u003e\n ${ comment.body_html }\n \u003c/div\u003e\n \u003c/div\u003e\n ${ commentFooter }\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n ${ detailsEndHTML }`;\n\n return commentBody;\n}\n\nfunction reply(comment) {\n var iconSmallComment = `\u003csvg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"crayons-icon reaction-icon not-reacted\"\u003e\u003cpath d=\"M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z\"/\u003e\u003c/svg\u003e`;\n var replyButton = `\u003ca class=\"js actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex\"\n href=\"#${ comment.url }\"\n data-comment-id=\"${ comment.id }\"\n data-path=\"${ comment.url }\"\n data-tracking-name=\"comment_reply_button\"\n rel=\"nofollow\"\u003e\n ${ iconSmallComment }\n \u003cspan class=\"hidden m:inline-block\"\u003eReply\u003c/span\u003e\n \u003c/a\u003e`;\n if (comment.newly_created) {\n return replyButton;\n }\n}\n\nfunction react(comment) {\n var reactedClass = \"\";\n var num = 0;\n var iconSmallHeart = `\u003csvg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"crayons-icon reaction-icon not-reacted\"\u003e\u003cpath d=\"M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z\"/\u003e\u003c/svg\u003e`;\n var iconSmallHeartFilled = `\u003csvg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"crayons-icon reaction-icon--like reaction-icon reacted\"\u003e\u003cpath d=\"M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z\"/\u003e\u003c/svg\u003e`;\n\n if (comment.newly_created) {\n num = 1;\n } else {\n num = comment.public_reactions_count;\n }\n\n if (comment.newly_created || comment.heart_ids.indexOf(userData().id) \u003e -1) {\n reactedClass = \"reacted\"\n }\n\n var reactButton = `\u003cbutton class=\"crayons-tooltip__activator crayons-btn crayons-btn--ghost crayons-btn--icon${num === 0 ? '' : '--left'} crayons-btn--s mr-1 reaction-like inline-flex reaction-button\" id=\"button-for-comment-${ comment.id }\" data-comment-id=\"${ comment.id }\" data-tracking-name=\"comment_heart_button\"\u003e\n ${ iconSmallHeart }\n ${ iconSmallHeartFilled }\n \u003cspan class=\"reactions-count\" id=\"reactions-count-${ comment.id }\"\u003e${ num }\u003c/span\u003e\n ${ num \u003e 0 ? '\u003cspan class=\"reactions-label hidden m:inline-block\"\u003elike\u003c/span\u003e' : ''}\n \u003cspan data-testid=\"tooltip\" class=\"crayons-tooltip__content\"\u003eLike\u003c/span\u003e\n \u003c/button\u003e`;\n\n return reactButton;\n};\nfunction checkUserLoggedIn() {\n const body = document.body;\n if (!body) {\n return false;\n }\n\n return body.getAttribute('data-user-status') === 'logged-in';\n};\nfunction dynamicallyLoadScript(url) {\n if (document.querySelector(`script[src='${url}']`)) return;\n\n const script = document.createElement('script');\n script.src = url;\n\n document.head.appendChild(script);\n};\n/* global Honeybadger */\n\nconst MAX_RETRIES = 30;\nconst RETRY_INTERVAL = 250;\n\nfunction getCsrfToken() {\n var promise = new Promise(function callback(resolve, reject) {\n var i = 0;\n // eslint-disable-next-line consistent-return\n var waitingOnCSRF = setInterval(function waitOnCSRF() {\n var metaTag = document.querySelector(\"meta[name='csrf-token']\");\n i += 1;\n\n if (metaTag) {\n clearInterval(waitingOnCSRF);\n var authToken = metaTag.getAttribute('content');\n return resolve(authToken);\n }\n\n if (i === MAX_RETRIES) {\n clearInterval(waitingOnCSRF);\n Honeybadger.notify(\n 'Could not locate CSRF metatag ' +\n JSON.stringify(localStorage.current_user),\n );\n return reject(new Error('Could not locate CSRF meta tag on the page.'));\n }\n }, RETRY_INTERVAL);\n });\n return promise;\n};\n'use strict';\n\nfunction getCurrentPage(classString) {\n return (\n document.querySelectorAll(\"[data-current-page='\" + classString + \"']\")\n .length \u003e 0\n );\n};\n'use strict';\n\nvar $fetchedImageUrls = [];\nfunction getImageForLink(elem) {\n var imageUrl = elem.getAttribute('data-preload-image');\n if (imageUrl \u0026\u0026 $fetchedImageUrls.indexOf(imageUrl) === -1) {\n var img = new Image();\n img.src = imageUrl;\n $fetchedImageUrls.push(imageUrl);\n }\n};\n'use strict';\n\nfunction insertAfter(newNode, referenceNode) {\n if (referenceNode \u0026\u0026 referenceNode.parentNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n }\n};\n/**\n * Determines whether or not a device is a touch device.\n *\n * @returns true if a touch device, otherwise false.\n */\nfunction isTouchDevice() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|DEV-Native-ios/i.test(\n navigator.userAgent,\n );\n};\n'use strict';\n\n/* Local date/time utilities */\n\n/*\n Convert string timestamp to local time, using the given locale.\n\n timestamp should be something like '2019-05-03T16:02:50.908Z'\n locale can be `navigator.language` or a custom locale. defaults to 'default'\n options are `Intl.DateTimeFormat` options\n\n see \u003chttps://developer.mozilla.org//docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\u003e\n for more information.\n*/\nfunction timestampToLocalDateTime(timestamp, locale, options) {\n if (!timestamp) {\n return '';\n }\n\n try {\n var time = new Date(timestamp);\n let formattedTime = new Intl.DateTimeFormat(\n locale || 'default',\n options,\n ).format(time);\n return options.year === '2-digit'\n ? formattedTime.replace(', ', \" '\")\n : formattedTime;\n } catch (e) {\n return '';\n }\n}\n\nfunction addLocalizedDateTimeToElementsTitles(elements, timestampAttribute) {\n for (var i = 0; i \u003c elements.length; i += 1) {\n var element = elements[i];\n\n // get UTC timestamp set by the server\n var timestamp = element.getAttribute(timestampAttribute || 'datetime');\n\n if (timestamp) {\n // add a full datetime to the element title, visible on hover.\n // `navigator.language` is used to allow the date to be localized\n // according to the browser's locale\n // see \u003chttps://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/language\u003e\n var localDateTime = timestampToLocalDateTimeLong(timestamp);\n element.setAttribute('title', localDateTime);\n }\n }\n}\n\nfunction localizeTimeElements(elements, timeOptions) {\n for (let i = 0; i \u003c elements.length; i += 1) {\n const element = elements[i];\n\n const timestamp = element.getAttribute('datetime');\n if (timestamp) {\n const localDateTime = timestampToLocalDateTime(\n timestamp,\n navigator.language,\n timeOptions,\n );\n\n element.textContent = localDateTime;\n }\n }\n}\n\nfunction timestampToLocalDateTimeLong(timestamp) {\n // example: \"Wednesday, April 3, 2019, 2:55:14 PM\"\n\n return timestampToLocalDateTime(timestamp, navigator.language, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n });\n}\n\nfunction timestampToLocalDateTimeShort(timestamp) {\n // example: \"10 Dec 2018\" if it is not the current year\n // example: \"6 Sep\" if it is the current year\n\n if (timestamp) {\n const currentYear = new Date().getFullYear();\n const givenYear = new Date(timestamp).getFullYear();\n\n var timeOptions = {\n day: 'numeric',\n month: 'short',\n };\n\n if (givenYear !== currentYear) {\n timeOptions.year = 'numeric';\n }\n\n return timestampToLocalDateTime(timestamp, navigator.language, timeOptions);\n }\n\n return '';\n}\n\nif (typeof globalThis !== 'undefined') {\n globalThis.timestampToLocalDateTimeLong = timestampToLocalDateTimeLong; // eslint-disable-line no-undef\n globalThis.timestampToLocalDateTimeShort = timestampToLocalDateTimeShort; // eslint-disable-line no-undef\n};\n'use strict';\n\nfunction localStorageTest() {\n var test = 'devtolocalstoragetestforavaialbility';\n try {\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n};\n'use strict';\n\nfunction preventDefaultAction(event) {\n event.preventDefault();\n};\n'use strict';\n\nconst fetchCallback = ({ url, headers = {}, addTokenToBody = false, body }) =\u003e {\n return (csrfToken) =\u003e {\n if (addTokenToBody) {\n body.append('authenticity_token', csrfToken);\n }\n return window.fetch(url, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': csrfToken,\n ...headers,\n },\n body,\n credentials: 'same-origin',\n });\n };\n};\n\nfunction sendFetch(switchStatement, body) {\n switch (switchStatement) {\n case 'article-preview':\n return fetchCallback({\n url: '/articles/preview',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body,\n });\n case 'reaction-creation':\n return fetchCallback({\n url: '/reactions',\n addTokenToBody: true,\n body,\n });\n case 'image-upload':\n return fetchCallback({\n url: '/image_uploads',\n addTokenToBody: true,\n body,\n });\n case 'follow-creation':\n return fetchCallback({\n url: '/follows',\n addTokenToBody: true,\n body,\n });\n case 'block-user':\n return fetchCallback({\n url: '/user_blocks',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n addTokenToBody: false,\n body,\n });\n case 'comment-creation':\n return fetchCallback({\n url: '/comments',\n headers: {\n 'Content-Type': 'application/json',\n },\n body,\n });\n case 'comment-preview':\n return fetchCallback({\n url: '/comments/preview',\n headers: {\n 'Content-Type': 'application/json',\n },\n body,\n });\n case 'user_subscriptions':\n return fetchCallback({\n url: '/user_subscriptions',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body,\n });\n case 'comment-subscribe':\n return fetchCallback({\n url: '/comments/subscribe',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body,\n });\n case 'comment-unsubscribe':\n return fetchCallback({\n url: 'subscription/unsubscribe',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body,\n });\n default:\n console.log('A wrong switchStatement was used.'); // eslint-disable-line no-console\n break;\n }\n return true;\n};\n'use strict';\n\nfunction sendHapticMessage(message) {\n try {\n if (\n window \u0026\u0026\n window.webkit \u0026\u0026\n window.webkit.messageHandlers \u0026\u0026\n window.webkit.messageHandlers.haptic\n ) {\n window.webkit.messageHandlers.haptic.postMessage(message);\n }\n } catch (err) {\n console.log(err.message); // eslint-disable-line no-console\n }\n};\n/* global ahoy */\nfunction showLoginModal(trackingData) {\n window.Forem.showModal({\n title: 'Log in to continue',\n contentSelector: '#global-signup-modal',\n overlay: true,\n onOpen: () =\u003e {\n if (trackingData \u0026\u0026 Object.keys(trackingData).length \u003e 0) {\n document\n .querySelector(\n '#window-modal .js-global-signup-modal__create-account',\n )\n .addEventListener('click', () =\u003e ahoyTracking(trackingData));\n }\n },\n });\n}\n\nfunction ahoyTracking(trackingData) {\n ahoy.track('Clicked on Create Account', {\n version: 0.1,\n page: location.href,\n source: 'modal',\n referring_source: trackingData.referring_source,\n trigger: trackingData.trigger,\n });\n};\nfunction slideSidebar(side, direction) {\n if (!document.getElementById('sidebar-wrapper-' + side)) {\n return;\n }\n const mainContent =\n document.getElementById('main-content') ||\n document.getElementById('articles-list');\n if (direction === 'intoView') {\n mainContent.classList.add('modal-open');\n document.body.classList.add('modal-open');\n document\n .getElementById('sidebar-wrapper-' + side)\n .classList.add('swiped-in');\n mainContent.addEventListener('touchmove', preventDefaultAction, false);\n } else {\n mainContent.classList.remove('modal-open');\n document.body.classList.remove('modal-open');\n document\n .getElementById('sidebar-wrapper-' + side)\n .classList.remove('swiped-in');\n mainContent.removeEventListener('touchmove', preventDefaultAction, false);\n }\n};\n'use strict';\n\nfunction secondsToHumanUnitAgo(seconds) {\n const times = [\n ['second', 1],\n ['min', 60],\n ['hour', 60 * 60],\n ['day', 60 * 60 * 24],\n ['week', 60 * 60 * 24 * 7],\n ['month', 60 * 60 * 24 * 30],\n ['year', 60 * 60 * 24 * 365],\n ];\n\n if (seconds \u003c times[0][1]) return 'just now';\n\n let scale = 0;\n // If the amount of seconds is more than a minute, we change the scale to minutes\n // If the amount of seconds then is more than an hour, we change the scale to hours\n // This continues until the unit above our current scale is longer than `seconds`, or doesn't exist\n while (scale + 1 \u003c times.length \u0026\u0026 seconds \u003e= times[scale + 1][1]) scale += 1;\n\n const wholeUnits = Math.floor(seconds / times[scale][1]);\n const unitName = times[scale][0] + (wholeUnits === 1 ? '' : 's');\n\n return wholeUnits + ' ' + unitName + ' ago';\n}\n\n/**\n * Returns a given time in seconds as a human readable form, e.g. (5 min ago)\n *\n * @param {object} options\n * @param {number} options.oldTimeInSeconds\n * @param {function} [(humanTime) =\u003e\n `\u003cspan class=\"time-ago-indicator\"\u003e(${humanTime})\u003c/span\u003e`] options.formatter\n * @param {number} [60 * 60 * 24 - 1] options.maxDisplayedAge The maximum display age in seconds\n *\n * @returns {string} A formatted string in human readable form. Note that the default formatter returns a string with markup in it.\n */\nfunction timeAgo({\n oldTimeInSeconds,\n formatter = (humanTime) =\u003e\n `\u003cspan class=\"time-ago-indicator\"\u003e(${humanTime})\u003c/span\u003e`,\n maxDisplayedAge = 60 * 60 * 24 - 1,\n}) {\n const timeNow = new Date() / 1000;\n const diff = Math.round(timeNow - oldTimeInSeconds);\n\n if (diff \u003e maxDisplayedAge) return '';\n\n return formatter(secondsToHumanUnitAgo(diff));\n}\n\n// TODO: This is for Storybook/jest.\n// Longterm, this should be a utility function that can be imported.\n// For the time being, duplication of this function is being avoided.\nif (typeof globalThis !== 'undefined') {\n globalThis.timeAgo = timeAgo; // eslint-disable-line no-undef\n};\n'use strict';\n\nfunction userData() {\n const { user = null } = document.body.dataset;\n\n return JSON.parse(user);\n};\n// Watch @param element for a \"long touch\" (800ms) and dispatch a custom \"longTouch\" event,\n// which you are presumably listening for elsewhere. Note that this also disables context menu\n// for the element, as otherwise device will default to opening a context menu instead.\nfunction watchForLongTouch(element) {\n const longTouchEvent = new Event('longTouch');\n const minDuration = 500;\n let timer;\n\n // In the event of a long touch, dispatch the \"longTouch\" event\n const dispatcher = function () {\n element.dispatchEvent(longTouchEvent);\n };\n\n // Observe \"touchstart\", if it's still going after a duration, dispatch \"longTouch\"\n const onTouchStart = function (event) {\n if (!timer) {\n timer = setTimeout(dispatcher, minDuration);\n }\n };\n\n // Observe \"touchend\", if they've stopped touching, it won't become a longTouch anytime soon\n const onTouchEnd = function () {\n if (timer) {\n clearTimeout(timer);\n timer = false;\n }\n };\n\n if (element) {\n // Disable contextmenu on device, otherwise they'll get a device OS menu instead of ours\n element.oncontextmenu = function (event) {\n event.preventDefault();\n event.stopPropagation(); // not necessary in my case, could leave in case stopImmediateProp isn't available?\n event.stopImmediatePropagation();\n return false;\n };\n element.addEventListener('touchstart', onTouchStart);\n element.addEventListener('touchend', onTouchEnd);\n }\n};\n(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"\u0026\u0026require;if(!u\u0026\u0026a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"\u0026\u0026require;for(var o=0;o\u003cr.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/**\n * 默认配置\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar FilterCSS = require('cssfilter').FilterCSS;\nvar getDefaultCSSWhiteList = require('cssfilter').getDefaultWhiteList;\nvar _ = require('./util');\n\n// 默认白名单\nfunction getDefaultWhiteList () {\n return {\n // // a: ['target', 'href', 'title'],\n // abbr: ['title'],\n // address: [],\n // area: ['shape', 'coords', 'href', 'alt'],\n // article: [],\n // aside: [],\n // audio: ['autoplay', 'controls', 'loop', 'preload', 'src'],\n // b: [],\n // bdi: ['dir'],\n // bdo: ['dir'],\n // big: [],\n // blockquote: ['cite'],\n // br: [],\n // caption: [],\n // center: [],\n // cite: [],\n // code: [],\n // col: ['align', 'valign', 'span', 'width'],\n // colgroup: ['align', 'valign', 'span', 'width'],\n // dd: [],\n // del: ['datetime'],\n // details: ['open'],\n // div: [],\n // dl: [],\n // dt: [],\n // em: [],\n // font: ['color', 'size', 'face'],\n // footer: [],\n // h1: [],\n // h2: [],\n // h3: [],\n // h4: [],\n // h5: [],\n // h6: [],\n // header: [],\n // hr: [],\n // i: [],\n // // img: ['src', 'alt', 'title', 'width', 'height'],\n // ins: ['datetime'],\n // li: [],\n // mark: [],\n // nav: [],\n // ol: [],\n // p: [],\n // pre: [],\n // s: [],\n // section:[],\n // small: [],\n // span: [],\n // sub: [],\n // sup: [],\n // strong: [],\n // table: ['width', 'border', 'align', 'valign'],\n // tbody: ['align', 'valign'],\n // td: ['width', 'rowspan', 'colspan', 'align', 'valign'],\n // tfoot: ['align', 'valign'],\n // th: ['width', 'rowspan', 'colspan', 'align', 'valign'],\n // thead: ['align', 'valign'],\n // tr: ['rowspan', 'align', 'valign'],\n // tt: [],\n // u: [],\n // ul: [],\n // video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width']\n };\n}\n\n// 默认CSS Filter\nvar defaultCSSFilter = new FilterCSS();\n\n/**\n * 匹配到标签时的处理方法\n *\n * @param {String} tag\n * @param {String} html\n * @param {Object} options\n * @return {String}\n */\nfunction onTag (tag, html, options) {\n // do nothing\n}\n\n/**\n * 匹配到不在白名单上的标签时的处理方法\n *\n * @param {String} tag\n * @param {String} html\n * @param {Object} options\n * @return {String}\n */\nfunction onIgnoreTag (tag, html, options) {\n // do nothing\n}\n\n/**\n * 匹配到标签属性时的处理方法\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @return {String}\n */\nfunction onTagAttr (tag, name, value) {\n // do nothing\n}\n\n/**\n * 匹配到不在白名单上的标签属性时的处理方法\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @return {String}\n */\nfunction onIgnoreTagAttr (tag, name, value) {\n // do nothing\n}\n\n/**\n * HTML转义\n *\n * @param {String} html\n */\nfunction escapeHtml (html) {\n return html.replace(REGEXP_LT, '\u0026lt;').replace(REGEXP_GT, '\u0026gt;');\n}\n\n/**\n * 安全的标签属性值\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @param {Object} cssFilter\n * @return {String}\n */\nfunction safeAttrValue (tag, name, value, cssFilter) {\n // 转换为友好的属性值,再做判断\n value = friendlyAttrValue(value);\n\n if (name === 'href' || name === 'src') {\n // 过滤 href 和 src 属性\n // 仅允许 http:// | https:// | mailto: | / | # 开头的地址\n value = _.trim(value);\n if (value === '#') return '#';\n if (!(value.substr(0, 7) === 'http://' ||\n value.substr(0, 8) === 'https://' ||\n value.substr(0, 7) === 'mailto:' ||\n value[0] === '#' ||\n value[0] === '/')) {\n return '';\n }\n } else if (name === 'background') {\n // 过滤 background 属性 (这个xss漏洞较老了,可能已经不适用)\n // javascript:\n REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) {\n return '';\n }\n } else if (name === 'style') {\n // /*注释*/\n /*REGEXP_DEFAULT_ON_TAG_ATTR_3.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_3.test(value)) {\n return '';\n }*/\n // expression()\n REGEXP_DEFAULT_ON_TAG_ATTR_7.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_7.test(value)) {\n return '';\n }\n // url()\n REGEXP_DEFAULT_ON_TAG_ATTR_8.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_8.test(value)) {\n REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) {\n return '';\n }\n }\n if (cssFilter !== false) {\n cssFilter = cssFilter || defaultCSSFilter;\n value = cssFilter.process(value);\n }\n }\n\n // 输出时需要转义\u003c\u003e\"\n value = escapeAttrValue(value);\n return value;\n}\n\n// 正则表达式\nvar REGEXP_LT = /\u003c/g;\nvar REGEXP_GT = /\u003e/g;\nvar REGEXP_QUOTE = /\"/g;\nvar REGEXP_QUOTE_2 = /\u0026quot;/g;\nvar REGEXP_ATTR_VALUE_1 = /\u0026#([a-zA-Z0-9]*);?/img;\nvar REGEXP_ATTR_VALUE_COLON = /\u0026colon;?/img;\nvar REGEXP_ATTR_VALUE_NEWLINE = /\u0026newline;?/img;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_3 = /\\/\\*|\\*\\//mg;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_4 = /((j\\s*a\\s*v\\s*a|v\\s*b|l\\s*i\\s*v\\s*e)\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*|m\\s*o\\s*c\\s*h\\s*a)\\:/ig;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_5 = /^[\\s\"'`]*(d\\s*a\\s*t\\s*a\\s*)\\:/ig;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_6 = /^[\\s\"'`]*(d\\s*a\\s*t\\s*a\\s*)\\:\\s*image\\//ig;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_7 = /e\\s*x\\s*p\\s*r\\s*e\\s*s\\s*s\\s*i\\s*o\\s*n\\s*\\(.*/ig;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_8 = /u\\s*r\\s*l\\s*\\(.*/ig;\n\n/**\n * 对双引号进行转义\n *\n * @param {String} str\n * @return {String} str\n */\nfunction escapeQuote (str) {\n return str.replace(REGEXP_QUOTE, '\u0026quot;');\n}\n\n/**\n * 对双引号进行转义\n *\n * @param {String} str\n * @return {String} str\n */\nfunction unescapeQuote (str) {\n return str.replace(REGEXP_QUOTE_2, '\"');\n}\n\n/**\n * 对html实体编码进行转义\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeHtmlEntities (str) {\n return str.replace(REGEXP_ATTR_VALUE_1, function replaceUnicode (str, code) {\n return (code[0] === 'x' || code[0] === 'X')\n ? String.fromCharCode(parseInt(code.substr(1), 16))\n : String.fromCharCode(parseInt(code, 10));\n });\n}\n\n/**\n * 对html5新增的危险实体编码进行转义\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeDangerHtml5Entities (str) {\n return str.replace(REGEXP_ATTR_VALUE_COLON, ':')\n .replace(REGEXP_ATTR_VALUE_NEWLINE, ' ');\n}\n\n/**\n * 清除不可见字符\n *\n * @param {String} str\n * @return {String}\n */\nfunction clearNonPrintableCharacter (str) {\n var str2 = '';\n for (var i = 0, len = str.length; i \u003c len; i++) {\n str2 += str.charCodeAt(i) \u003c 32 ? ' ' : str.charAt(i);\n }\n return _.trim(str2);\n}\n\n/**\n * 将标签的属性值转换成一般字符,便于分析\n *\n * @param {String} str\n * @return {String}\n */\nfunction friendlyAttrValue (str) {\n str = unescapeQuote(str); // 双引号\n str = escapeHtmlEntities(str); // 转换HTML实体编码\n str = escapeDangerHtml5Entities(str); // 转换危险的HTML5新增实体编码\n str = clearNonPrintableCharacter(str); // 清除不可见字符\n return str;\n}\n\n/**\n * 转义用于输出的标签属性值\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeAttrValue (str) {\n str = escapeQuote(str);\n str = escapeHtml(str);\n return str;\n}\n\n/**\n * 去掉不在白名单中的标签onIgnoreTag处理方法\n */\nfunction onIgnoreTagStripAll () {\n return '';\n}\n\n/**\n * 删除标签体\n *\n * @param {array} tags 要删除的标签列表\n * @param {function} next 对不在列表中的标签的处理函数,可选\n */\nfunction StripTagBody (tags, next) {\n if (typeof(next) !== 'function') {\n next = function () {};\n }\n\n var isRemoveAllTag = !Array.isArray(tags);\n function isRemoveTag (tag) {\n if (isRemoveAllTag) return true;\n return (_.indexOf(tags, tag) !== -1);\n }\n\n var removeList = []; // 要删除的位置范围列表\n var posStart = false; // 当前标签开始位置\n\n return {\n onIgnoreTag: function (tag, html, options) {\n if (isRemoveTag(tag)) {\n if (options.isClosing) {\n var ret = '[/removed]';\n var end = options.position + ret.length;\n removeList.push([posStart !== false ? posStart : options.position, end]);\n posStart = false;\n return ret;\n } else {\n if (!posStart) {\n posStart = options.position;\n }\n return '[removed]';\n }\n } else {\n return next(tag, html, options);\n }\n },\n remove: function (html) {\n var rethtml = '';\n var lastPos = 0;\n _.forEach(removeList, function (pos) {\n rethtml += html.slice(lastPos, pos[0]);\n lastPos = pos[1];\n });\n rethtml += html.slice(lastPos);\n return rethtml;\n }\n };\n}\n\n/**\n * 去除备注标签\n *\n * @param {String} html\n * @return {String}\n */\nfunction stripCommentTag (html) {\n return html.replace(STRIP_COMMENT_TAG_REGEXP, '');\n}\nvar STRIP_COMMENT_TAG_REGEXP = /\u003c!--[\\s\\S]*?--\u003e/g;\n\n/**\n * 去除不可见字符\n *\n * @param {String} html\n * @return {String}\n */\nfunction stripBlankChar (html) {\n var chars = html.split('');\n chars = chars.filter(function (char) {\n var c = char.charCodeAt(0);\n if (c === 127) return false;\n if (c \u003c= 31) {\n if (c === 10 || c === 13) return true;\n return false;\n }\n return true;\n });\n return chars.join('');\n}\n\n\nexports.whiteList = getDefaultWhiteList();\nexports.getDefaultWhiteList = getDefaultWhiteList;\nexports.onTag = onTag;\nexports.onIgnoreTag = onIgnoreTag;\nexports.onTagAttr = onTagAttr;\nexports.onIgnoreTagAttr = onIgnoreTagAttr;\nexports.safeAttrValue = safeAttrValue;\nexports.escapeHtml = escapeHtml;\nexports.escapeQuote = escapeQuote;\nexports.unescapeQuote = unescapeQuote;\nexports.escapeHtmlEntities = escapeHtmlEntities;\nexports.escapeDangerHtml5Entities = escapeDangerHtml5Entities;\nexports.clearNonPrintableCharacter = clearNonPrintableCharacter;\nexports.friendlyAttrValue = friendlyAttrValue;\nexports.escapeAttrValue = escapeAttrValue;\nexports.onIgnoreTagStripAll = onIgnoreTagStripAll;\nexports.StripTagBody = StripTagBody;\nexports.stripCommentTag = stripCommentTag;\nexports.stripBlankChar = stripBlankChar;\nexports.cssFilter = defaultCSSFilter;\nexports.getDefaultCSSWhiteList = getDefaultCSSWhiteList;\n\n},{\"./util\":4,\"cssfilter\":8}],2:[function(require,module,exports){\n/**\n * 模块入口\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar DEFAULT = require('./default');\nvar parser = require('./parser');\nvar FilterXSS = require('./xss');\n\n\n/**\n * XSS过滤\n *\n * @param {String} html 要过滤的HTML代码\n * @param {Object} options 选项:whiteList, onTag, onTagAttr, onIgnoreTag, onIgnoreTagAttr, safeAttrValue, escapeHtml\n * @return {String}\n */\nfunction filterXSS (html, options) {\n var xss = new FilterXSS(options);\n return xss.process(html);\n}\n\n\n// 输出\nexports = module.exports = filterXSS;\nexports.FilterXSS = FilterXSS;\nfor (var i in DEFAULT) exports[i] = DEFAULT[i];\nfor (var i in parser) exports[i] = parser[i];\n\n\n// 在浏览器端使用\nif (typeof window !== 'undefined') {\n window.filterXSS = module.exports;\n}\n\n},{\"./default\":1,\"./parser\":3,\"./xss\":5}],3:[function(require,module,exports){\n/**\n * 简单 HTML Parser\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar _ = require('./util');\n\n/**\n * 获取标签的名称\n *\n * @param {String} html 如:'\u003ca hef=\"#\"\u003e'\n * @return {String}\n */\nfunction getTagName (html) {\n var i = html.indexOf(' ');\n if (i === -1) {\n var tagName = html.slice(1, -1);\n } else {\n var tagName = html.slice(1, i + 1);\n }\n tagName = _.trim(tagName).toLowerCase();\n if (tagName.slice(0, 1) === '/') tagName = tagName.slice(1);\n if (tagName.slice(-1) === '/') tagName = tagName.slice(0, -1);\n return tagName;\n}\n\n/**\n * 是否为闭合标签\n *\n * @param {String} html 如:'\u003ca hef=\"#\"\u003e'\n * @return {Boolean}\n */\nfunction isClosing (html) {\n return (html.slice(0, 2) === '\u003c/');\n}\n\n/**\n * 分析HTML代码,调用相应的函数处理,返回处理后的HTML\n *\n * @param {String} html\n * @param {Function} onTag 处理标签的函数\n * 参数格式: function (sourcePosition, position, tag, html, isClosing)\n * @param {Function} escapeHtml 对HTML进行转义的函数\n * @return {String}\n */\nfunction parseTag (html, onTag, escapeHtml) {\n 'user strict';\n\n var rethtml = ''; // 待返回的HTML\n var lastPos = 0; // 上一个标签结束位置\n var tagStart = false; // 当前标签开始位置\n var quoteStart = false; // 引号开始位置\n var currentPos = 0; // 当前位置\n var len = html.length; // HTML长度\n var currentHtml = ''; // 当前标签的HTML代码\n var currentTagName = ''; // 当前标签的名称\n\n // 逐个分析字符\n for (currentPos = 0; currentPos \u003c len; currentPos++) {\n var c = html.charAt(currentPos);\n if (tagStart === false) {\n if (c === '\u003c') {\n tagStart = currentPos;\n continue;\n }\n } else {\n if (quoteStart === false) {\n if (c === '\u003c') {\n rethtml += escapeHtml(html.slice(lastPos, currentPos));\n tagStart = currentPos;\n lastPos = currentPos;\n continue;\n }\n if (c === '\u003e') {\n rethtml += escapeHtml(html.slice(lastPos, tagStart));\n currentHtml = html.slice(tagStart, currentPos + 1);\n currentTagName = getTagName(currentHtml);\n rethtml += onTag(tagStart,\n rethtml.length,\n currentTagName,\n currentHtml,\n isClosing(currentHtml));\n lastPos = currentPos + 1;\n tagStart = false;\n continue;\n }\n // HTML标签内的引号仅当前一个字符是等于号时才有效\n if ((c === '\"' || c === \"'\") \u0026\u0026 html.charAt(currentPos - 1) === '=') {\n quoteStart = c;\n continue;\n }\n } else {\n if (c === quoteStart) {\n quoteStart = false;\n continue;\n }\n }\n }\n }\n if (lastPos \u003c html.length) {\n rethtml += escapeHtml(html.substr(lastPos));\n }\n\n return rethtml;\n}\n\n// 不符合属性名称规则的正则表达式\nvar REGEXP_ATTR_NAME = /[^a-zA-Z0-9_:\\.\\-]/img;\n\n/**\n * 分析标签HTML代码,调用相应的函数处理,返回HTML\n *\n * @param {String} html 如标签'\u003ca href=\"#\" target=\"_blank\"\u003e' 则为 'href=\"#\" target=\"_blank\"'\n * @param {Function} onAttr 处理属性值的函数\n * 函数格式: function (name, value)\n * @return {String}\n */\nfunction parseAttr (html, onAttr) {\n 'user strict';\n\n var lastPos = 0; // 当前位置\n var retAttrs = []; // 待返回的属性列表\n var tmpName = false; // 临时属性名称\n var len = html.length; // HTML代码长度\n\n function addAttr (name, value) {\n name = _.trim(name);\n name = name.replace(REGEXP_ATTR_NAME, '').toLowerCase();\n if (name.length \u003c 1) return;\n var ret = onAttr(name, value || '');\n if (ret) retAttrs.push(ret);\n };\n\n // 逐个分析字符\n for (var i = 0; i \u003c len; i++) {\n var c = html.charAt(i);\n var v, j;\n if (tmpName === false \u0026\u0026 c === '=') {\n tmpName = html.slice(lastPos, i);\n lastPos = i + 1;\n continue;\n }\n if (tmpName !== false) {\n // HTML标签内的引号仅当前一个字符是等于号时才有效\n if (i === lastPos \u0026\u0026 (c === '\"' || c === \"'\") \u0026\u0026 html.charAt(i - 1) === '=') {\n j = html.indexOf(c, i + 1);\n if (j === -1) {\n break;\n } else {\n v = _.trim(html.slice(lastPos + 1, j));\n addAttr(tmpName, v);\n tmpName = false;\n i = j;\n lastPos = i + 1;\n continue;\n }\n }\n }\n if (c === ' ') {\n if (tmpName === false) {\n j = findNextEqual(html, i);\n if (j === -1) {\n v = _.trim(html.slice(lastPos, i));\n addAttr(v);\n tmpName = false;\n lastPos = i + 1;\n continue;\n } else {\n i = j - 1;\n continue;\n }\n } else {\n j = findBeforeEqual(html, i - 1);\n if (j === -1) {\n v = _.trim(html.slice(lastPos, i));\n v = stripQuoteWrap(v);\n addAttr(tmpName, v);\n tmpName = false;\n lastPos = i + 1;\n continue;\n } else {\n continue;\n }\n }\n }\n }\n\n if (lastPos \u003c html.length) {\n if (tmpName === false) {\n addAttr(html.slice(lastPos));\n } else {\n addAttr(tmpName, stripQuoteWrap(_.trim(html.slice(lastPos))));\n }\n }\n\n return _.trim(retAttrs.join(' '));\n}\n\nfunction findNextEqual (str, i) {\n for (; i \u003c str.length; i++) {\n var c = str[i];\n if (c === ' ') continue;\n if (c === '=') return i;\n return -1;\n }\n}\n\nfunction findBeforeEqual (str, i) {\n for (; i \u003e 0; i--) {\n var c = str[i];\n if (c === ' ') continue;\n if (c === '=') return i;\n return -1;\n }\n}\n\nfunction isQuoteWrapString (text) {\n if ((text[0] === '\"' \u0026\u0026 text[text.length - 1] === '\"') ||\n (text[0] === '\\'' \u0026\u0026 text[text.length - 1] === '\\'')) {\n return true;\n } else {\n return false;\n }\n};\n\nfunction stripQuoteWrap (text) {\n if (isQuoteWrapString(text)) {\n return text.substr(1, text.length - 2);\n } else {\n return text;\n }\n};\n\n\nexports.parseTag = parseTag;\nexports.parseAttr = parseAttr;\n\n},{\"./util\":4}],4:[function(require,module,exports){\nmodule.exports = {\n indexOf: function (arr, item) {\n var i, j;\n if (Array.prototype.indexOf) {\n return arr.indexOf(item);\n }\n for (i = 0, j = arr.length; i \u003c j; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n return -1;\n },\n forEach: function (arr, fn, scope) {\n var i, j;\n if (Array.prototype.forEach) {\n return arr.forEach(fn, scope);\n }\n for (i = 0, j = arr.length; i \u003c j; i++) {\n fn.call(scope, arr[i], i, arr);\n }\n },\n trim: function (str) {\n if (String.prototype.trim) {\n return str.trim();\n }\n return str.replace(/(^\\s*)|(\\s*$)/g, '');\n }\n};\n\n},{}],5:[function(require,module,exports){\n/**\n * 过滤XSS\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar FilterCSS = require('cssfilter').FilterCSS;\nvar DEFAULT = require('./default');\nvar parser = require('./parser');\nvar parseTag = parser.parseTag;\nvar parseAttr = parser.parseAttr;\nvar _ = require('./util');\n\n\n/**\n * 返回值是否为空\n *\n * @param {Object} obj\n * @return {Boolean}\n */\nfunction isNull (obj) {\n return (obj === undefined || obj === null);\n}\n\n/**\n * 取标签内的属性列表字符串\n *\n * @param {String} html\n * @return {Object}\n * - {String} html\n * - {Boolean} closing\n */\nfunction getAttrs (html) {\n var i = html.indexOf(' ');\n if (i === -1) {\n return {\n html: '',\n closing: (html[html.length - 2] === '/')\n };\n }\n html = _.trim(html.slice(i + 1, -1));\n var isClosing = (html[html.length - 1] === '/');\n if (isClosing) html = _.trim(html.slice(0, -1));\n return {\n html: html,\n closing: isClosing\n };\n}\n\n/**\n * 浅拷贝对象\n *\n * @param {Object} obj\n * @return {Object}\n */\nfunction shallowCopyObject (obj) {\n var ret = {};\n for (var i in obj) {\n ret[i] = obj[i];\n }\n return ret;\n}\n\n/**\n * XSS过滤对象\n *\n * @param {Object} options\n * 选项:whiteList, onTag, onTagAttr, onIgnoreTag,\n * onIgnoreTagAttr, safeAttrValue, escapeHtml\n * stripIgnoreTagBody, allowCommentTag, stripBlankChar\n * css{whiteList, onAttr, onIgnoreAttr} css=false表示禁用cssfilter\n */\nfunction FilterXSS (options) {\n options = shallowCopyObject(options || {});\n\n if (options.stripIgnoreTag) {\n if (options.onIgnoreTag) {\n console.error('Notes: cannot use these two options \"stripIgnoreTag\" and \"onIgnoreTag\" at the same time');\n }\n options.onIgnoreTag = DEFAULT.onIgnoreTagStripAll;\n }\n\n options.whiteList = options.whiteList || DEFAULT.whiteList;\n options.onTag = options.onTag || DEFAULT.onTag;\n options.onTagAttr = options.onTagAttr || DEFAULT.onTagAttr;\n options.onIgnoreTag = options.onIgnoreTag || DEFAULT.onIgnoreTag;\n options.onIgnoreTagAttr = options.onIgnoreTagAttr || DEFAULT.onIgnoreTagAttr;\n options.safeAttrValue = options.safeAttrValue || DEFAULT.safeAttrValue;\n options.escapeHtml = options.escapeHtml || DEFAULT.escapeHtml;\n this.options = options;\n\n if (options.css === false) {\n this.cssFilter = false;\n } else {\n options.css = options.css || {};\n this.cssFilter = new FilterCSS(options.css);\n }\n}\n\n/**\n * 开始处理\n *\n * @param {String} html\n * @return {String}\n */\nFilterXSS.prototype.process = function (html) {\n // 兼容各种奇葩输入\n html = html || '';\n html = html.toString();\n if (!html) return '';\n\n var me = this;\n var options = me.options;\n var whiteList = options.whiteList;\n var onTag = options.onTag;\n var onIgnoreTag = options.onIgnoreTag;\n var onTagAttr = options.onTagAttr;\n var onIgnoreTagAttr = options.onIgnoreTagAttr;\n var safeAttrValue = options.safeAttrValue;\n var escapeHtml = options.escapeHtml;\n var cssFilter = me.cssFilter;\n\n // 是否清除不可见字符\n if (options.stripBlankChar) {\n html = DEFAULT.stripBlankChar(html);\n }\n\n // 是否禁止备注标签\n if (!options.allowCommentTag) {\n html = DEFAULT.stripCommentTag(html);\n }\n\n // 如果开启了stripIgnoreTagBody\n var stripIgnoreTagBody = false;\n if (options.stripIgnoreTagBody) {\n var stripIgnoreTagBody = DEFAULT.StripTagBody(options.stripIgnoreTagBody, onIgnoreTag);\n onIgnoreTag = stripIgnoreTagBody.onIgnoreTag;\n }\n\n var retHtml = parseTag(html, function (sourcePosition, position, tag, html, isClosing) {\n var info = {\n sourcePosition: sourcePosition,\n position: position,\n isClosing: isClosing,\n isWhite: (tag in whiteList)\n };\n\n // 调用onTag处理\n var ret = onTag(tag, html, info);\n if (!isNull(ret)) return ret;\n\n // 默认标签处理方法\n if (info.isWhite) {\n // 白名单标签,解析标签属性\n // 如果是闭合标签,则不需要解析属性\n if (info.isClosing) {\n return '\u003c/' + tag + '\u003e';\n }\n\n var attrs = getAttrs(html);\n var whiteAttrList = whiteList[tag];\n var attrsHtml = parseAttr(attrs.html, function (name, value) {\n\n // 调用onTagAttr处理\n var isWhiteAttr = (_.indexOf(whiteAttrList, name) !== -1);\n var ret = onTagAttr(tag, name, value, isWhiteAttr);\n if (!isNull(ret)) return ret;\n\n // 默认的属性处理方法\n if (isWhiteAttr) {\n // 白名单属性,调用safeAttrValue过滤属性值\n value = safeAttrValue(tag, name, value, cssFilter);\n if (value) {\n return name + '=\"' + value + '\"';\n } else {\n return name;\n }\n } else {\n // 非白名单属性,调用onIgnoreTagAttr处理\n var ret = onIgnoreTagAttr(tag, name, value, isWhiteAttr);\n if (!isNull(ret)) return ret;\n return;\n }\n });\n\n // 构造新的标签代码\n var html = '\u003c' + tag;\n if (attrsHtml) html += ' ' + attrsHtml;\n if (attrs.closing) html += ' /';\n html += '\u003e';\n return html;\n\n } else {\n // 非白名单标签,调用onIgnoreTag处理\n var ret = onIgnoreTag(tag, html, info);\n if (!isNull(ret)) return ret;\n return escapeHtml(html);\n }\n\n }, escapeHtml);\n\n // 如果开启了stripIgnoreTagBody,需要对结果再进行处理\n if (stripIgnoreTagBody) {\n retHtml = stripIgnoreTagBody.remove(retHtml);\n }\n\n return retHtml;\n};\n\n\nmodule.exports = FilterXSS;\n\n},{\"./default\":1,\"./parser\":3,\"./util\":4,\"cssfilter\":8}],6:[function(require,module,exports){\n/**\n * cssfilter\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar DEFAULT = require('./default');\nvar parseStyle = require('./parser');\nvar _ = require('./util');\n\n\n/**\n * 返回值是否为空\n *\n * @param {Object} obj\n * @return {Boolean}\n */\nfunction isNull (obj) {\n return (obj === undefined || obj === null);\n}\n\n/**\n * 浅拷贝对象\n *\n * @param {Object} obj\n * @return {Object}\n */\nfunction shallowCopyObject (obj) {\n var ret = {};\n for (var i in obj) {\n ret[i] = obj[i];\n }\n return ret;\n}\n\n/**\n * 创建CSS过滤器\n *\n * @param {Object} options\n * - {Object} whiteList\n * - {Object} onAttr\n * - {Object} onIgnoreAttr\n */\nfunction FilterCSS (options) {\n options = shallowCopyObject(options || {});\n options.whiteList = options.whiteList || DEFAULT.whiteList;\n options.onAttr = options.onAttr || DEFAULT.onAttr;\n options.onIgnoreAttr = options.onIgnoreAttr || DEFAULT.onIgnoreAttr;\n this.options = options;\n}\n\nFilterCSS.prototype.process = function (css) {\n // 兼容各种奇葩输入\n css = css || '';\n css = css.toString();\n if (!css) return '';\n\n var me = this;\n var options = me.options;\n var whiteList = options.whiteList;\n var onAttr = options.onAttr;\n var onIgnoreAttr = options.onIgnoreAttr;\n\n var retCSS = parseStyle(css, function (sourcePosition, position, name, value, source) {\n\n var check = whiteList[name];\n var isWhite = false;\n if (check === true) isWhite = check;\n else if (typeof check === 'function') isWhite = check(value);\n else if (check instanceof RegExp) isWhite = check.test(value);\n if (isWhite !== true) isWhite = false;\n\n var opts = {\n position: position,\n sourcePosition: sourcePosition,\n source: source,\n isWhite: isWhite\n };\n\n if (isWhite) {\n\n var ret = onAttr(name, value, opts);\n if (isNull(ret)) {\n return name + ':' + value;\n } else {\n return ret;\n }\n\n } else {\n\n var ret = onIgnoreAttr(name, value, opts);\n if (!isNull(ret)) {\n return ret;\n }\n\n }\n });\n\n return retCSS;\n};\n\n\nmodule.exports = FilterCSS;\n\n},{\"./default\":7,\"./parser\":9,\"./util\":10}],7:[function(require,module,exports){\n/**\n * cssfilter\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nfunction getDefaultWhiteList () {\n // 白名单值说明:\n // true: 允许该属性\n // Function: function (val) { } 返回true表示允许该属性,其他值均表示不允许\n // RegExp: regexp.test(val) 返回true表示允许该属性,其他值均表示不允许\n // 除上面列出的值外均表示不允许\n var whiteList = {};\n\n whiteList['align-content'] = false; // default: auto\n whiteList['align-items'] = false; // default: auto\n whiteList['align-self'] = false; // default: auto\n whiteList['alignment-adjust'] = false; // default: auto\n whiteList['alignment-baseline'] = false; // default: baseline\n whiteList['all'] = false; // default: depending on individual properties\n whiteList['anchor-point'] = false; // default: none\n whiteList['animation'] = false; // default: depending on individual properties\n whiteList['animation-delay'] = false; // default: 0\n whiteList['animation-direction'] = false; // default: normal\n whiteList['animation-duration'] = false; // default: 0\n whiteList['animation-fill-mode'] = false; // default: none\n whiteList['animation-iteration-count'] = false; // default: 1\n whiteList['animation-name'] = false; // default: none\n whiteList['animation-play-state'] = false; // default: running\n whiteList['animation-timing-function'] = false; // default: ease\n whiteList['azimuth'] = false; // default: center\n whiteList['backface-visibility'] = false; // default: visible\n whiteList['background'] = true; // default: depending on individual properties\n whiteList['background-attachment'] = true; // default: scroll\n whiteList['background-clip'] = true; // default: border-box\n whiteList['background-color'] = true; // default: transparent\n whiteList['background-image'] = true; // default: none\n whiteList['background-origin'] = true; // default: padding-box\n whiteList['background-position'] = true; // default: 0% 0%\n whiteList['background-repeat'] = true; // default: repeat\n whiteList['background-size'] = true; // default: auto\n whiteList['baseline-shift'] = false; // default: baseline\n whiteList['binding'] = false; // default: none\n whiteList['bleed'] = false; // default: 6pt\n whiteList['bookmark-label'] = false; // default: content()\n whiteList['bookmark-level'] = false; // default: none\n whiteList['bookmark-state'] = false; // default: open\n whiteList['border'] = true; // default: depending on individual properties\n whiteList['border-bottom'] = true; // default: depending on individual properties\n whiteList['border-bottom-color'] = true; // default: current color\n whiteList['border-bottom-left-radius'] = true; // default: 0\n whiteList['border-bottom-right-radius'] = true; // default: 0\n whiteList['border-bottom-style'] = true; // default: none\n whiteList['border-bottom-width'] = true; // default: medium\n whiteList['border-collapse'] = true; // default: separate\n whiteList['border-color'] = true; // default: depending on individual properties\n whiteList['border-image'] = true; // default: none\n whiteList['border-image-outset'] = true; // default: 0\n whiteList['border-image-repeat'] = true; // default: stretch\n whiteList['border-image-slice'] = true; // default: 100%\n whiteList['border-image-source'] = true; // default: none\n whiteList['border-image-width'] = true; // default: 1\n whiteList['border-left'] = true; // default: depending on individual properties\n whiteList['border-left-color'] = true; // default: current color\n whiteList['border-left-style'] = true; // default: none\n whiteList['border-left-width'] = true; // default: medium\n whiteList['border-radius'] = true; // default: 0\n whiteList['border-right'] = true; // default: depending on individual properties\n whiteList['border-right-color'] = true; // default: current color\n whiteList['border-right-style'] = true; // default: none\n whiteList['border-right-width'] = true; // default: medium\n whiteList['border-spacing'] = true; // default: 0\n whiteList['border-style'] = true; // default: depending on individual properties\n whiteList['border-top'] = true; // default: depending on individual properties\n whiteList['border-top-color'] = true; // default: current color\n whiteList['border-top-left-radius'] = true; // default: 0\n whiteList['border-top-right-radius'] = true; // default: 0\n whiteList['border-top-style'] = true; // default: none\n whiteList['border-top-width'] = true; // default: medium\n whiteList['border-width'] = true; // default: depending on individual properties\n whiteList['bottom'] = false; // default: auto\n whiteList['box-decoration-break'] = true; // default: slice\n whiteList['box-shadow'] = true; // default: none\n whiteList['box-sizing'] = true; // default: content-box\n whiteList['box-snap'] = true; // default: none\n whiteList['box-suppress'] = true; // default: show\n whiteList['break-after'] = true; // default: auto\n whiteList['break-before'] = true; // default: auto\n whiteList['break-inside'] = true; // default: auto\n whiteList['caption-side'] = false; // default: top\n whiteList['chains'] = false; // default: none\n whiteList['clear'] = true; // default: none\n whiteList['clip'] = false; // default: auto\n whiteList['clip-path'] = false; // default: none\n whiteList['clip-rule'] = false; // default: nonzero\n whiteList['color'] = true; // default: implementation dependent\n whiteList['color-interpolation-filters'] = true; // default: auto\n whiteList['column-count'] = false; // default: auto\n whiteList['column-fill'] = false; // default: balance\n whiteList['column-gap'] = false; // default: normal\n whiteList['column-rule'] = false; // default: depending on individual properties\n whiteList['column-rule-color'] = false; // default: current color\n whiteList['column-rule-style'] = false; // default: medium\n whiteList['column-rule-width'] = false; // default: medium\n whiteList['column-span'] = false; // default: none\n whiteList['column-width'] = false; // default: auto\n whiteList['columns'] = false; // default: depending on individual properties\n whiteList['contain'] = false; // default: none\n whiteList['content'] = false; // default: normal\n whiteList['counter-increment'] = false; // default: none\n whiteList['counter-reset'] = false; // default: none\n whiteList['counter-set'] = false; // default: none\n whiteList['crop'] = false; // default: auto\n whiteList['cue'] = false; // default: depending on individual properties\n whiteList['cue-after'] = false; // default: none\n whiteList['cue-before'] = false; // default: none\n whiteList['cursor'] = false; // default: auto\n whiteList['direction'] = false; // default: ltr\n whiteList['display'] = true; // default: depending on individual properties\n whiteList['display-inside'] = true; // default: auto\n whiteList['display-list'] = true; // default: none\n whiteList['display-outside'] = true; // default: inline-level\n whiteList['dominant-baseline'] = false; // default: auto\n whiteList['elevation'] = false; // default: level\n whiteList['empty-cells'] = false; // default: show\n whiteList['filter'] = false; // default: none\n whiteList['flex'] = false; // default: depending on individual properties\n whiteList['flex-basis'] = false; // default: auto\n whiteList['flex-direction'] = false; // default: row\n whiteList['flex-flow'] = false; // default: depending on individual properties\n whiteList['flex-grow'] = false; // default: 0\n whiteList['flex-shrink'] = false; // default: 1\n whiteList['flex-wrap'] = false; // default: nowrap\n whiteList['float'] = false; // default: none\n whiteList['float-offset'] = false; // default: 0 0\n whiteList['flood-color'] = false; // default: black\n whiteList['flood-opacity'] = false; // default: 1\n whiteList['flow-from'] = false; // default: none\n whiteList['flow-into'] = false; // default: none\n whiteList['font'] = true; // default: depending on individual properties\n whiteList['font-family'] = true; // default: implementation dependent\n whiteList['font-feature-settings'] = true; // default: normal\n whiteList['font-kerning'] = true; // default: auto\n whiteList['font-language-override'] = true; // default: normal\n whiteList['font-size'] = true; // default: medium\n whiteList['font-size-adjust'] = true; // default: none\n whiteList['font-stretch'] = true; // default: normal\n whiteList['font-style'] = true; // default: normal\n whiteList['font-synthesis'] = true; // default: weight style\n whiteList['font-variant'] = true; // default: normal\n whiteList['font-variant-alternates'] = true; // default: normal\n whiteList['font-variant-caps'] = true; // default: normal\n whiteList['font-variant-east-asian'] = true; // default: normal\n whiteList['font-variant-ligatures'] = true; // default: normal\n whiteList['font-variant-numeric'] = true; // default: normal\n whiteList['font-variant-position'] = true; // default: normal\n whiteList['font-weight'] = true; // default: normal\n whiteList['grid'] = false; // default: depending on individual properties\n whiteList['grid-area'] = false; // default: depending on individual properties\n whiteList['grid-auto-columns'] = false; // default: auto\n whiteList['grid-auto-flow'] = false; // default: none\n whiteList['grid-auto-rows'] = false; // default: auto\n whiteList['grid-column'] = false; // default: depending on individual properties\n whiteList['grid-column-end'] = false; // default: auto\n whiteList['grid-column-start'] = false; // default: auto\n whiteList['grid-row'] = false; // default: depending on individual properties\n whiteList['grid-row-end'] = false; // default: auto\n whiteList['grid-row-start'] = false; // default: auto\n whiteList['grid-template'] = false; // default: depending on individual properties\n whiteList['grid-template-areas'] = false; // default: none\n whiteList['grid-template-columns'] = false; // default: none\n whiteList['grid-template-rows'] = false; // default: none\n whiteList['hanging-punctuation'] = false; // default: none\n whiteList['height'] = true; // default: auto\n whiteList['hyphens'] = false; // default: manual\n whiteList['icon'] = false; // default: auto\n whiteList['image-orientation'] = false; // default: auto\n whiteList['image-resolution'] = false; // default: normal\n whiteList['ime-mode'] = false; // default: auto\n whiteList['initial-letters'] = false; // default: normal\n whiteList['inline-box-align'] = false; // default: last\n whiteList['justify-content'] = false; // default: auto\n whiteList['justify-items'] = false; // default: auto\n whiteList['justify-self'] = false; // default: auto\n whiteList['left'] = false; // default: auto\n whiteList['letter-spacing'] = true; // default: normal\n whiteList['lighting-color'] = true; // default: white\n whiteList['line-box-contain'] = false; // default: block inline replaced\n whiteList['line-break'] = false; // default: auto\n whiteList['line-grid'] = false; // default: match-parent\n whiteList['line-height'] = false; // default: normal\n whiteList['line-snap'] = false; // default: none\n whiteList['line-stacking'] = false; // default: depending on individual properties\n whiteList['line-stacking-ruby'] = false; // default: exclude-ruby\n whiteList['line-stacking-shift'] = false; // default: consider-shifts\n whiteList['line-stacking-strategy'] = false; // default: inline-line-height\n whiteList['list-style'] = true; // default: depending on individual properties\n whiteList['list-style-image'] = true; // default: none\n whiteList['list-style-position'] = true; // default: outside\n whiteList['list-style-type'] = true; // default: disc\n whiteList['margin'] = true; // default: depending on individual properties\n whiteList['margin-bottom'] = true; // default: 0\n whiteList['margin-left'] = true; // default: 0\n whiteList['margin-right'] = true; // default: 0\n whiteList['margin-top'] = true; // default: 0\n whiteList['marker-offset'] = false; // default: auto\n whiteList['marker-side'] = false; // default: list-item\n whiteList['marks'] = false; // default: none\n whiteList['mask'] = false; // default: border-box\n whiteList['mask-box'] = false; // default: see individual properties\n whiteList['mask-box-outset'] = false; // default: 0\n whiteList['mask-box-repeat'] = false; // default: stretch\n whiteList['mask-box-slice'] = false; // default: 0 fill\n whiteList['mask-box-source'] = false; // default: none\n whiteList['mask-box-width'] = false; // default: auto\n whiteList['mask-clip'] = false; // default: border-box\n whiteList['mask-image'] = false; // default: none\n whiteList['mask-origin'] = false; // default: border-box\n whiteList['mask-position'] = false; // default: center\n whiteList['mask-repeat'] = false; // default: no-repeat\n whiteList['mask-size'] = false; // default: border-box\n whiteList['mask-source-type'] = false; // default: auto\n whiteList['mask-type'] = false; // default: luminance\n whiteList['max-height'] = true; // default: none\n whiteList['max-lines'] = false; // default: none\n whiteList['max-width'] = true; // default: none\n whiteList['min-height'] = true; // default: 0\n whiteList['min-width'] = true; // default: 0\n whiteList['move-to'] = false; // default: normal\n whiteList['nav-down'] = false; // default: auto\n whiteList['nav-index'] = false; // default: auto\n whiteList['nav-left'] = false; // default: auto\n whiteList['nav-right'] = false; // default: auto\n whiteList['nav-up'] = false; // default: auto\n whiteList['object-fit'] = false; // default: fill\n whiteList['object-position'] = false; // default: 50% 50%\n whiteList['opacity'] = false; // default: 1\n whiteList['order'] = false; // default: 0\n whiteList['orphans'] = false; // default: 2\n whiteList['outline'] = false; // default: depending on individual properties\n whiteList['outline-color'] = false; // default: invert\n whiteList['outline-offset'] = false; // default: 0\n whiteList['outline-style'] = false; // default: none\n whiteList['outline-width'] = false; // default: medium\n whiteList['overflow'] = false; // default: depending on individual properties\n whiteList['overflow-wrap'] = false; // default: normal\n whiteList['overflow-x'] = false; // default: visible\n whiteList['overflow-y'] = false; // default: visible\n whiteList['padding'] = true; // default: depending on individual properties\n whiteList['padding-bottom'] = true; // default: 0\n whiteList['padding-left'] = true; // default: 0\n whiteList['padding-right'] = true; // default: 0\n whiteList['padding-top'] = true; // default: 0\n whiteList['page'] = false; // default: auto\n whiteList['page-break-after'] = false; // default: auto\n whiteList['page-break-before'] = false; // default: auto\n whiteList['page-break-inside'] = false; // default: auto\n whiteList['page-policy'] = false; // default: start\n whiteList['pause'] = false; // default: implementation dependent\n whiteList['pause-after'] = false; // default: implementation dependent\n whiteList['pause-before'] = false; // default: implementation dependent\n whiteList['perspective'] = false; // default: none\n whiteList['perspective-origin'] = false; // default: 50% 50%\n whiteList['pitch'] = false; // default: medium\n whiteList['pitch-range'] = false; // default: 50\n whiteList['play-during'] = false; // default: auto\n whiteList['position'] = false; // default: static\n whiteList['presentation-level'] = false; // default: 0\n whiteList['quotes'] = false; // default: text\n whiteList['region-fragment'] = false; // default: auto\n whiteList['resize'] = false; // default: none\n whiteList['rest'] = false; // default: depending on individual properties\n whiteList['rest-after'] = false; // default: none\n whiteList['rest-before'] = false; // default: none\n whiteList['richness'] = false; // default: 50\n whiteList['right'] = false; // default: auto\n whiteList['rotation'] = false; // default: 0\n whiteList['rotation-point'] = false; // default: 50% 50%\n whiteList['ruby-align'] = false; // default: auto\n whiteList['ruby-merge'] = false; // default: separate\n whiteList['ruby-position'] = false; // default: before\n whiteList['shape-image-threshold'] = false; // default: 0.0\n whiteList['shape-outside'] = false; // default: none\n whiteList['shape-margin'] = false; // default: 0\n whiteList['size'] = false; // default: auto\n whiteList['speak'] = false; // default: auto\n whiteList['speak-as'] = false; // default: normal\n whiteList['speak-header'] = false; // default: once\n whiteList['speak-numeral'] = false; // default: continuous\n whiteList['speak-punctuation'] = false; // default: none\n whiteList['speech-rate'] = false; // default: medium\n whiteList['stress'] = false; // default: 50\n whiteList['string-set'] = false; // default: none\n whiteList['tab-size'] = false; // default: 8\n whiteList['table-layout'] = false; // default: auto\n whiteList['text-align'] = true; // default: start\n whiteList['text-align-last'] = true; // default: auto\n whiteList['text-combine-upright'] = true; // default: none\n whiteList['text-decoration'] = true; // default: none\n whiteList['text-decoration-color'] = true; // default: currentColor\n whiteList['text-decoration-line'] = true; // default: none\n whiteList['text-decoration-skip'] = true; // default: objects\n whiteList['text-decoration-style'] = true; // default: solid\n whiteList['text-emphasis'] = true; // default: depending on individual properties\n whiteList['text-emphasis-color'] = true; // default: currentColor\n whiteList['text-emphasis-position'] = true; // default: over right\n whiteList['text-emphasis-style'] = true; // default: none\n whiteList['text-height'] = true; // default: auto\n whiteList['text-indent'] = true; // default: 0\n whiteList['text-justify'] = true; // default: auto\n whiteList['text-orientation'] = true; // default: mixed\n whiteList['text-overflow'] = true; // default: clip\n whiteList['text-shadow'] = true; // default: none\n whiteList['text-space-collapse'] = true; // default: collapse\n whiteList['text-transform'] = true; // default: none\n whiteList['text-underline-position'] = true; // default: auto\n whiteList['text-wrap'] = true; // default: normal\n whiteList['top'] = false; // default: auto\n whiteList['transform'] = false; // default: none\n whiteList['transform-origin'] = false; // default: 50% 50% 0\n whiteList['transform-style'] = false; // default: flat\n whiteList['transition'] = false; // default: depending on individual properties\n whiteList['transition-delay'] = false; // default: 0s\n whiteList['transition-duration'] = false; // default: 0s\n whiteList['transition-property'] = false; // default: all\n whiteList['transition-timing-function'] = false; // default: ease\n whiteList['unicode-bidi'] = false; // default: normal\n whiteList['vertical-align'] = false; // default: baseline\n whiteList['visibility'] = false; // default: visible\n whiteList['voice-balance'] = false; // default: center\n whiteList['voice-duration'] = false; // default: auto\n whiteList['voice-family'] = false; // default: implementation dependent\n whiteList['voice-pitch'] = false; // default: medium\n whiteList['voice-range'] = false; // default: medium\n whiteList['voice-rate'] = false; // default: normal\n whiteList['voice-stress'] = false; // default: normal\n whiteList['voice-volume'] = false; // default: medium\n whiteList['volume'] = false; // default: medium\n whiteList['white-space'] = false; // default: normal\n whiteList['widows'] = false; // default: 2\n whiteList['width'] = true; // default: auto\n whiteList['will-change'] = false; // default: auto\n whiteList['word-break'] = true; // default: normal\n whiteList['word-spacing'] = true; // default: normal\n whiteList['word-wrap'] = true; // default: normal\n whiteList['wrap-flow'] = false; // default: auto\n whiteList['wrap-through'] = false; // default: wrap\n whiteList['writing-mode'] = false; // default: horizontal-tb\n whiteList['z-index'] = false; // default: auto\n\n return whiteList;\n}\n\n\n/**\n * 匹配到白名单上的一个属性时\n *\n * @param {String} name\n * @param {String} value\n * @param {Object} options\n * @return {String}\n */\nfunction onAttr (name, value, options) {\n // do nothing\n}\n\n/**\n * 匹配到不在白名单上的一个属性时\n *\n * @param {String} name\n * @param {String} value\n * @param {Object} options\n * @return {String}\n */\nfunction onIgnoreAttr (name, value, options) {\n // do nothing\n}\n\n\nexports.whiteList = getDefaultWhiteList();\nexports.getDefaultWhiteList = getDefaultWhiteList;\nexports.onAttr = onAttr;\nexports.onIgnoreAttr = onIgnoreAttr;\n\n},{}],8:[function(require,module,exports){\n/**\n * cssfilter\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar DEFAULT = require('./default');\nvar FilterCSS = require('./css');\n\n\n/**\n * XSS过滤\n *\n * @param {String} css 要过滤的CSS代码\n * @param {Object} options 选项:whiteList, onAttr, onIgnoreAttr\n * @return {String}\n */\nfunction filterCSS (html, options) {\n var xss = new FilterCSS(options);\n return xss.process(html);\n}\n\n\n// 输出\nexports = module.exports = filterCSS;\nexports.FilterCSS = FilterCSS;\nfor (var i in DEFAULT) exports[i] = DEFAULT[i];\n\n// 在浏览器端使用\nif (typeof window !== 'undefined') {\n window.filterCSS = module.exports;\n}\n\n},{\"./css\":6,\"./default\":7}],9:[function(require,module,exports){\n/**\n * cssfilter\n *\n * @author 老雷\u003cleizongmin@gmail.com\u003e\n */\n\nvar _ = require('./util');\n\n\n/**\n * 解析style\n *\n * @param {String} css\n * @param {Function} onAttr 处理属性的函数\n * 参数格式: function (sourcePosition, position, name, value, source)\n * @return {String}\n */\nfunction parseStyle (css, onAttr) {\n css = _.trimRight(css);\n if (css[css.length - 1] !== ';') css += ';';\n var cssLength = css.length;\n var isParenthesisOpen = false;\n var lastPos = 0;\n var i = 0;\n var retCSS = '';\n\n function addNewAttr () {\n // 如果没有正常的闭合圆括号,则直接忽略当前属性\n if (!isParenthesisOpen) {\n var source = _.trim(css.slice(lastPos, i));\n var j = source.indexOf(':');\n if (j !== -1) {\n var name = _.trim(source.slice(0, j));\n var value = _.trim(source.slice(j + 1));\n // 必须有属性名称\n if (name) {\n var ret = onAttr(lastPos, retCSS.length, name, value, source);\n if (ret) retCSS += ret + '; ';\n }\n }\n }\n lastPos = i + 1;\n }\n\n for (; i \u003c cssLength; i++) {\n var c = css[i];\n if (c === '/' \u0026\u0026 css[i + 1] === '*') {\n // 备注开始\n var j = css.indexOf('*/', i + 2);\n // 如果没有正常的备注结束,则后面的部分全部跳过\n if (j === -1) break;\n // 直接将当前位置调到备注结尾,并且初始化状态\n i = j + 1;\n lastPos = i + 1;\n isParenthesisOpen = false;\n } else if (c === '(') {\n isParenthesisOpen = true;\n } else if (c === ')') {\n isParenthesisOpen = false;\n } else if (c === ';') {\n if (isParenthesisOpen) {\n // 在圆括号里面,忽略\n } else {\n addNewAttr();\n }\n } else if (c === '\\n') {\n addNewAttr();\n }\n }\n\n return _.trim(retCSS);\n}\n\nmodule.exports = parseStyle;\n\n},{\"./util\":10}],10:[function(require,module,exports){\nmodule.exports = {\n indexOf: function (arr, item) {\n var i, j;\n if (Array.prototype.indexOf) {\n return arr.indexOf(item);\n }\n for (i = 0, j = arr.length; i \u003c j; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n return -1;\n },\n forEach: function (arr, fn, scope) {\n var i, j;\n if (Array.prototype.forEach) {\n return arr.forEach(fn, scope);\n }\n for (i = 0, j = arr.length; i \u003c j; i++) {\n fn.call(scope, arr[i], i, arr);\n }\n },\n trim: function (str) {\n if (String.prototype.trim) {\n return str.trim();\n }\n return str.replace(/(^\\s*)|(\\s*$)/g, '');\n },\n trimRight: function (str) {\n if (String.prototype.trimRight) {\n return str.trimRight();\n }\n return str.replace(/(\\s*$)/g, '');\n }\n};\n\n},{}]},{},[2]);\n/*\n global initializeLocalStorageRender, initializeBodyData,\n initializeAllTagEditButtons, initializeUserFollowButts,\n initializeCommentsPage,\n initializeRuntimeBanner,\n initializeCreditsPage,\n initializeOnboardingTaskCard,\n initScrolling, nextPage:writable,\n fetching:writable, done:writable, initializePaymentPointers,\n initializeBroadcast\n*/\n\nfunction callInitializers() {\n initializePaymentPointers();\n initializeCommentsPage();\n initializeCreditsPage();\n initializeOnboardingTaskCard();\n}\n\nfunction initializePage() {\n initializeLocalStorageRender();\n initializeBodyData();\n\n var waitingForDataLoad = setInterval(function wait() {\n if (document.body.getAttribute('data-loaded') === 'true') {\n clearInterval(waitingForDataLoad);\n if (document.body.getAttribute('data-user-status') === 'logged-in') {\n initializeBaseUserData();\n initializeAllTagEditButtons();\n }\n initializeBroadcast();\n initializeReadingListIcons();\n initializeBillboardVisibility();\n if (document.getElementById('sidebar-additional')) {\n document.getElementById('sidebar-additional').classList.add('showing');\n }\n }\n }, 1);\n\n callInitializers();\n\n nextPage = 0;\n fetching = false;\n done = false;\n setTimeout(function undone() {\n done = false;\n }, 300);\n if (!initScrolling.called) {\n initScrolling();\n }\n};\n(function (global, factory) {\n\ttypeof exports === 'object' \u0026\u0026 typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' \u0026\u0026 define.amd ? define(factory) :\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Honeybadger = factory());\n})(this, (function () { 'use strict';\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction getDefaultExportFromCjs (x) {\n\t\treturn x \u0026\u0026 x.__esModule \u0026\u0026 Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n\t}\n\n\tfunction getAugmentedNamespace(n) {\n\t var f = n.default;\n\t\tif (typeof f == \"function\") {\n\t\t\tvar a = function () {\n\t\t\t\treturn f.apply(this, arguments);\n\t\t\t};\n\t\t\ta.prototype = f.prototype;\n\t } else a = {};\n\t Object.defineProperty(a, '__esModule', {value: true});\n\t\tObject.keys(n).forEach(function (k) {\n\t\t\tvar d = Object.getOwnPropertyDescriptor(n, k);\n\t\t\tObject.defineProperty(a, k, d.get ? d : {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn n[k];\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn a;\n\t}\n\n\tvar browser$1 = {};\n\n\tvar src = {};\n\n\tvar client = {};\n\n\tvar util$1 = {};\n\n\tvar UNKNOWN_FUNCTION = '\u003cunknown\u003e';\n\t/**\n\t * This parses the different stack traces and puts them into one format\n\t * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit)\n\t */\n\n\tfunction parse(stackString) {\n\t var lines = stackString.split('\\n');\n\t return lines.reduce(function (stack, line) {\n\t var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);\n\n\t if (parseResult) {\n\t stack.push(parseResult);\n\t }\n\n\t return stack;\n\t }, []);\n\t}\n\tvar chromeRe = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|\u003canonymous\u003e|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\tvar chromeEvalRe = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n\tfunction parseChrome(line) {\n\t var parts = chromeRe.exec(line);\n\n\t if (!parts) {\n\t return null;\n\t }\n\n\t var isNative = parts[2] \u0026\u0026 parts[2].indexOf('native') === 0; // start of line\n\n\t var isEval = parts[2] \u0026\u0026 parts[2].indexOf('eval') === 0; // start of line\n\n\t var submatch = chromeEvalRe.exec(parts[2]);\n\n\t if (isEval \u0026\u0026 submatch != null) {\n\t // throw out eval line/column and use top-most line/column number\n\t parts[2] = submatch[1]; // url\n\n\t parts[3] = submatch[2]; // line\n\n\t parts[4] = submatch[3]; // column\n\t }\n\n\t return {\n\t file: !isNative ? parts[2] : null,\n\t methodName: parts[1] || UNKNOWN_FUNCTION,\n\t arguments: isNative ? [parts[2]] : [],\n\t lineNumber: parts[3] ? +parts[3] : null,\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t}\n\n\tvar winjsRe = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\n\tfunction parseWinjs(line) {\n\t var parts = winjsRe.exec(line);\n\n\t if (!parts) {\n\t return null;\n\t }\n\n\t return {\n\t file: parts[2],\n\t methodName: parts[1] || UNKNOWN_FUNCTION,\n\t arguments: [],\n\t lineNumber: +parts[3],\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t}\n\n\tvar geckoRe = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n\tvar geckoEvalRe = /(\\S+) line (\\d+)(?: \u003e eval line \\d+)* \u003e eval/i;\n\n\tfunction parseGecko(line) {\n\t var parts = geckoRe.exec(line);\n\n\t if (!parts) {\n\t return null;\n\t }\n\n\t var isEval = parts[3] \u0026\u0026 parts[3].indexOf(' \u003e eval') \u003e -1;\n\t var submatch = geckoEvalRe.exec(parts[3]);\n\n\t if (isEval \u0026\u0026 submatch != null) {\n\t // throw out eval line/column and use top-most line number\n\t parts[3] = submatch[1];\n\t parts[4] = submatch[2];\n\t parts[5] = null; // no column when eval\n\t }\n\n\t return {\n\t file: parts[3],\n\t methodName: parts[1] || UNKNOWN_FUNCTION,\n\t arguments: parts[2] ? parts[2].split(',') : [],\n\t lineNumber: parts[4] ? +parts[4] : null,\n\t column: parts[5] ? +parts[5] : null\n\t };\n\t}\n\n\tvar javaScriptCoreRe = /^\\s*(?:([^@]*)(?:\\((.*?)\\))?@)?(\\S.*?):(\\d+)(?::(\\d+))?\\s*$/i;\n\n\tfunction parseJSC(line) {\n\t var parts = javaScriptCoreRe.exec(line);\n\n\t if (!parts) {\n\t return null;\n\t }\n\n\t return {\n\t file: parts[3],\n\t methodName: parts[1] || UNKNOWN_FUNCTION,\n\t arguments: [],\n\t lineNumber: +parts[4],\n\t column: parts[5] ? +parts[5] : null\n\t };\n\t}\n\n\tvar nodeRe = /^\\s*at (?:((?:\\[object object\\])?[^\\\\/]+(?: \\[as \\S+\\])?) )?\\(?(.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\n\tfunction parseNode(line) {\n\t var parts = nodeRe.exec(line);\n\n\t if (!parts) {\n\t return null;\n\t }\n\n\t return {\n\t file: parts[2],\n\t methodName: parts[1] || UNKNOWN_FUNCTION,\n\t arguments: [],\n\t lineNumber: +parts[3],\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t}\n\n\tvar stackTraceParser_esm = /*#__PURE__*/Object.freeze({\n\t\t__proto__: null,\n\t\tparse: parse\n\t});\n\n\tvar require$$0 = /*@__PURE__*/getAugmentedNamespace(stackTraceParser_esm);\n\n\t(function (exports) {\n\t\tvar __createBinding = (commonjsGlobal \u0026\u0026 commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n\t\t if (k2 === undefined) k2 = k;\n\t\t var desc = Object.getOwnPropertyDescriptor(m, k);\n\t\t if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n\t\t desc = { enumerable: true, get: function() { return m[k]; } };\n\t\t }\n\t\t Object.defineProperty(o, k2, desc);\n\t\t}) : (function(o, m, k, k2) {\n\t\t if (k2 === undefined) k2 = k;\n\t\t o[k2] = m[k];\n\t\t}));\n\t\tvar __setModuleDefault = (commonjsGlobal \u0026\u0026 commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {\n\t\t Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n\t\t}) : function(o, v) {\n\t\t o[\"default\"] = v;\n\t\t});\n\t\tvar __importStar = (commonjsGlobal \u0026\u0026 commonjsGlobal.__importStar) || function (mod) {\n\t\t if (mod \u0026\u0026 mod.__esModule) return mod;\n\t\t var result = {};\n\t\t if (mod != null) for (var k in mod) if (k !== \"default\" \u0026\u0026 Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n\t\t __setModuleDefault(result, mod);\n\t\t return result;\n\t\t};\n\t\tvar __awaiter = (commonjsGlobal \u0026\u0026 commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {\n\t\t function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n\t\t return new (P || (P = Promise))(function (resolve, reject) {\n\t\t function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n\t\t function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n\t\t function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n\t\t step((generator = generator.apply(thisArg, _arguments || [])).next());\n\t\t });\n\t\t};\n\t\tvar __generator = (commonjsGlobal \u0026\u0026 commonjsGlobal.__generator) || function (thisArg, body) {\n\t\t var _ = { label: 0, sent: function() { if (t[0] \u0026 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n\t\t return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" \u0026\u0026 (g[Symbol.iterator] = function() { return this; }), g;\n\t\t function verb(n) { return function (v) { return step([n, v]); }; }\n\t\t function step(op) {\n\t\t if (f) throw new TypeError(\"Generator is already executing.\");\n\t\t while (_) try {\n\t\t if (f = 1, y \u0026\u0026 (t = op[0] \u0026 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) \u0026\u0026 t.call(y), 0) : y.next) \u0026\u0026 !(t = t.call(y, op[1])).done) return t;\n\t\t if (y = 0, t) op = [op[0] \u0026 2, t.value];\n\t\t switch (op[0]) {\n\t\t case 0: case 1: t = op; break;\n\t\t case 4: _.label++; return { value: op[1], done: false };\n\t\t case 5: _.label++; y = op[1]; op = [0]; continue;\n\t\t case 7: op = _.ops.pop(); _.trys.pop(); continue;\n\t\t default:\n\t\t if (!(t = _.trys, t = t.length \u003e 0 \u0026\u0026 t[t.length - 1]) \u0026\u0026 (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n\t\t if (op[0] === 3 \u0026\u0026 (!t || (op[1] \u003e t[0] \u0026\u0026 op[1] \u003c t[3]))) { _.label = op[1]; break; }\n\t\t if (op[0] === 6 \u0026\u0026 _.label \u003c t[1]) { _.label = t[1]; t = op; break; }\n\t\t if (t \u0026\u0026 _.label \u003c t[2]) { _.label = t[2]; _.ops.push(op); break; }\n\t\t if (t[2]) _.ops.pop();\n\t\t _.trys.pop(); continue;\n\t\t }\n\t\t op = body.call(thisArg, _);\n\t\t } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n\t\t if (op[0] \u0026 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n\t\t }\n\t\t};\n\t\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t\texports.isBrowserConfig = exports.clone = exports.formatCGIData = exports.filterUrl = exports.filter = exports.generateStackTrace = exports.endpoint = exports.instrument = exports.isErrorObject = exports.makeNotice = exports.logger = exports.sanitize = exports.shallowClone = exports.runAfterNotifyHandlers = exports.runBeforeNotifyHandlers = exports.getSourceForBacktrace = exports.getCauses = exports.calculateBacktraceShift = exports.DEFAULT_BACKTRACE_SHIFT = exports.makeBacktrace = exports.objectIsExtensible = exports.objectIsEmpty = exports.mergeNotice = exports.merge = void 0;\n\t\tvar stackTraceParser = __importStar(require$$0);\n\t\tfunction merge(obj1, obj2) {\n\t\t var result = {};\n\t\t for (var k in obj1) {\n\t\t result[k] = obj1[k];\n\t\t }\n\t\t for (var k in obj2) {\n\t\t result[k] = obj2[k];\n\t\t }\n\t\t return result;\n\t\t}\n\t\texports.merge = merge;\n\t\tfunction mergeNotice(notice1, notice2) {\n\t\t var result = merge(notice1, notice2);\n\t\t if (notice1.context \u0026\u0026 notice2.context) {\n\t\t result.context = merge(notice1.context, notice2.context);\n\t\t }\n\t\t return result;\n\t\t}\n\t\texports.mergeNotice = mergeNotice;\n\t\tfunction objectIsEmpty(obj) {\n\t\t for (var k in obj) {\n\t\t if (Object.prototype.hasOwnProperty.call(obj, k)) {\n\t\t return false;\n\t\t }\n\t\t }\n\t\t return true;\n\t\t}\n\t\texports.objectIsEmpty = objectIsEmpty;\n\t\tfunction objectIsExtensible(obj) {\n\t\t if (typeof Object.isExtensible !== 'function') {\n\t\t return true;\n\t\t }\n\t\t return Object.isExtensible(obj);\n\t\t}\n\t\texports.objectIsExtensible = objectIsExtensible;\n\t\tfunction makeBacktrace(stack, filterHbSourceCode, logger) {\n\t\t if (filterHbSourceCode === void 0) { filterHbSourceCode = false; }\n\t\t if (logger === void 0) { logger = console; }\n\t\t try {\n\t\t var backtrace = stackTraceParser\n\t\t .parse(stack)\n\t\t .map(function (line) {\n\t\t return {\n\t\t file: line.file,\n\t\t method: line.methodName,\n\t\t number: line.lineNumber,\n\t\t column: line.column\n\t\t };\n\t\t });\n\t\t if (filterHbSourceCode) {\n\t\t backtrace.splice(0, calculateBacktraceShift(backtrace));\n\t\t }\n\t\t return backtrace;\n\t\t }\n\t\t catch (err) {\n\t\t logger.debug(err);\n\t\t return [];\n\t\t }\n\t\t}\n\t\texports.makeBacktrace = makeBacktrace;\n\t\tfunction isFrameFromHbSourceCode(frame) {\n\t\t var hasHbFile = false;\n\t\t var hasHbMethod = false;\n\t\t if (frame.file) {\n\t\t hasHbFile = frame.file.toLowerCase().indexOf('@honeybadger-io') \u003e -1;\n\t\t }\n\t\t if (frame.method) {\n\t\t hasHbMethod = frame.method.toLowerCase().indexOf('@honeybadger-io') \u003e -1;\n\t\t }\n\t\t return hasHbFile || hasHbMethod;\n\t\t}\n\t\texports.DEFAULT_BACKTRACE_SHIFT = 3;\n\t\t/**\n\t\t * If {@link generateStackTrace} is used, we want to exclude frames that come from\n\t\t * Honeybadger's source code.\n\t\t *\n\t\t * Logic:\n\t\t * - For each frame, increment the shift if source code is from Honeybadger\n\t\t * - If a frame from an \u003canonymous\u003e file is encountered increment the shift ONLY if between Honeybadger source code\n\t\t * (i.e. previous and next frames are from Honeybadger)\n\t\t * - Exit when frame encountered is not from Honeybadger source code\n\t\t *\n\t\t * Note: this will not always work, especially in browser versions where code\n\t\t * is minified, uglified and bundled.\n\t\t * For those cases we default to 3:\n\t\t * - generateStackTrace\n\t\t * - makeNotice\n\t\t * - notify\n\t\t */\n\t\tfunction calculateBacktraceShift(backtrace) {\n\t\t var shift = 0;\n\t\t for (var i = 0; i \u003c backtrace.length; i++) {\n\t\t var frame = backtrace[i];\n\t\t if (isFrameFromHbSourceCode(frame)) {\n\t\t shift++;\n\t\t continue;\n\t\t }\n\t\t if (!frame.file || frame.file === '\u003canonymous\u003e') {\n\t\t var nextFrame = backtrace[i + 1];\n\t\t if (nextFrame \u0026\u0026 isFrameFromHbSourceCode(nextFrame)) {\n\t\t shift++;\n\t\t continue;\n\t\t }\n\t\t }\n\t\t break;\n\t\t }\n\t\t return shift || exports.DEFAULT_BACKTRACE_SHIFT;\n\t\t}\n\t\texports.calculateBacktraceShift = calculateBacktraceShift;\n\t\tfunction getCauses(notice, logger) {\n\t\t if (notice.cause) {\n\t\t var causes = [];\n\t\t var cause = notice;\n\t\t while (causes.length \u003c 3 \u0026\u0026 (cause = cause.cause)) {\n\t\t causes.push({\n\t\t class: cause.name,\n\t\t message: cause.message,\n\t\t backtrace: typeof cause.stack == 'string' ? makeBacktrace(cause.stack, false, logger) : null\n\t\t });\n\t\t }\n\t\t return causes;\n\t\t }\n\t\t return [];\n\t\t}\n\t\texports.getCauses = getCauses;\n\t\tfunction getSourceForBacktrace(backtrace, getSourceFileHandler) {\n\t\t return __awaiter(this, void 0, void 0, function () {\n\t\t var result, index, trace, fileContent;\n\t\t return __generator(this, function (_a) {\n\t\t switch (_a.label) {\n\t\t case 0:\n\t\t result = [];\n\t\t if (!getSourceFileHandler || !backtrace || !backtrace.length) {\n\t\t return [2 /*return*/, result];\n\t\t }\n\t\t index = 0;\n\t\t _a.label = 1;\n\t\t case 1:\n\t\t if (!backtrace.length) return [3 /*break*/, 3];\n\t\t trace = backtrace.splice(0)[index];\n\t\t return [4 /*yield*/, getSourceFileHandler(trace.file)];\n\t\t case 2:\n\t\t fileContent = _a.sent();\n\t\t result[index] = getSourceCodeSnippet(fileContent, trace.number);\n\t\t index++;\n\t\t return [3 /*break*/, 1];\n\t\t case 3: return [2 /*return*/, result];\n\t\t }\n\t\t });\n\t\t });\n\t\t}\n\t\texports.getSourceForBacktrace = getSourceForBacktrace;\n\t\tfunction runBeforeNotifyHandlers(notice, handlers) {\n\t\t var result = true;\n\t\t for (var i = 0, len = handlers.length; i \u003c len; i++) {\n\t\t var handler = handlers[i];\n\t\t if (handler(notice) === false) {\n\t\t result = false;\n\t\t }\n\t\t }\n\t\t return result;\n\t\t}\n\t\texports.runBeforeNotifyHandlers = runBeforeNotifyHandlers;\n\t\tfunction runAfterNotifyHandlers(notice, handlers, error) {\n\t\t if (notice \u0026\u0026 notice.afterNotify) {\n\t\t notice.afterNotify(error, notice);\n\t\t }\n\t\t for (var i = 0, len = handlers.length; i \u003c len; i++) {\n\t\t handlers[i](error, notice);\n\t\t }\n\t\t return true;\n\t\t}\n\t\texports.runAfterNotifyHandlers = runAfterNotifyHandlers;\n\t\t// Returns a new object with properties from other object.\n\t\tfunction shallowClone(obj) {\n\t\t if (typeof (obj) !== 'object' || obj === null) {\n\t\t return {};\n\t\t }\n\t\t var result = {};\n\t\t for (var k in obj) {\n\t\t result[k] = obj[k];\n\t\t }\n\t\t return result;\n\t\t}\n\t\texports.shallowClone = shallowClone;\n\t\tfunction sanitize(obj, maxDepth) {\n\t\t if (maxDepth === void 0) { maxDepth = 8; }\n\t\t var seenObjects = [];\n\t\t function seen(obj) {\n\t\t if (!obj || typeof (obj) !== 'object') {\n\t\t return false;\n\t\t }\n\t\t for (var i = 0; i \u003c seenObjects.length; i++) {\n\t\t var value = seenObjects[i];\n\t\t if (value === obj) {\n\t\t return true;\n\t\t }\n\t\t }\n\t\t seenObjects.push(obj);\n\t\t return false;\n\t\t }\n\t\t function canSerialize(obj) {\n\t\t var typeOfObj = typeof obj;\n\t\t // Functions are TMI\n\t\t if (/function/.test(typeOfObj)) {\n\t\t // Let special toJSON method pass as it's used by JSON.stringify (#722)\n\t\t return obj.name === 'toJSON';\n\t\t }\n\t\t // Symbols can't convert to strings.\n\t\t if (/symbol/.test(typeOfObj)) {\n\t\t return false;\n\t\t }\n\t\t if (obj === null) {\n\t\t return false;\n\t\t }\n\t\t // No prototype, likely created with `Object.create(null)`.\n\t\t if (typeof obj === 'object' \u0026\u0026 typeof obj.hasOwnProperty === 'undefined') {\n\t\t return false;\n\t\t }\n\t\t return true;\n\t\t }\n\t\t function serialize(obj, depth) {\n\t\t if (depth === void 0) { depth = 0; }\n\t\t if (depth \u003e= maxDepth) {\n\t\t return '[DEPTH]';\n\t\t }\n\t\t // Inspect invalid types\n\t\t if (!canSerialize(obj)) {\n\t\t return Object.prototype.toString.call(obj);\n\t\t }\n\t\t // Halt circular references\n\t\t if (seen(obj)) {\n\t\t return '[RECURSION]';\n\t\t }\n\t\t // Serialize inside arrays\n\t\t if (Array.isArray(obj)) {\n\t\t return obj.map(function (o) { return safeSerialize(o, depth + 1); });\n\t\t }\n\t\t // Serialize inside objects\n\t\t if (typeof (obj) === 'object') {\n\t\t var ret = {};\n\t\t for (var k in obj) {\n\t\t var v = obj[k];\n\t\t if (Object.prototype.hasOwnProperty.call(obj, k) \u0026\u0026 (k != null) \u0026\u0026 (v != null)) {\n\t\t ret[k] = safeSerialize(v, depth + 1);\n\t\t }\n\t\t }\n\t\t return ret;\n\t\t }\n\t\t // Return everything else untouched\n\t\t return obj;\n\t\t }\n\t\t function safeSerialize(obj, depth) {\n\t\t if (depth === void 0) { depth = 0; }\n\t\t try {\n\t\t return serialize(obj, depth);\n\t\t }\n\t\t catch (e) {\n\t\t return \"[ERROR] \".concat(e);\n\t\t }\n\t\t }\n\t\t return safeSerialize(obj);\n\t\t}\n\t\texports.sanitize = sanitize;\n\t\tfunction logger(client) {\n\t\t var log = function (method) {\n\t\t return function () {\n\t\t var _a;\n\t\t var args = [];\n\t\t for (var _i = 0; _i \u003c arguments.length; _i++) {\n\t\t args[_i] = arguments[_i];\n\t\t }\n\t\t if (method === 'debug') {\n\t\t if (!client.config.debug) {\n\t\t return;\n\t\t }\n\t\t // Log at default level so that you don't need to also enable verbose\n\t\t // logging in Chrome.\n\t\t method = 'log';\n\t\t }\n\t\t args.unshift('[Honeybadger]');\n\t\t (_a = client.config.logger)[method].apply(_a, args);\n\t\t };\n\t\t };\n\t\t return {\n\t\t log: log('log'),\n\t\t info: log('info'),\n\t\t debug: log('debug'),\n\t\t warn: log('warn'),\n\t\t error: log('error')\n\t\t };\n\t\t}\n\t\texports.logger = logger;\n\t\t/**\n\t\t * Converts any object into a notice object (which at minimum has the same\n\t\t * properties as Error, but supports additional Honeybadger properties.)\n\t\t */\n\t\tfunction makeNotice(thing) {\n\t\t var notice;\n\t\t if (!thing) {\n\t\t notice = {};\n\t\t }\n\t\t else if (isErrorObject(thing)) {\n\t\t var e = thing;\n\t\t notice = merge(thing, { name: e.name, message: e.message, stack: e.stack, cause: e.cause });\n\t\t }\n\t\t else if (typeof thing === 'object') {\n\t\t notice = shallowClone(thing);\n\t\t }\n\t\t else {\n\t\t var m = String(thing);\n\t\t notice = { message: m };\n\t\t }\n\t\t return notice;\n\t\t}\n\t\texports.makeNotice = makeNotice;\n\t\tfunction isErrorObject(thing) {\n\t\t return thing instanceof Error\n\t\t || Object.prototype.toString.call(thing) === '[object Error]'; // Important for cross-realm objects\n\t\t}\n\t\texports.isErrorObject = isErrorObject;\n\t\t/**\n\t\t * Instrument an existing function inside an object (usually global).\n\t\t * @param {!Object} object\n\t\t * @param {!String} name\n\t\t * @param {!Function} replacement\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tfunction instrument(object, name, replacement) {\n\t\t if (!object || !name || !replacement || !(name in object)) {\n\t\t return;\n\t\t }\n\t\t try {\n\t\t var original = object[name];\n\t\t while (original \u0026\u0026 original.__hb_original) {\n\t\t original = original.__hb_original;\n\t\t }\n\t\t object[name] = replacement(original);\n\t\t object[name].__hb_original = original;\n\t\t }\n\t\t catch (_e) {\n\t\t // Ignores errors where \"original\" is a restricted object (see #1001)\n\t\t // Uncaught Error: Permission denied to access property \"__hb_original\"\n\t\t // Also ignores:\n\t\t // Error: TypeError: Cannot set property onunhandledrejection of [object Object] which has only a getter\n\t\t // User-Agent: Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-G960F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/12.1 Chrome/79.0.3945.136 Mobile Safari/537.36\n\t\t }\n\t\t}\n\t\texports.instrument = instrument;\n\t\tfunction endpoint(base, path) {\n\t\t var endpoint = base.trim().replace(/\\/$/, '');\n\t\t path = path.trim().replace(/(^\\/|\\/$)/g, '');\n\t\t return \"\".concat(endpoint, \"/\").concat(path);\n\t\t}\n\t\texports.endpoint = endpoint;\n\t\tfunction generateStackTrace() {\n\t\t try {\n\t\t throw new Error('');\n\t\t }\n\t\t catch (e) {\n\t\t if (e.stack) {\n\t\t return e.stack;\n\t\t }\n\t\t }\n\t\t var maxStackSize = 10;\n\t\t var stack = [];\n\t\t var curr = arguments.callee;\n\t\t while (curr \u0026\u0026 stack.length \u003c maxStackSize) {\n\t\t if (/function(?:\\s+([\\w$]+))+\\s*\\(/.test(curr.toString())) {\n\t\t stack.push(RegExp.$1 || '\u003canonymous\u003e');\n\t\t }\n\t\t else {\n\t\t stack.push('\u003canonymous\u003e');\n\t\t }\n\t\t try {\n\t\t curr = curr.caller;\n\t\t }\n\t\t catch (e) {\n\t\t break;\n\t\t }\n\t\t }\n\t\t return stack.join('\\n');\n\t\t}\n\t\texports.generateStackTrace = generateStackTrace;\n\t\tfunction filter(obj, filters) {\n\t\t if (!is('Object', obj)) {\n\t\t return;\n\t\t }\n\t\t if (!is('Array', filters)) {\n\t\t filters = [];\n\t\t }\n\t\t var seen = [];\n\t\t function filter(obj) {\n\t\t var k, newObj;\n\t\t if (is('Object', obj) || is('Array', obj)) {\n\t\t if (seen.indexOf(obj) !== -1) {\n\t\t return '[CIRCULAR DATA STRUCTURE]';\n\t\t }\n\t\t seen.push(obj);\n\t\t }\n\t\t if (is('Object', obj)) {\n\t\t newObj = {};\n\t\t for (k in obj) {\n\t\t if (filterMatch(k, filters)) {\n\t\t newObj[k] = '[FILTERED]';\n\t\t }\n\t\t else {\n\t\t newObj[k] = filter(obj[k]);\n\t\t }\n\t\t }\n\t\t return newObj;\n\t\t }\n\t\t if (is('Array', obj)) {\n\t\t return obj.map(function (v) {\n\t\t return filter(v);\n\t\t });\n\t\t }\n\t\t if (is('Function', obj)) {\n\t\t return '[FUNC]';\n\t\t }\n\t\t return obj;\n\t\t }\n\t\t return filter(obj);\n\t\t}\n\t\texports.filter = filter;\n\t\tfunction filterMatch(key, filters) {\n\t\t for (var i = 0; i \u003c filters.length; i++) {\n\t\t if (key.toLowerCase().indexOf(filters[i].toLowerCase()) !== -1) {\n\t\t return true;\n\t\t }\n\t\t }\n\t\t return false;\n\t\t}\n\t\tfunction is(type, obj) {\n\t\t var klass = Object.prototype.toString.call(obj).slice(8, -1);\n\t\t return obj !== undefined \u0026\u0026 obj !== null \u0026\u0026 klass === type;\n\t\t}\n\t\tfunction filterUrl(url, filters) {\n\t\t if (!filters) {\n\t\t return url;\n\t\t }\n\t\t if (typeof url !== 'string') {\n\t\t return url;\n\t\t }\n\t\t var query = url.split(/\\?/, 2)[1];\n\t\t if (!query) {\n\t\t return url;\n\t\t }\n\t\t var result = url;\n\t\t query.split(/[\u0026]\\s?/).forEach(function (pair) {\n\t\t var _a = pair.split('=', 2), key = _a[0], value = _a[1];\n\t\t if (filterMatch(key, filters)) {\n\t\t result = result.replace(\"\".concat(key, \"=\").concat(value), \"\".concat(key, \"=[FILTERED]\"));\n\t\t }\n\t\t });\n\t\t return result;\n\t\t}\n\t\texports.filterUrl = filterUrl;\n\t\tfunction formatCGIData(vars, prefix) {\n\t\t if (prefix === void 0) { prefix = ''; }\n\t\t var formattedVars = {};\n\t\t Object.keys(vars).forEach(function (key) {\n\t\t var formattedKey = prefix + key.replace(/\\W/g, '_').toUpperCase();\n\t\t formattedVars[formattedKey] = vars[key];\n\t\t });\n\t\t return formattedVars;\n\t\t}\n\t\texports.formatCGIData = formatCGIData;\n\t\tfunction clone(obj) {\n\t\t return JSON.parse(JSON.stringify(obj));\n\t\t}\n\t\texports.clone = clone;\n\t\tfunction getSourceCodeSnippet(fileData, lineNumber, sourceRadius) {\n\t\t if (sourceRadius === void 0) { sourceRadius = 2; }\n\t\t if (!fileData) {\n\t\t return null;\n\t\t }\n\t\t var lines = fileData.split('\\n');\n\t\t // add one empty line because array index starts from 0, but error line number is counted from 1\n\t\t lines.unshift('');\n\t\t var start = lineNumber - sourceRadius;\n\t\t var end = lineNumber + sourceRadius;\n\t\t var result = {};\n\t\t for (var i = start; i \u003c= end; i++) {\n\t\t var line = lines[i];\n\t\t if (typeof line === 'string') {\n\t\t result[i] = line;\n\t\t }\n\t\t }\n\t\t return result;\n\t\t}\n\t\tfunction isBrowserConfig(config) {\n\t\t return config.async !== undefined;\n\t\t}\n\t\texports.isBrowserConfig = isBrowserConfig;\n\t\t\n\t} (util$1));\n\n\tvar store = {};\n\n\tObject.defineProperty(store, \"__esModule\", { value: true });\n\tstore.GlobalStore = void 0;\n\tvar util_1$7 = util$1;\n\tvar GlobalStore = /** @class */ (function () {\n\t function GlobalStore(contents, breadcrumbsLimit) {\n\t this.contents = contents;\n\t this.breadcrumbsLimit = breadcrumbsLimit;\n\t }\n\t GlobalStore.create = function (contents, breadcrumbsLimit) {\n\t return new GlobalStore(contents, breadcrumbsLimit);\n\t };\n\t GlobalStore.prototype.available = function () {\n\t return true;\n\t };\n\t GlobalStore.prototype.getContents = function (key) {\n\t var value = key ? this.contents[key] : this.contents;\n\t return JSON.parse(JSON.stringify(value));\n\t };\n\t GlobalStore.prototype.setContext = function (context) {\n\t this.contents.context = (0, util_1$7.merge)(this.contents.context, context || {});\n\t };\n\t GlobalStore.prototype.addBreadcrumb = function (breadcrumb) {\n\t if (this.contents.breadcrumbs.length == this.breadcrumbsLimit) {\n\t this.contents.breadcrumbs.shift();\n\t }\n\t this.contents.breadcrumbs.push(breadcrumb);\n\t };\n\t GlobalStore.prototype.clear = function () {\n\t this.contents.context = {};\n\t this.contents.breadcrumbs = [];\n\t };\n\t GlobalStore.prototype.run = function (callback) {\n\t return callback();\n\t };\n\t return GlobalStore;\n\t}());\n\tstore.GlobalStore = GlobalStore;\n\n\tvar __assign = (commonjsGlobal \u0026\u0026 commonjsGlobal.__assign) || function () {\n\t __assign = Object.assign || function(t) {\n\t for (var s, i = 1, n = arguments.length; i \u003c n; i++) {\n\t s = arguments[i];\n\t for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n\t t[p] = s[p];\n\t }\n\t return t;\n\t };\n\t return __assign.apply(this, arguments);\n\t};\n\tObject.defineProperty(client, \"__esModule\", { value: true });\n\tclient.Client = void 0;\n\tvar util_1$6 = util$1;\n\tvar store_1 = store;\n\tvar notifier = {\n\t name: 'honeybadger-js',\n\t url: 'https://github.com/honeybadger-io/honeybadger-js',\n\t version: '5.4.1'\n\t};\n\t// Split at commas and spaces\n\tvar TAG_SEPARATOR = /,|\\s+/;\n\t// Checks for non-blank characters\n\tvar NOT_BLANK = /\\S/;\n\tvar Client = /** @class */ (function () {\n\t function Client(opts, transport) {\n\t if (opts === void 0) { opts = {}; }\n\t this.__pluginsExecuted = false;\n\t this.__store = null;\n\t this.__beforeNotifyHandlers = [];\n\t this.__afterNotifyHandlers = [];\n\t this.config = __assign({ apiKey: null, endpoint: 'https://api.honeybadger.io', environment: null, hostname: null, projectRoot: null, component: null, action: null, revision: null, reportData: null, breadcrumbsEnabled: true, maxBreadcrumbs: 40, maxObjectDepth: 8, logger: console, developmentEnvironments: ['dev', 'development', 'test'], debug: false, tags: null, enableUncaught: true, enableUnhandledRejection: true, afterUncaught: function () { return true; }, filters: ['creditcard', 'password'], __plugins: [] }, opts);\n\t this.__initStore();\n\t this.__transport = transport;\n\t this.logger = (0, util_1$6.logger)(this);\n\t }\n\t Client.prototype.getVersion = function () {\n\t return notifier.version;\n\t };\n\t Client.prototype.configure = function (opts) {\n\t var _this = this;\n\t if (opts === void 0) { opts = {}; }\n\t for (var k in opts) {\n\t this.config[k] = opts[k];\n\t }\n\t if (!this.__pluginsExecuted) {\n\t this.__pluginsExecuted = true;\n\t this.config.__plugins.forEach(function (plugin) { return plugin.load(_this); });\n\t }\n\t return this;\n\t };\n\t Client.prototype.__initStore = function () {\n\t this.__store = new store_1.GlobalStore({ context: {}, breadcrumbs: [] }, this.config.maxBreadcrumbs);\n\t };\n\t Client.prototype.beforeNotify = function (handler) {\n\t this.__beforeNotifyHandlers.push(handler);\n\t return this;\n\t };\n\t Client.prototype.afterNotify = function (handler) {\n\t this.__afterNotifyHandlers.push(handler);\n\t return this;\n\t };\n\t Client.prototype.setContext = function (context) {\n\t if (typeof context === 'object' \u0026\u0026 context != null) {\n\t this.__store.setContext(context);\n\t }\n\t return this;\n\t };\n\t Client.prototype.resetContext = function (context) {\n\t this.logger.warn('Deprecation warning: `Honeybadger.resetContext()` has been deprecated; please use `Honeybadger.clear()` instead.');\n\t this.__store.clear();\n\t if (typeof context === 'object' \u0026\u0026 context !== null) {\n\t this.__store.setContext(context);\n\t }\n\t return this;\n\t };\n\t Client.prototype.clear = function () {\n\t this.__store.clear();\n\t return this;\n\t };\n\t Client.prototype.notify = function (noticeable, name, extra) {\n\t var _this = this;\n\t if (name === void 0) { name = undefined; }\n\t if (extra === void 0) { extra = undefined; }\n\t var preConditionError = null;\n\t var notice = this.makeNotice(noticeable, name, extra);\n\t if (!notice) {\n\t this.logger.debug('failed to build error report');\n\t preConditionError = new Error('failed to build error report');\n\t }\n\t if (!preConditionError \u0026\u0026 this.config.reportData === false) {\n\t this.logger.debug('skipping error report: honeybadger.js is disabled', notice);\n\t preConditionError = new Error('honeybadger.js is disabled');\n\t }\n\t if (!preConditionError \u0026\u0026 this.__developmentMode()) {\n\t this.logger.log('honeybadger.js is in development mode; the following error report will be sent in production.', notice);\n\t preConditionError = new Error('honeybadger.js is in development mode');\n\t }\n\t if (!preConditionError \u0026\u0026 !this.config.apiKey) {\n\t this.logger.warn('could not send error report: no API key has been configured', notice);\n\t preConditionError = new Error('missing API key');\n\t }\n\t // we need to have the source file data before the beforeNotifyHandlers,\n\t // in case they modify them\n\t var sourceCodeData = notice \u0026\u0026 notice.backtrace ? notice.backtrace.map(function (trace) { return (0, util_1$6.shallowClone)(trace); }) : null;\n\t var beforeNotifyResult = (0, util_1$6.runBeforeNotifyHandlers)(notice, this.__beforeNotifyHandlers);\n\t if (!preConditionError \u0026\u0026 !beforeNotifyResult) {\n\t this.logger.debug('skipping error report: beforeNotify handlers returned false', notice);\n\t preConditionError = new Error('beforeNotify handlers returned false');\n\t }\n\t if (preConditionError) {\n\t (0, util_1$6.runAfterNotifyHandlers)(notice, this.__afterNotifyHandlers, preConditionError);\n\t return false;\n\t }\n\t this.addBreadcrumb('Honeybadger Notice', {\n\t category: 'notice',\n\t metadata: {\n\t message: notice.message,\n\t name: notice.name,\n\t stack: notice.stack\n\t }\n\t });\n\t var breadcrumbs = this.__store.getContents('breadcrumbs');\n\t notice.__breadcrumbs = this.config.breadcrumbsEnabled ? breadcrumbs : [];\n\t (0, util_1$6.getSourceForBacktrace)(sourceCodeData, this.__getSourceFileHandler)\n\t .then(function (sourcePerTrace) {\n\t sourcePerTrace.forEach(function (source, index) {\n\t notice.backtrace[index].source = source;\n\t });\n\t var payload = _this.__buildPayload(notice);\n\t _this.__transport\n\t .send({\n\t headers: {\n\t 'X-API-Key': _this.config.apiKey,\n\t 'Content-Type': 'application/json',\n\t 'Accept': 'text/json, application/json'\n\t },\n\t method: 'POST',\n\t endpoint: (0, util_1$6.endpoint)(_this.config.endpoint, '/v1/notices/js'),\n\t maxObjectDepth: _this.config.maxObjectDepth,\n\t logger: _this.logger,\n\t }, payload)\n\t .then(function (res) {\n\t if (res.statusCode !== 201) {\n\t (0, util_1$6.runAfterNotifyHandlers)(notice, _this.__afterNotifyHandlers, new Error(\"Bad HTTP response: \".concat(res.statusCode)));\n\t _this.logger.warn(\"Error report failed: unknown response from server. code=\".concat(res.statusCode));\n\t return;\n\t }\n\t var uuid = JSON.parse(res.body).id;\n\t (0, util_1$6.runAfterNotifyHandlers)((0, util_1$6.merge)(notice, {\n\t id: uuid\n\t }), _this.__afterNotifyHandlers);\n\t _this.logger.info(\"Error report sent \\u26A1 https://app.honeybadger.io/notice/\".concat(uuid));\n\t })\n\t .catch(function (err) {\n\t _this.logger.error('Error report failed: an unknown error occurred.', \"message=\".concat(err.message));\n\t (0, util_1$6.runAfterNotifyHandlers)(notice, _this.__afterNotifyHandlers, err);\n\t });\n\t });\n\t return true;\n\t };\n\t /**\n\t * An async version of {@link notify} that resolves only after the notice has been reported to Honeybadger.\n\t * Implemented using the {@link afterNotify} hook.\n\t * Rejects if for any reason the report failed to be reported.\n\t * Useful in serverless environments (AWS Lambda).\n\t */\n\t Client.prototype.notifyAsync = function (noticeable, name, extra) {\n\t var _this = this;\n\t if (name === void 0) { name = undefined; }\n\t if (extra === void 0) { extra = undefined; }\n\t return new Promise(function (resolve, reject) {\n\t var applyAfterNotify = function (partialNotice) {\n\t var originalAfterNotify = partialNotice.afterNotify;\n\t partialNotice.afterNotify = function (err) {\n\t originalAfterNotify === null || originalAfterNotify === void 0 ? void 0 : originalAfterNotify.call(_this, err);\n\t if (err) {\n\t return reject(err);\n\t }\n\t resolve();\n\t };\n\t };\n\t // We have to respect any afterNotify hooks that come from the arguments\n\t var objectToOverride;\n\t if (noticeable.afterNotify) {\n\t objectToOverride = noticeable;\n\t }\n\t else if (name \u0026\u0026 name.afterNotify) {\n\t objectToOverride = name;\n\t }\n\t else if (extra \u0026\u0026 extra.afterNotify) {\n\t objectToOverride = extra;\n\t }\n\t else if (name \u0026\u0026 typeof name === 'object') {\n\t objectToOverride = name;\n\t }\n\t else if (extra) {\n\t objectToOverride = extra;\n\t }\n\t else {\n\t objectToOverride = name = {};\n\t }\n\t applyAfterNotify(objectToOverride);\n\t _this.notify(noticeable, name, extra);\n\t });\n\t };\n\t Client.prototype.makeNotice = function (noticeable, name, extra) {\n\t if (name === void 0) { name = undefined; }\n\t if (extra === void 0) { extra = undefined; }\n\t var notice = (0, util_1$6.makeNotice)(noticeable);\n\t if (name \u0026\u0026 !(typeof name === 'object')) {\n\t var n = String(name);\n\t name = { name: n };\n\t }\n\t if (name) {\n\t notice = (0, util_1$6.mergeNotice)(notice, name);\n\t }\n\t if (typeof extra === 'object' \u0026\u0026 extra !== null) {\n\t notice = (0, util_1$6.mergeNotice)(notice, extra);\n\t }\n\t if ((0, util_1$6.objectIsEmpty)(notice)) {\n\t return null;\n\t }\n\t var context = this.__store.getContents('context');\n\t var noticeTags = this.__constructTags(notice.tags);\n\t var contextTags = this.__constructTags(context['tags']);\n\t var configTags = this.__constructTags(this.config.tags);\n\t // Turning into a Set will remove duplicates\n\t var tags = noticeTags.concat(contextTags).concat(configTags);\n\t var uniqueTags = tags.filter(function (item, index) { return tags.indexOf(item) === index; });\n\t notice = (0, util_1$6.merge)(notice, {\n\t name: notice.name || 'Error',\n\t context: (0, util_1$6.merge)(context, notice.context),\n\t projectRoot: notice.projectRoot || this.config.projectRoot,\n\t environment: notice.environment || this.config.environment,\n\t component: notice.component || this.config.component,\n\t action: notice.action || this.config.action,\n\t revision: notice.revision || this.config.revision,\n\t tags: uniqueTags,\n\t });\n\t // If we're passed a custom backtrace array, use it\n\t // Otherwise we make one. \n\t if (!Array.isArray(notice.backtrace) || !notice.backtrace.length) {\n\t if (typeof notice.stack !== 'string' || !notice.stack.trim()) {\n\t notice.stack = (0, util_1$6.generateStackTrace)();\n\t notice.backtrace = (0, util_1$6.makeBacktrace)(notice.stack, true, this.logger);\n\t }\n\t else {\n\t notice.backtrace = (0, util_1$6.makeBacktrace)(notice.stack, false, this.logger);\n\t }\n\t }\n\t return notice;\n\t };\n\t Client.prototype.addBreadcrumb = function (message, opts) {\n\t if (!this.config.breadcrumbsEnabled) {\n\t return;\n\t }\n\t opts = opts || {};\n\t var metadata = (0, util_1$6.shallowClone)(opts.metadata);\n\t var category = opts.category || 'custom';\n\t var timestamp = new Date().toISOString();\n\t this.__store.addBreadcrumb({\n\t category: category,\n\t message: message,\n\t metadata: metadata,\n\t timestamp: timestamp\n\t });\n\t return this;\n\t };\n\t Client.prototype.__getBreadcrumbs = function () {\n\t return this.__store.getContents('breadcrumbs').slice();\n\t };\n\t Client.prototype.__getContext = function () {\n\t return this.__store.getContents('context');\n\t };\n\t Client.prototype.__developmentMode = function () {\n\t if (this.config.reportData === true) {\n\t return false;\n\t }\n\t return (this.config.environment \u0026\u0026 this.config.developmentEnvironments.includes(this.config.environment));\n\t };\n\t Client.prototype.__buildPayload = function (notice) {\n\t var headers = (0, util_1$6.filter)(notice.headers, this.config.filters) || {};\n\t var cgiData = (0, util_1$6.filter)(__assign(__assign({}, notice.cgiData), (0, util_1$6.formatCGIData)(headers, 'HTTP_')), this.config.filters);\n\t return {\n\t notifier: notifier,\n\t breadcrumbs: {\n\t enabled: !!this.config.breadcrumbsEnabled,\n\t trail: notice.__breadcrumbs || []\n\t },\n\t error: {\n\t class: notice.name,\n\t message: notice.message,\n\t backtrace: notice.backtrace,\n\t fingerprint: notice.fingerprint,\n\t tags: notice.tags,\n\t causes: (0, util_1$6.getCauses)(notice, this.logger),\n\t },\n\t request: {\n\t url: (0, util_1$6.filterUrl)(notice.url, this.config.filters),\n\t component: notice.component,\n\t action: notice.action,\n\t context: notice.context,\n\t cgi_data: cgiData,\n\t params: (0, util_1$6.filter)(notice.params, this.config.filters) || {},\n\t session: (0, util_1$6.filter)(notice.session, this.config.filters) || {}\n\t },\n\t server: {\n\t project_root: notice.projectRoot,\n\t environment_name: notice.environment,\n\t revision: notice.revision,\n\t hostname: this.config.hostname,\n\t time: new Date().toUTCString()\n\t },\n\t details: notice.details || {}\n\t };\n\t };\n\t Client.prototype.__constructTags = function (tags) {\n\t if (!tags) {\n\t return [];\n\t }\n\t return tags.toString().split(TAG_SEPARATOR).filter(function (tag) { return NOT_BLANK.test(tag); });\n\t };\n\t return Client;\n\t}());\n\tclient.Client = Client;\n\n\tvar types = {};\n\n\tObject.defineProperty(types, \"__esModule\", { value: true });\n\n\t(function (exports) {\n\t\tvar __createBinding = (commonjsGlobal \u0026\u0026 commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n\t\t if (k2 === undefined) k2 = k;\n\t\t var desc = Object.getOwnPropertyDescriptor(m, k);\n\t\t if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n\t\t desc = { enumerable: true, get: function() { return m[k]; } };\n\t\t }\n\t\t Object.defineProperty(o, k2, desc);\n\t\t}) : (function(o, m, k, k2) {\n\t\t if (k2 === undefined) k2 = k;\n\t\t o[k2] = m[k];\n\t\t}));\n\t\tvar __setModuleDefault = (commonjsGlobal \u0026\u0026 commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {\n\t\t Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n\t\t}) : function(o, v) {\n\t\t o[\"default\"] = v;\n\t\t});\n\t\tvar __exportStar = (commonjsGlobal \u0026\u0026 commonjsGlobal.__exportStar) || function(m, exports) {\n\t\t for (var p in m) if (p !== \"default\" \u0026\u0026 !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n\t\t};\n\t\tvar __importStar = (commonjsGlobal \u0026\u0026 commonjsGlobal.__importStar) || function (mod) {\n\t\t if (mod \u0026\u0026 mod.__esModule) return mod;\n\t\t var result = {};\n\t\t if (mod != null) for (var k in mod) if (k !== \"default\" \u0026\u0026 Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n\t\t __setModuleDefault(result, mod);\n\t\t return result;\n\t\t};\n\t\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t\texports.Util = exports.Types = exports.Client = void 0;\n\t\tvar client_1 = client;\n\t\tObject.defineProperty(exports, \"Client\", { enumerable: true, get: function () { return client_1.Client; } });\n\t\t__exportStar(store, exports);\n\t\texports.Types = __importStar(types);\n\t\texports.Util = __importStar(util$1);\n\t\t\n\t} (src));\n\n\tvar util = {};\n\n\tObject.defineProperty(util, \"__esModule\", { value: true });\n\tutil.globalThisOrWindow = util.preferCatch = util.encodeCookie = util.decodeCookie = util.localURLPathname = util.parseURL = util.nativeFetch = util.stringTextOfElement = util.stringSelectorOfElement = util.stringNameOfElement = void 0;\n\t/**\n\t * Converts an HTMLElement into a human-readable string.\n\t * @param {!HTMLElement} element\n\t * @return {string}\n\t */\n\tfunction stringNameOfElement(element) {\n\t if (!element || !element.tagName) {\n\t return '';\n\t }\n\t var name = element.tagName.toLowerCase();\n\t // Ignore the root \u003chtml\u003e element in selectors and events.\n\t if (name === 'html') {\n\t return '';\n\t }\n\t if (element.id) {\n\t name += \"#\".concat(element.id);\n\t }\n\t var stringClassNames = element.getAttribute('class');\n\t if (stringClassNames) {\n\t stringClassNames.split(/\\s+/).forEach(function (className) {\n\t name += \".\".concat(className);\n\t });\n\t }\n\t ['alt', 'name', 'title', 'type'].forEach(function (attrName) {\n\t var attr = element.getAttribute(attrName);\n\t if (attr) {\n\t name += \"[\".concat(attrName, \"=\\\"\").concat(attr, \"\\\"]\");\n\t }\n\t });\n\t var siblings = getSiblings(element);\n\t if (siblings.length \u003e 1) {\n\t name += \":nth-child(\".concat(Array.prototype.indexOf.call(siblings, element) + 1, \")\");\n\t }\n\t return name;\n\t}\n\tutil.stringNameOfElement = stringNameOfElement;\n\tfunction stringSelectorOfElement(element) {\n\t var name = stringNameOfElement(element);\n\t if (element.parentNode \u0026\u0026 element.parentNode.tagName) {\n\t var parentName = stringSelectorOfElement(element.parentNode);\n\t if (parentName.length \u003e 0) {\n\t return \"\".concat(parentName, \" \u003e \").concat(name);\n\t }\n\t }\n\t return name;\n\t}\n\tutil.stringSelectorOfElement = stringSelectorOfElement;\n\tfunction stringTextOfElement(element) {\n\t var text = element.textContent || element.innerText || '';\n\t if (!text \u0026\u0026 (element.type === 'submit' || element.type === 'button')) {\n\t text = element.value;\n\t }\n\t return truncate(text.trim(), 300);\n\t}\n\tutil.stringTextOfElement = stringTextOfElement;\n\tfunction nativeFetch() {\n\t var global = globalThisOrWindow();\n\t if (!global.fetch) {\n\t return false;\n\t }\n\t if (isNative(global.fetch)) {\n\t return true;\n\t }\n\t if (typeof document === 'undefined') {\n\t return false;\n\t }\n\t // If fetch isn't native, it may be wrapped by someone else. Try to get\n\t // a pristine function from an iframe.\n\t try {\n\t var sandbox = document.createElement('iframe');\n\t sandbox.style.display = 'none';\n\t document.head.appendChild(sandbox);\n\t var result = sandbox.contentWindow.fetch \u0026\u0026 isNative(sandbox.contentWindow.fetch);\n\t document.head.removeChild(sandbox);\n\t return result;\n\t }\n\t catch (err) {\n\t if (console \u0026\u0026 console.warn) {\n\t console.warn('failed to detect native fetch via iframe: ' + err);\n\t }\n\t }\n\t return false;\n\t}\n\tutil.nativeFetch = nativeFetch;\n\tfunction isNative(func) {\n\t return func.toString().indexOf('native') !== -1;\n\t}\n\tfunction parseURL(url) {\n\t // Regexp: https://tools.ietf.org/html/rfc3986#appendix-B\n\t var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/) || {};\n\t return {\n\t protocol: match[2],\n\t host: match[4],\n\t pathname: match[5]\n\t };\n\t}\n\tutil.parseURL = parseURL;\n\tfunction localURLPathname(url) {\n\t var parsed = parseURL(url);\n\t var parsedDocURL = parseURL(document.URL);\n\t // URL must be relative\n\t if (!parsed.host || !parsed.protocol) {\n\t return parsed.pathname;\n\t }\n\t // Same domain\n\t if (parsed.protocol === parsedDocURL.protocol \u0026\u0026 parsed.host === parsedDocURL.host) {\n\t return parsed.pathname;\n\t }\n\t // x-domain\n\t return \"\".concat(parsed.protocol, \"://\").concat(parsed.host).concat(parsed.pathname);\n\t}\n\tutil.localURLPathname = localURLPathname;\n\tfunction decodeCookie(string) {\n\t var result = {};\n\t string.split(/[;,]\\s?/).forEach(function (pair) {\n\t var _a = pair.split('=', 2), key = _a[0], value = _a[1];\n\t result[key] = value;\n\t });\n\t return result;\n\t}\n\tutil.decodeCookie = decodeCookie;\n\tfunction encodeCookie(object) {\n\t if (typeof object !== 'object') {\n\t return undefined;\n\t }\n\t var cookies = [];\n\t for (var k in object) {\n\t cookies.push(k + '=' + object[k]);\n\t }\n\t return cookies.join(';');\n\t}\n\tutil.encodeCookie = encodeCookie;\n\t// Helpers\n\tfunction getSiblings(element) {\n\t try {\n\t var nodes = element.parentNode.childNodes;\n\t var siblings_1 = [];\n\t Array.prototype.forEach.call(nodes, function (node) {\n\t if (node.tagName \u0026\u0026 node.tagName === element.tagName) {\n\t siblings_1.push(node);\n\t }\n\t });\n\t return siblings_1;\n\t }\n\t catch (e) {\n\t return [];\n\t }\n\t}\n\tfunction truncate(string, length) {\n\t if (string.length \u003e length) {\n\t string = string.substr(0, length) + '...';\n\t }\n\t return string;\n\t}\n\t// Used to decide which error handling method to use when wrapping async\n\t// handlers: try/catch, or `window.onerror`. When available, `window.onerror`\n\t// will provide more information in modern browsers.\n\tutil.preferCatch = (function () {\n\t var preferCatch = true;\n\t // In case we're in an environment without access to \"window\", lets make sure theres a window.\n\t if (typeof window === 'undefined')\n\t return preferCatch;\n\t // IE \u003c 10\n\t if (!window.atob) {\n\t preferCatch = false;\n\t }\n\t // Modern browsers support the full ErrorEvent API\n\t // See https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n\t if (window.ErrorEvent) {\n\t try {\n\t if ((new window.ErrorEvent('')).colno === 0) {\n\t preferCatch = false;\n\t }\n\t // eslint-disable-next-line no-empty\n\t }\n\t catch (_e) { }\n\t }\n\t return preferCatch;\n\t})();\n\t/** globalThis has fairly good support. But just in case, lets check its defined.\n\t * @see {https://caniuse.com/?search=globalThis}\n\t */\n\tfunction globalThisOrWindow() {\n\t if (typeof globalThis !== 'undefined') {\n\t return globalThis;\n\t }\n\t if (typeof self !== 'undefined') {\n\t return self;\n\t }\n\t return window;\n\t}\n\tutil.globalThisOrWindow = globalThisOrWindow;\n\n\tvar onerror = {};\n\n\tObject.defineProperty(onerror, \"__esModule\", { value: true });\n\tonerror.onError = onerror.ignoreNextOnError = void 0;\n\t/* eslint-disable prefer-rest-params */\n\tvar core_1$5 = src;\n\tvar util_1$5 = util;\n\tvar instrument$4 = core_1$5.Util.instrument, makeNotice = core_1$5.Util.makeNotice;\n\tvar ignoreOnError = 0;\n\tvar currentTimeout;\n\tfunction ignoreNextOnError() {\n\t ignoreOnError += 1;\n\t clearTimeout(currentTimeout);\n\t currentTimeout = setTimeout(function () {\n\t ignoreOnError = 0;\n\t });\n\t}\n\tonerror.ignoreNextOnError = ignoreNextOnError;\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tfunction onError(_window) {\n\t if (_window === void 0) { _window = (0, util_1$5.globalThisOrWindow)(); }\n\t return {\n\t load: function (client) {\n\t instrument$4(_window, 'onerror', function (original) {\n\t var onerror = function (msg, url, line, col, err) {\n\t client.logger.debug('window.onerror callback invoked', arguments);\n\t if (ignoreOnError \u003e 0) {\n\t client.logger.debug('Ignoring window.onerror (error likely reported earlier)', arguments);\n\t ignoreOnError -= 1;\n\t return;\n\t }\n\t // See https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers/onerror#Notes\n\t if (line === 0 \u0026\u0026 /Script error\\.?/.test(msg)) {\n\t if (client.config.enableUncaught) {\n\t // Log only if the user wants to report uncaught errors\n\t client.logger.warn('Ignoring cross-domain script error: enable CORS to track these types of errors', arguments);\n\t }\n\t return;\n\t }\n\t var notice = makeNotice(err);\n\t if (!notice.name) {\n\t notice.name = 'window.onerror';\n\t }\n\t if (!notice.message) {\n\t notice.message = msg;\n\t }\n\t if (!notice.stack) {\n\t // Simulate v8 stack\n\t notice.stack = [notice.message, '\\n at ? (', url || 'unknown', ':', line || 0, ':', col || 0, ')'].join('');\n\t }\n\t client.addBreadcrumb((notice.name === 'window.onerror' || !notice.name) ? 'window.onerror' : \"window.onerror: \".concat(notice.name), {\n\t category: 'error',\n\t metadata: {\n\t name: notice.name,\n\t message: notice.message,\n\t stack: notice.stack\n\t }\n\t });\n\t if (client.config.enableUncaught) {\n\t client.notify(notice);\n\t }\n\t };\n\t return function (msg, url, line, col, err) {\n\t onerror(msg, url, line, col, err);\n\t if (typeof original === 'function') {\n\t return original.apply(_window, arguments);\n\t }\n\t return false;\n\t };\n\t });\n\t }\n\t };\n\t}\n\tonerror.onError = onError;\n\n\tvar onunhandledrejection = {};\n\n\tObject.defineProperty(onunhandledrejection, \"__esModule\", { value: true });\n\t/* eslint-disable prefer-rest-params */\n\tvar core_1$4 = src;\n\tvar util_1$4 = util;\n\tvar instrument$3 = core_1$4.Util.instrument;\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tfunction default_1$3(_window) {\n\t if (_window === void 0) { _window = (0, util_1$4.globalThisOrWindow)(); }\n\t return {\n\t load: function (client) {\n\t if (!client.config.enableUnhandledRejection) {\n\t return;\n\t }\n\t instrument$3(_window, 'onunhandledrejection', function (original) {\n\t // See https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n\t function onunhandledrejection(promiseRejectionEvent) {\n\t var _a;\n\t client.logger.debug('window.onunhandledrejection callback invoked', arguments);\n\t if (!client.config.enableUnhandledRejection) {\n\t return;\n\t }\n\t var reason = promiseRejectionEvent.reason;\n\t if (reason instanceof Error) {\n\t // simulate v8 stack\n\t // const fileName = reason.fileName || 'unknown'\n\t // const lineNumber = reason.lineNumber || 0\n\t var fileName = 'unknown';\n\t var lineNumber = 0;\n\t var stackFallback = \"\".concat(reason.message, \"\\n at ? (\").concat(fileName, \":\").concat(lineNumber, \")\");\n\t var stack = reason.stack || stackFallback;\n\t var err = {\n\t name: reason.name,\n\t message: \"UnhandledPromiseRejectionWarning: \".concat(reason),\n\t stack: stack\n\t };\n\t client.addBreadcrumb(\"window.onunhandledrejection: \".concat(err.name), {\n\t category: 'error',\n\t metadata: err\n\t });\n\t client.notify(err);\n\t return;\n\t }\n\t var message = typeof reason === 'string' ? reason : ((_a = JSON.stringify(reason)) !== null \u0026\u0026 _a !== void 0 ? _a : 'Unspecified reason');\n\t client.notify({\n\t name: 'window.onunhandledrejection',\n\t message: \"UnhandledPromiseRejectionWarning: \".concat(message)\n\t });\n\t }\n\t return function (promiseRejectionEvent) {\n\t onunhandledrejection(promiseRejectionEvent);\n\t if (typeof original === 'function') {\n\t original.apply(this, arguments);\n\t }\n\t };\n\t });\n\t }\n\t };\n\t}\n\tonunhandledrejection.default = default_1$3;\n\n\tvar breadcrumbs = {};\n\n\tObject.defineProperty(breadcrumbs, \"__esModule\", { value: true });\n\t/* eslint-disable prefer-rest-params */\n\tvar core_1$3 = src;\n\tvar util_1$3 = util;\n\tvar sanitize$1 = core_1$3.Util.sanitize, instrument$2 = core_1$3.Util.instrument;\n\tfunction default_1$2(_window) {\n\t if (_window === void 0) { _window = (0, util_1$3.globalThisOrWindow)(); }\n\t return {\n\t load: function (client) {\n\t function breadcrumbsEnabled(type) {\n\t if (client.config.breadcrumbsEnabled === true) {\n\t return true;\n\t }\n\t if (type) {\n\t return client.config.breadcrumbsEnabled[type] === true;\n\t }\n\t return client.config.breadcrumbsEnabled !== false;\n\t }\n\t // Breadcrumbs: instrument console\n\t (function () {\n\t if (!breadcrumbsEnabled('console')) {\n\t return;\n\t }\n\t function inspectArray(obj) {\n\t if (!Array.isArray(obj)) {\n\t return '';\n\t }\n\t return obj.map(function (value) {\n\t try {\n\t return String(value);\n\t }\n\t catch (e) {\n\t return '[unknown]';\n\t }\n\t }).join(' ');\n\t }\n\t ['debug', 'info', 'warn', 'error', 'log'].forEach(function (level) {\n\t instrument$2(_window.console, level, function (original) {\n\t return function () {\n\t var args = Array.prototype.slice.call(arguments);\n\t var message = inspectArray(args);\n\t var opts = {\n\t category: 'log',\n\t metadata: {\n\t level: level,\n\t arguments: sanitize$1(args, 3)\n\t }\n\t };\n\t client.addBreadcrumb(message, opts);\n\t if (typeof original === 'function') {\n\t Function.prototype.apply.call(original, _window.console, arguments);\n\t }\n\t };\n\t });\n\t });\n\t })();\n\t // Breadcrumbs: instrument click events\n\t (function () {\n\t if (!breadcrumbsEnabled('dom')) {\n\t return;\n\t }\n\t if (typeof _window.addEventListener !== 'function') {\n\t return;\n\t }\n\t _window.addEventListener('click', function (event) {\n\t var message, selector, text;\n\t try {\n\t message = (0, util_1$3.stringNameOfElement)(event.target);\n\t selector = (0, util_1$3.stringSelectorOfElement)(event.target);\n\t text = (0, util_1$3.stringTextOfElement)(event.target);\n\t }\n\t catch (e) {\n\t message = 'UI Click';\n\t selector = '[unknown]';\n\t text = '[unknown]';\n\t }\n\t // There's nothing to display\n\t if (message.length === 0) {\n\t return;\n\t }\n\t client.addBreadcrumb(message, {\n\t category: 'ui.click',\n\t metadata: {\n\t selector: selector,\n\t text: text,\n\t event: event\n\t }\n\t });\n\t }, _window.location ? true : false); // In CloudFlare workers useCapture must be false. window.location is a hacky way to detect it.\n\t })();\n\t // Breadcrumbs: instrument XMLHttpRequest\n\t (function () {\n\t if (!breadcrumbsEnabled('network')) {\n\t return;\n\t }\n\t // Some environments may not support XMLHttpRequest.\n\t if (typeof XMLHttpRequest === 'undefined') {\n\t return;\n\t }\n\t // -- On xhr.open: capture initial metadata\n\t instrument$2(XMLHttpRequest.prototype, 'open', function (original) {\n\t return function () {\n\t // eslint-disable-next-line @typescript-eslint/no-this-alias\n\t var xhr = this;\n\t var url = arguments[1];\n\t var method = typeof arguments[0] === 'string' ? arguments[0].toUpperCase() : arguments[0];\n\t var message = \"\".concat(method, \" \").concat((0, util_1$3.localURLPathname)(url));\n\t this.__hb_xhr = {\n\t type: 'xhr',\n\t method: method,\n\t url: url,\n\t message: message\n\t };\n\t if (typeof original === 'function') {\n\t original.apply(xhr, arguments);\n\t }\n\t };\n\t });\n\t // -- On xhr.send: set up xhr.onreadystatechange to report breadcrumb\n\t instrument$2(XMLHttpRequest.prototype, 'send', function (original) {\n\t return function () {\n\t // eslint-disable-next-line @typescript-eslint/no-this-alias\n\t var xhr = this;\n\t function onreadystatechangeHandler() {\n\t if (xhr.readyState === 4) {\n\t var message = void 0;\n\t if (xhr.__hb_xhr) {\n\t xhr.__hb_xhr.status_code = xhr.status;\n\t message = xhr.__hb_xhr.message;\n\t delete xhr.__hb_xhr.message;\n\t }\n\t client.addBreadcrumb(message || 'XMLHttpRequest', {\n\t category: 'request',\n\t metadata: xhr.__hb_xhr\n\t });\n\t }\n\t }\n\t if ('onreadystatechange' in xhr \u0026\u0026 typeof xhr.onreadystatechange === 'function') {\n\t instrument$2(xhr, 'onreadystatechange', function (original) {\n\t return function () {\n\t onreadystatechangeHandler();\n\t if (typeof original === 'function') {\n\t // eslint-disable-next-line prefer-rest-params\n\t original.apply(this, arguments);\n\t }\n\t };\n\t });\n\t }\n\t else {\n\t xhr.onreadystatechange = onreadystatechangeHandler;\n\t }\n\t if (typeof original === 'function') {\n\t // eslint-disable-next-line prefer-rest-params\n\t original.apply(xhr, arguments);\n\t }\n\t };\n\t });\n\t })();\n\t // Breadcrumbs: instrument fetch\n\t (function () {\n\t if (!breadcrumbsEnabled('network')) {\n\t return;\n\t }\n\t if (!(0, util_1$3.nativeFetch)()) {\n\t // Polyfills use XHR.\n\t return;\n\t }\n\t instrument$2(_window, 'fetch', function (original) {\n\t return function () {\n\t // eslint-disable-next-line prefer-rest-params\n\t var input = arguments[0];\n\t var method = 'GET';\n\t var url;\n\t if (typeof input === 'string') {\n\t url = input;\n\t }\n\t else if ('Request' in _window \u0026\u0026 input instanceof Request) {\n\t url = input.url;\n\t if (input.method) {\n\t method = input.method;\n\t }\n\t }\n\t else {\n\t url = String(input);\n\t }\n\t if (arguments[1] \u0026\u0026 arguments[1].method) {\n\t method = arguments[1].method;\n\t }\n\t if (typeof method === 'string') {\n\t method = method.toUpperCase();\n\t }\n\t // localURLPathname cant be constructed for CF workers due to reliance on \"document\".\n\t var message = \"\".concat(method, \" \").concat(typeof document === 'undefined' ? url : (0, util_1$3.localURLPathname)(url));\n\t var metadata = {\n\t type: 'fetch',\n\t method: method,\n\t url: url\n\t };\n\t return original\n\t .apply(this, arguments)\n\t .then(function (response) {\n\t metadata['status_code'] = response.status;\n\t client.addBreadcrumb(message, {\n\t category: 'request',\n\t metadata: metadata\n\t });\n\t return response;\n\t })\n\t .catch(function (error) {\n\t client.addBreadcrumb('fetch error', {\n\t category: 'error',\n\t metadata: metadata\n\t });\n\t throw error;\n\t });\n\t };\n\t });\n\t })();\n\t // Breadcrumbs: instrument navigation\n\t (function () {\n\t if (!breadcrumbsEnabled('navigation')) {\n\t return;\n\t }\n\t if (_window.location == null) {\n\t // Most likely in a CF worker, we should be listening to fetch requests instead.\n\t return;\n\t }\n\t // The last known href of the current page\n\t var lastHref = _window.location.href;\n\t function recordUrlChange(from, to) {\n\t lastHref = to;\n\t client.addBreadcrumb('Page changed', {\n\t category: 'navigation',\n\t metadata: {\n\t from: from,\n\t to: to\n\t }\n\t });\n\t }\n\t if (typeof addEventListener === 'function') {\n\t addEventListener('popstate', function (_event) {\n\t recordUrlChange(lastHref, _window.location.href);\n\t });\n\t }\n\t if (typeof _window.history === 'undefined') {\n\t return;\n\t }\n\t // https://developer.mozilla.org/en-US/docs/Web/API/History/pushState\n\t // https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n\t function historyWrapper(original) {\n\t return function () {\n\t var url = arguments.length \u003e 2 ? arguments[2] : undefined;\n\t if (url) {\n\t recordUrlChange(lastHref, String(url));\n\t }\n\t return original.apply(this, arguments);\n\t };\n\t }\n\t instrument$2(_window.history, 'pushState', historyWrapper);\n\t instrument$2(_window.history, 'replaceState', historyWrapper);\n\t })();\n\t }\n\t };\n\t}\n\tbreadcrumbs.default = default_1$2;\n\n\tvar timers = {};\n\n\tObject.defineProperty(timers, \"__esModule\", { value: true });\n\t/* eslint-disable prefer-rest-params */\n\tvar core_1$2 = src;\n\tvar util_1$2 = util;\n\tvar instrument$1 = core_1$2.Util.instrument;\n\tfunction default_1$1(_window) {\n\t if (_window === void 0) { _window = (0, util_1$2.globalThisOrWindow)(); }\n\t return {\n\t load: function (client) {\n\t // Wrap timers\n\t (function () {\n\t function instrumentTimer(wrapOpts) {\n\t return function (original) {\n\t // See https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout\n\t return function (func, delay) {\n\t if (typeof func === 'function') {\n\t var args_1 = Array.prototype.slice.call(arguments, 2);\n\t func = client.__wrap(func, wrapOpts);\n\t return original(function () {\n\t func.apply(void 0, args_1);\n\t }, delay);\n\t }\n\t else {\n\t return original(func, delay);\n\t }\n\t };\n\t };\n\t }\n\t instrument$1(_window, 'setTimeout', instrumentTimer({ component: 'setTimeout' }));\n\t instrument$1(_window, 'setInterval', instrumentTimer({ component: 'setInterval' }));\n\t })();\n\t }\n\t };\n\t}\n\ttimers.default = default_1$1;\n\n\tvar event_listeners = {};\n\n\tObject.defineProperty(event_listeners, \"__esModule\", { value: true });\n\tvar core_1$1 = src;\n\tvar util_1$1 = util;\n\tvar instrument = core_1$1.Util.instrument;\n\tfunction default_1(_window) {\n\t if (_window === void 0) { _window = (0, util_1$1.globalThisOrWindow)(); }\n\t return {\n\t load: function (client) {\n\t // Wrap event listeners\n\t // Event targets borrowed from bugsnag-js:\n\t // See https://github.com/bugsnag/bugsnag-js/blob/d55af916a4d3c7757f979d887f9533fe1a04cc93/src/bugsnag.js#L542\n\t var targets = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'];\n\t targets.forEach(function (prop) {\n\t var prototype = _window[prop] \u0026\u0026 _window[prop].prototype;\n\t if (prototype \u0026\u0026 Object.prototype.hasOwnProperty.call(prototype, 'addEventListener')) {\n\t instrument(prototype, 'addEventListener', function (original) {\n\t var wrapOpts = { component: \"\".concat(prop, \".prototype.addEventListener\") };\n\t // See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\t return function (type, listener, useCapture, wantsUntrusted) {\n\t try {\n\t if (listener \u0026\u0026 listener.handleEvent != null) {\n\t listener.handleEvent = client.__wrap(listener.handleEvent, wrapOpts);\n\t }\n\t }\n\t catch (e) {\n\t // Ignore 'Permission denied to access property \"handleEvent\"' errors.\n\t client.logger.error(e);\n\t }\n\t return original.call(this, type, client.__wrap(listener, wrapOpts), useCapture, wantsUntrusted);\n\t };\n\t });\n\t instrument(prototype, 'removeEventListener', function (original) {\n\t return function (type, listener, useCapture, wantsUntrusted) {\n\t original.call(this, type, listener, useCapture, wantsUntrusted);\n\t return original.call(this, type, client.__wrap(listener), useCapture, wantsUntrusted);\n\t };\n\t });\n\t }\n\t });\n\t }\n\t };\n\t}\n\tevent_listeners.default = default_1;\n\n\tvar transport = {};\n\n\tvar __awaiter = (commonjsGlobal \u0026\u0026 commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {\n\t function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n\t return new (P || (P = Promise))(function (resolve, reject) {\n\t function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n\t function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n\t function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n\t step((generator = generator.apply(thisArg, _arguments || [])).next());\n\t });\n\t};\n\tvar __generator = (commonjsGlobal \u0026\u0026 commonjsGlobal.__generator) || function (thisArg, body) {\n\t var _ = { label: 0, sent: function() { if (t[0] \u0026 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n\t return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" \u0026\u0026 (g[Symbol.iterator] = function() { return this; }), g;\n\t function verb(n) { return function (v) { return step([n, v]); }; }\n\t function step(op) {\n\t if (f) throw new TypeError(\"Generator is already executing.\");\n\t while (_) try {\n\t if (f = 1, y \u0026\u0026 (t = op[0] \u0026 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) \u0026\u0026 t.call(y), 0) : y.next) \u0026\u0026 !(t = t.call(y, op[1])).done) return t;\n\t if (y = 0, t) op = [op[0] \u0026 2, t.value];\n\t switch (op[0]) {\n\t case 0: case 1: t = op; break;\n\t case 4: _.label++; return { value: op[1], done: false };\n\t case 5: _.label++; y = op[1]; op = [0]; continue;\n\t case 7: op = _.ops.pop(); _.trys.pop(); continue;\n\t default:\n\t if (!(t = _.trys, t = t.length \u003e 0 \u0026\u0026 t[t.length - 1]) \u0026\u0026 (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n\t if (op[0] === 3 \u0026\u0026 (!t || (op[1] \u003e t[0] \u0026\u0026 op[1] \u003c t[3]))) { _.label = op[1]; break; }\n\t if (op[0] === 6 \u0026\u0026 _.label \u003c t[1]) { _.label = t[1]; t = op; break; }\n\t if (t \u0026\u0026 _.label \u003c t[2]) { _.label = t[2]; _.ops.push(op); break; }\n\t if (t[2]) _.ops.pop();\n\t _.trys.pop(); continue;\n\t }\n\t op = body.call(thisArg, _);\n\t } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n\t if (op[0] \u0026 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n\t }\n\t};\n\tObject.defineProperty(transport, \"__esModule\", { value: true });\n\ttransport.BrowserTransport = void 0;\n\tvar core_1 = src;\n\tvar util_1 = util;\n\tvar sanitize = core_1.Util.sanitize;\n\t/**\n\t * Helper function to get typesafe Object.entries()\n\t * https://twitter.com/mattpocockuk/status/1502264005251018754?lang=en\n\t */\n\tfunction objectEntries(obj) {\n\t return Object.entries(obj);\n\t}\n\tvar BrowserTransport = /** @class */ (function () {\n\t function BrowserTransport() {\n\t }\n\t BrowserTransport.prototype.send = function (options, payload) {\n\t return __awaiter(this, void 0, void 0, function () {\n\t var headerArray, headers, requestInit, response, body;\n\t return __generator(this, function (_a) {\n\t switch (_a.label) {\n\t case 0:\n\t headerArray = options.headers ? objectEntries(options.headers) : [];\n\t headers = {};\n\t headerArray.forEach(function (_a) {\n\t var key = _a[0], value = _a[1];\n\t if (key != null \u0026\u0026 value != null) {\n\t headers[String(key)] = String(value);\n\t }\n\t });\n\t requestInit = {\n\t method: options.method,\n\t headers: headers\n\t };\n\t // GET methods cannot have a body.\n\t if (options.method === 'POST') {\n\t requestInit.body = payload ? JSON.stringify(sanitize(payload, options.maxObjectDepth)) : undefined;\n\t }\n\t return [4 /*yield*/, (0, util_1.globalThisOrWindow)().fetch(options.endpoint, requestInit)];\n\t case 1:\n\t response = _a.sent();\n\t return [4 /*yield*/, response.text()];\n\t case 2:\n\t body = _a.sent();\n\t return [2 /*return*/, Promise.resolve({ statusCode: response.status, body: body })];\n\t }\n\t });\n\t });\n\t };\n\t return BrowserTransport;\n\t}());\n\ttransport.BrowserTransport = BrowserTransport;\n\n\t(function (exports) {\n\t\tvar __extends = (commonjsGlobal \u0026\u0026 commonjsGlobal.__extends) || (function () {\n\t\t var extendStatics = function (d, b) {\n\t\t extendStatics = Object.setPrototypeOf ||\n\t\t ({ __proto__: [] } instanceof Array \u0026\u0026 function (d, b) { d.__proto__ = b; }) ||\n\t\t function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n\t\t return extendStatics(d, b);\n\t\t };\n\t\t return function (d, b) {\n\t\t if (typeof b !== \"function\" \u0026\u0026 b !== null)\n\t\t throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\t\t extendStatics(d, b);\n\t\t function __() { this.constructor = d; }\n\t\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t\t };\n\t\t})();\n\t\tvar __assign = (commonjsGlobal \u0026\u0026 commonjsGlobal.__assign) || function () {\n\t\t __assign = Object.assign || function(t) {\n\t\t for (var s, i = 1, n = arguments.length; i \u003c n; i++) {\n\t\t s = arguments[i];\n\t\t for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n\t\t t[p] = s[p];\n\t\t }\n\t\t return t;\n\t\t };\n\t\t return __assign.apply(this, arguments);\n\t\t};\n\t\tvar __awaiter = (commonjsGlobal \u0026\u0026 commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {\n\t\t function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n\t\t return new (P || (P = Promise))(function (resolve, reject) {\n\t\t function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n\t\t function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n\t\t function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n\t\t step((generator = generator.apply(thisArg, _arguments || [])).next());\n\t\t });\n\t\t};\n\t\tvar __generator = (commonjsGlobal \u0026\u0026 commonjsGlobal.__generator) || function (thisArg, body) {\n\t\t var _ = { label: 0, sent: function() { if (t[0] \u0026 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n\t\t return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" \u0026\u0026 (g[Symbol.iterator] = function() { return this; }), g;\n\t\t function verb(n) { return function (v) { return step([n, v]); }; }\n\t\t function step(op) {\n\t\t if (f) throw new TypeError(\"Generator is already executing.\");\n\t\t while (_) try {\n\t\t if (f = 1, y \u0026\u0026 (t = op[0] \u0026 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) \u0026\u0026 t.call(y), 0) : y.next) \u0026\u0026 !(t = t.call(y, op[1])).done) return t;\n\t\t if (y = 0, t) op = [op[0] \u0026 2, t.value];\n\t\t switch (op[0]) {\n\t\t case 0: case 1: t = op; break;\n\t\t case 4: _.label++; return { value: op[1], done: false };\n\t\t case 5: _.label++; y = op[1]; op = [0]; continue;\n\t\t case 7: op = _.ops.pop(); _.trys.pop(); continue;\n\t\t default:\n\t\t if (!(t = _.trys, t = t.length \u003e 0 \u0026\u0026 t[t.length - 1]) \u0026\u0026 (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n\t\t if (op[0] === 3 \u0026\u0026 (!t || (op[1] \u003e t[0] \u0026\u0026 op[1] \u003c t[3]))) { _.label = op[1]; break; }\n\t\t if (op[0] === 6 \u0026\u0026 _.label \u003c t[1]) { _.label = t[1]; t = op; break; }\n\t\t if (t \u0026\u0026 _.label \u003c t[2]) { _.label = t[2]; _.ops.push(op); break; }\n\t\t if (t[2]) _.ops.pop();\n\t\t _.trys.pop(); continue;\n\t\t }\n\t\t op = body.call(thisArg, _);\n\t\t } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n\t\t if (op[0] \u0026 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n\t\t }\n\t\t};\n\t\tvar __importDefault = (commonjsGlobal \u0026\u0026 commonjsGlobal.__importDefault) || function (mod) {\n\t\t return (mod \u0026\u0026 mod.__esModule) ? mod : { \"default\": mod };\n\t\t};\n\t\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t\texports.Types = exports.getUserFeedbackScriptUrl = void 0;\n\t\tvar core_1 = src;\n\t\tvar util_1 = util;\n\t\tvar onerror_1 = onerror;\n\t\tvar onunhandledrejection_1 = __importDefault(onunhandledrejection);\n\t\tvar breadcrumbs_1 = __importDefault(breadcrumbs);\n\t\tvar timers_1 = __importDefault(timers);\n\t\tvar event_listeners_1 = __importDefault(event_listeners);\n\t\tvar transport_1 = transport;\n\t\tvar merge = core_1.Util.merge, filter = core_1.Util.filter, objectIsExtensible = core_1.Util.objectIsExtensible;\n\t\tvar getProjectRoot = function () {\n\t\t var global = (0, util_1.globalThisOrWindow)();\n\t\t var projectRoot = '';\n\t\t // Cloudflare workers do not have access to location API.\n\t\t if (global.location != null) {\n\t\t projectRoot = global.location.protocol + '//' + global.location.host;\n\t\t }\n\t\t return projectRoot;\n\t\t};\n\t\tvar getUserFeedbackScriptUrl = function (version) {\n\t\t var majorMinorVersion = version.split('.').slice(0, 2).join('.');\n\t\t return \"https://js.honeybadger.io/v\".concat(majorMinorVersion, \"/honeybadger-feedback-form.js\");\n\t\t};\n\t\texports.getUserFeedbackScriptUrl = getUserFeedbackScriptUrl;\n\t\tvar Honeybadger = /** @class */ (function (_super) {\n\t\t __extends(Honeybadger, _super);\n\t\t function Honeybadger(opts) {\n\t\t if (opts === void 0) { opts = {}; }\n\t\t var _this = _super.call(this, __assign({ userFeedbackEndpoint: 'https://api.honeybadger.io/v2/feedback', async: true, maxErrors: null, projectRoot: getProjectRoot() }, opts), new transport_1.BrowserTransport()) || this;\n\t\t /** @internal */\n\t\t _this.__errorsSent = 0;\n\t\t /** @internal */\n\t\t _this.__lastWrapErr = undefined;\n\t\t /** @internal */\n\t\t _this.__lastNoticeId = undefined;\n\t\t /** @internal */\n\t\t _this.__beforeNotifyHandlers = [\n\t\t function (notice) {\n\t\t if (_this.__exceedsMaxErrors()) {\n\t\t _this.logger.debug('Dropping notice: max errors exceeded', notice);\n\t\t return false;\n\t\t }\n\t\t if (notice \u0026\u0026 !notice.url \u0026\u0026 typeof document !== 'undefined') {\n\t\t notice.url = document.URL;\n\t\t }\n\t\t _this.__incrementErrorsCount();\n\t\t return true;\n\t\t }\n\t\t ];\n\t\t _this.__afterNotifyHandlers = [\n\t\t function (_error, notice) {\n\t\t if (notice) {\n\t\t _this.__lastNoticeId = notice.id;\n\t\t }\n\t\t return true;\n\t\t }\n\t\t ];\n\t\t return _this;\n\t\t }\n\t\t Honeybadger.prototype.configure = function (opts) {\n\t\t if (opts === void 0) { opts = {}; }\n\t\t return _super.prototype.configure.call(this, opts);\n\t\t };\n\t\t Honeybadger.prototype.resetMaxErrors = function () {\n\t\t return (this.__errorsSent = 0);\n\t\t };\n\t\t Honeybadger.prototype.factory = function (opts) {\n\t\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t return new Honeybadger(opts);\n\t\t };\n\t\t Honeybadger.prototype.checkIn = function (_id) {\n\t\t throw new Error('Honeybadger.checkIn() is not supported on the browser');\n\t\t };\n\t\t Honeybadger.prototype.showUserFeedbackForm = function (options) {\n\t\t if (options === void 0) { options = {}; }\n\t\t return __awaiter(this, void 0, void 0, function () {\n\t\t var global, script;\n\t\t return __generator(this, function (_a) {\n\t\t if (!this.config || !this.config.apiKey) {\n\t\t this.logger.debug('Client not initialized');\n\t\t return [2 /*return*/];\n\t\t }\n\t\t if (!this.__lastNoticeId) {\n\t\t this.logger.debug(\"Can't show user feedback form without a notice already reported\");\n\t\t return [2 /*return*/];\n\t\t }\n\t\t global = (0, util_1.globalThisOrWindow)();\n\t\t if (typeof global.document === 'undefined') {\n\t\t this.logger.debug('global.document is undefined. Cannot attach script');\n\t\t return [2 /*return*/];\n\t\t }\n\t\t if (this.isUserFeedbackScriptUrlAlreadyVisible()) {\n\t\t this.logger.debug('User feedback form is already visible');\n\t\t return [2 /*return*/];\n\t\t }\n\t\t global['honeybadgerUserFeedbackOptions'] = __assign(__assign({}, options), { apiKey: this.config.apiKey, endpoint: this.config.userFeedbackEndpoint, noticeId: this.__lastNoticeId });\n\t\t script = global.document.createElement('script');\n\t\t script.setAttribute('src', this.getUserFeedbackSubmitUrl());\n\t\t script.setAttribute('async', 'true');\n\t\t if (options.onLoad) {\n\t\t script.onload = options.onLoad;\n\t\t }\n\t\t (global.document.head || global.document.body).appendChild(script);\n\t\t return [2 /*return*/];\n\t\t });\n\t\t });\n\t\t };\n\t\t Honeybadger.prototype.isUserFeedbackScriptUrlAlreadyVisible = function () {\n\t\t var global = (0, util_1.globalThisOrWindow)();\n\t\t var feedbackScriptUrl = this.getUserFeedbackSubmitUrl();\n\t\t for (var i = 0; i \u003c global.document.scripts.length; i++) {\n\t\t var script = global.document.scripts[i];\n\t\t if (script.src === feedbackScriptUrl) {\n\t\t return true;\n\t\t }\n\t\t }\n\t\t return false;\n\t\t };\n\t\t Honeybadger.prototype.getUserFeedbackSubmitUrl = function () {\n\t\t return (0, exports.getUserFeedbackScriptUrl)(this.getVersion());\n\t\t };\n\t\t /** @internal */\n\t\t Honeybadger.prototype.__buildPayload = function (notice) {\n\t\t var cgiData = {\n\t\t HTTP_USER_AGENT: undefined,\n\t\t HTTP_REFERER: undefined,\n\t\t HTTP_COOKIE: undefined\n\t\t };\n\t\t if (typeof navigator !== 'undefined' \u0026\u0026 navigator.userAgent) {\n\t\t cgiData.HTTP_USER_AGENT = navigator.userAgent;\n\t\t }\n\t\t if (typeof document !== 'undefined' \u0026\u0026 document.referrer.match(/\\S/)) {\n\t\t cgiData.HTTP_REFERER = document.referrer;\n\t\t }\n\t\t var cookiesObject;\n\t\t if (typeof notice.cookies === 'string') {\n\t\t cookiesObject = (0, util_1.decodeCookie)(notice.cookies);\n\t\t }\n\t\t else {\n\t\t cookiesObject = notice.cookies;\n\t\t }\n\t\t if (cookiesObject) {\n\t\t cgiData.HTTP_COOKIE = (0, util_1.encodeCookie)(filter(cookiesObject, this.config.filters));\n\t\t }\n\t\t var payload = _super.prototype.__buildPayload.call(this, notice);\n\t\t payload.request.cgi_data = merge(cgiData, payload.request.cgi_data);\n\t\t return payload;\n\t\t };\n\t\t /**\n\t\t * wrap always returns the same function so that callbacks can be removed via\n\t\t * removeEventListener.\n\t\t * @internal\n\t\t */\n\t\t Honeybadger.prototype.__wrap = function (f, opts) {\n\t\t if (opts === void 0) { opts = {}; }\n\t\t var func = f;\n\t\t if (!opts) {\n\t\t opts = {};\n\t\t }\n\t\t try {\n\t\t if (typeof func !== 'function') {\n\t\t return func;\n\t\t }\n\t\t if (!objectIsExtensible(func)) {\n\t\t return func;\n\t\t }\n\t\t if (!func.___hb) {\n\t\t // eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\t var client_1 = this;\n\t\t func.___hb = function () {\n\t\t if (util_1.preferCatch) {\n\t\t try {\n\t\t // eslint-disable-next-line prefer-rest-params\n\t\t return func.apply(this, arguments);\n\t\t }\n\t\t catch (err) {\n\t\t if (client_1.__lastWrapErr === err) {\n\t\t throw (err);\n\t\t }\n\t\t client_1.__lastWrapErr = err;\n\t\t (0, onerror_1.ignoreNextOnError)();\n\t\t client_1.addBreadcrumb(opts.component ? \"\".concat(opts.component, \": \").concat(err.name) : err.name, {\n\t\t category: 'error',\n\t\t metadata: {\n\t\t message: err.message,\n\t\t name: err.name,\n\t\t stack: err.stack\n\t\t }\n\t\t });\n\t\t if (client_1.config.enableUncaught) {\n\t\t client_1.notify(err);\n\t\t }\n\t\t throw (err);\n\t\t }\n\t\t }\n\t\t else {\n\t\t // eslint-disable-next-line prefer-rest-params\n\t\t return func.apply(this, arguments);\n\t\t }\n\t\t };\n\t\t }\n\t\t func.___hb.___hb = func.___hb;\n\t\t return func.___hb;\n\t\t }\n\t\t catch (_e) {\n\t\t return func;\n\t\t }\n\t\t };\n\t\t /** @internal */\n\t\t Honeybadger.prototype.__incrementErrorsCount = function () {\n\t\t return this.__errorsSent++;\n\t\t };\n\t\t /** @internal */\n\t\t Honeybadger.prototype.__exceedsMaxErrors = function () {\n\t\t return this.config.maxErrors \u0026\u0026 this.__errorsSent \u003e= this.config.maxErrors;\n\t\t };\n\t\t return Honeybadger;\n\t\t}(core_1.Client));\n\t\tvar core_2 = src;\n\t\tObject.defineProperty(exports, \"Types\", { enumerable: true, get: function () { return core_2.Types; } });\n\t\texports.default = new Honeybadger({\n\t\t __plugins: [\n\t\t (0, onerror_1.onError)(),\n\t\t (0, onunhandledrejection_1.default)(),\n\t\t (0, timers_1.default)(),\n\t\t (0, event_listeners_1.default)(),\n\t\t (0, breadcrumbs_1.default)()\n\t\t ]\n\t\t});\n\t\t\n\t} (browser$1));\n\n\tvar browser = /*@__PURE__*/getDefaultExportFromCjs(browser$1);\n\n\treturn browser;\n\n}));\n//# sourceMappingURL=/assets/@honeybadger-io/js/dist/browser/honeybadger.js-01e6206b37d16edc95f02942a7d2f14d90bac410849c913fa365acf1c9f1d6ea.map\n//!\n;\n// I18n.js\n// =======\n//\n// This small library provides the Rails I18n API on the Javascript.\n// You don't actually have to use Rails (or even Ruby) to use I18n.js.\n// Just make sure you export all translations in an object like this:\n//\n// I18n.translations.en = {\n// hello: \"Hello World\"\n// };\n//\n// See tests for specific formatting like numbers and dates.\n//\n\n// Using UMD pattern from\n// https://github.com/umdjs/umd#regular-module\n// `returnExports.js` version\n;(function (root, factory) {\n if (typeof define === 'function' \u0026\u0026 define.amd) {\n // AMD. Register as an anonymous module.\n define(\"i18n\", function(){ return factory(root);});\n } else if (typeof module === 'object' \u0026\u0026 module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(root);\n } else {\n // Browser globals (root is window)\n root.I18n = factory(root);\n }\n}(this, function(global) {\n \"use strict\";\n\n // Use previously defined object if exists in current scope\n var I18n = global \u0026\u0026 global.I18n || {};\n\n // Just cache the Array#slice function.\n var slice = Array.prototype.slice;\n\n // Apply number padding.\n var padding = function(number) {\n return (\"0\" + number.toString()).substr(-2);\n };\n\n // Improved toFixed number rounding function with support for unprecise floating points\n // JavaScript's standard toFixed function does not round certain numbers correctly (for example 0.105 with precision 2).\n var toFixed = function(number, precision) {\n return decimalAdjust('round', number, -precision).toFixed(precision);\n };\n\n // Is a given variable an object?\n // Borrowed from Underscore.js\n var isObject = function(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object'\n };\n\n var isFunction = function(func) {\n var type = typeof func;\n return type === 'function'\n };\n\n // Check if value is different than undefined and null;\n var isSet = function(value) {\n return typeof(value) !== 'undefined' \u0026\u0026 value !== null;\n };\n\n // Is a given value an array?\n // Borrowed from Underscore.js\n var isArray = function(val) {\n if (Array.isArray) {\n return Array.isArray(val);\n }\n return Object.prototype.toString.call(val) === '[object Array]';\n };\n\n var isString = function(val) {\n return typeof val === 'string' || Object.prototype.toString.call(val) === '[object String]';\n };\n\n var isNumber = function(val) {\n return typeof val === 'number' || Object.prototype.toString.call(val) === '[object Number]';\n };\n\n var isBoolean = function(val) {\n return val === true || val === false;\n };\n\n var isNull = function(val) {\n return val === null;\n };\n\n var decimalAdjust = function(type, value, exp) {\n // If the exp is undefined or zero...\n if (typeof exp === 'undefined' || +exp === 0) {\n return Math[type](value);\n }\n value = +value;\n exp = +exp;\n // If the value is not a number or the exp is not an integer...\n if (isNaN(value) || !(typeof exp === 'number' \u0026\u0026 exp % 1 === 0)) {\n return NaN;\n }\n // Shift\n value = value.toString().split('e');\n value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));\n // Shift back\n value = value.toString().split('e');\n return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));\n };\n\n var lazyEvaluate = function(message, scope) {\n if (isFunction(message)) {\n return message(scope);\n } else {\n return message;\n }\n };\n\n var merge = function (dest, obj) {\n var key, value;\n for (key in obj) if (obj.hasOwnProperty(key)) {\n value = obj[key];\n if (isString(value) || isNumber(value) || isBoolean(value) || isArray(value) || isNull(value)) {\n dest[key] = value;\n } else {\n if (dest[key] == null) dest[key] = {};\n merge(dest[key], value);\n }\n }\n return dest;\n };\n\n // Set default days/months translations.\n var DATE = {\n day_names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]\n , abbr_day_names: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n , month_names: [null, \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n , abbr_month_names: [null, \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n , meridian: [\"AM\", \"PM\"]\n };\n\n // Set default number format.\n var NUMBER_FORMAT = {\n precision: 3\n , separator: \".\"\n , delimiter: \",\"\n , strip_insignificant_zeros: false\n };\n\n // Set default currency format.\n var CURRENCY_FORMAT = {\n unit: \"$\"\n , precision: 2\n , format: \"%u%n\"\n , sign_first: true\n , delimiter: \",\"\n , separator: \".\"\n };\n\n // Set default percentage format.\n var PERCENTAGE_FORMAT = {\n unit: \"%\"\n , precision: 3\n , format: \"%n%u\"\n , separator: \".\"\n , delimiter: \"\"\n };\n\n // Set default size units.\n var SIZE_UNITS = [null, \"kb\", \"mb\", \"gb\", \"tb\"];\n\n // Other default options\n var DEFAULT_OPTIONS = {\n // Set default locale. This locale will be used when fallback is enabled and\n // the translation doesn't exist in a particular locale.\n defaultLocale: \"en\"\n // Set the current locale to `en`.\n , locale: \"en\"\n // Set the translation key separator.\n , defaultSeparator: \".\"\n // Set the placeholder format. Accepts `{{placeholder}}` and `%{placeholder}`.\n , placeholder: /(?:\\{\\{|%\\{)(.*?)(?:\\}\\}?)/gm\n // Set if engine should fallback to the default locale when a translation\n // is missing.\n , fallbacks: false\n // Set the default translation object.\n , translations: {}\n // Set missing translation behavior. 'message' will display a message\n // that the translation is missing, 'guess' will try to guess the string\n , missingBehaviour: 'message'\n // if you use missingBehaviour with 'message', but want to know that the\n // string is actually missing for testing purposes, you can prefix the\n // guessed string by setting the value here. By default, no prefix!\n , missingTranslationPrefix: ''\n };\n\n // Set default locale. This locale will be used when fallback is enabled and\n // the translation doesn't exist in a particular locale.\n I18n.reset = function() {\n var key;\n for (key in DEFAULT_OPTIONS) {\n this[key] = DEFAULT_OPTIONS[key];\n }\n };\n\n // Much like `reset`, but only assign options if not already assigned\n I18n.initializeOptions = function() {\n var key;\n for (key in DEFAULT_OPTIONS) if (!isSet(this[key])) {\n this[key] = DEFAULT_OPTIONS[key];\n }\n };\n I18n.initializeOptions();\n\n // Return a list of all locales that must be tried before returning the\n // missing translation message. By default, this will consider the inline option,\n // current locale and fallback locale.\n //\n // I18n.locales.get(\"de-DE\");\n // // [\"de-DE\", \"de\", \"en\"]\n //\n // You can define custom rules for any locale. Just make sure you return a array\n // containing all locales.\n //\n // // Default the Wookie locale to English.\n // I18n.locales[\"wk\"] = function(locale) {\n // return [\"en\"];\n // };\n //\n I18n.locales = {};\n\n // Retrieve locales based on inline locale, current locale or default to\n // I18n's detection.\n I18n.locales.get = function(locale) {\n var result = this[locale] || this[I18n.locale] || this[\"default\"];\n\n if (isFunction(result)) {\n result = result(locale);\n }\n\n if (isArray(result) === false) {\n result = [result];\n }\n\n return result;\n };\n\n // The default locale list.\n I18n.locales[\"default\"] = function(locale) {\n var locales = []\n , list = []\n ;\n\n // Handle the inline locale option that can be provided to\n // the `I18n.t` options.\n if (locale) {\n locales.push(locale);\n }\n\n // Add the current locale to the list.\n if (!locale \u0026\u0026 I18n.locale) {\n locales.push(I18n.locale);\n }\n\n // Add the default locale if fallback strategy is enabled.\n if (I18n.fallbacks \u0026\u0026 I18n.defaultLocale) {\n locales.push(I18n.defaultLocale);\n }\n\n // Locale code format 1:\n // According to RFC4646 (https://www.ietf.org/rfc/rfc4646.txt)\n // language codes for Traditional Chinese should be `zh-Hant`\n //\n // But due to backward compatibility\n // We use older version of IETF language tag\n // @see https://www.w3.org/TR/html401/struct/dirlang.html\n // @see https://en.wikipedia.org/wiki/IETF_language_tag\n //\n // Format: `language-code = primary-code ( \"-\" subcode )*`\n //\n // primary-code uses ISO639-1\n // @see https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\n // @see https://www.iso.org/iso/home/standards/language_codes.htm\n //\n // subcode uses ISO 3166-1 alpha-2\n // @see https://en.wikipedia.org/wiki/ISO_3166\n // @see https://www.iso.org/iso/country_codes.htm\n //\n // @note\n // subcode can be in upper case or lower case\n // defining it in upper case is a convention only\n\n\n // Locale code format 2:\n // Format: `code = primary-code ( \"-\" region-code )*`\n // primary-code uses ISO 639-1\n // script-code uses ISO 15924\n // region-code uses ISO 3166-1 alpha-2\n // Example: zh-Hant-TW, en-HK, zh-Hant-CN\n //\n // It is similar to RFC4646 (or actually the same),\n // but seems to be limited to language, script, region\n\n // Compute each locale with its country code.\n // So this will return an array containing\n // `de-DE` and `de`\n // or\n // `zh-hans-tw`, `zh-hans`, `zh`\n // locales.\n locales.forEach(function(locale) {\n var localeParts = locale.split(\"-\");\n var firstFallback = null;\n var secondFallback = null;\n if (localeParts.length === 3) {\n firstFallback = [\n localeParts[0],\n localeParts[1]\n ].join(\"-\");\n secondFallback = localeParts[0];\n }\n else if (localeParts.length === 2) {\n firstFallback = localeParts[0];\n }\n\n if (list.indexOf(locale) === -1) {\n list.push(locale);\n }\n\n if (! I18n.fallbacks) {\n return;\n }\n\n [\n firstFallback,\n secondFallback\n ].forEach(function(nullableFallbackLocale) {\n // We don't want null values\n if (typeof nullableFallbackLocale === \"undefined\") { return; }\n if (nullableFallbackLocale === null) { return; }\n // We don't want duplicate values\n //\n // Comparing with `locale` first is faster than\n // checking whether value's presence in the list\n if (nullableFallbackLocale === locale) { return; }\n if (list.indexOf(nullableFallbackLocale) !== -1) { return; }\n\n list.push(nullableFallbackLocale);\n });\n });\n\n // No locales set? English it is.\n if (!locales.length) {\n locales.push(\"en\");\n }\n\n return list;\n };\n\n // Hold pluralization rules.\n I18n.pluralization = {};\n\n // Return the pluralizer for a specific locale.\n // If no specify locale is found, then I18n's default will be used.\n I18n.pluralization.get = function(locale) {\n return this[locale] || this[I18n.locale] || this[\"default\"];\n };\n\n // The default pluralizer rule.\n // It detects the `zero`, `one`, and `other` scopes.\n I18n.pluralization[\"default\"] = function(count) {\n switch (count) {\n case 0: return [\"zero\", \"other\"];\n case 1: return [\"one\"];\n default: return [\"other\"];\n }\n };\n\n // Return current locale. If no locale has been set, then\n // the current locale will be the default locale.\n I18n.currentLocale = function() {\n return this.locale || this.defaultLocale;\n };\n\n // Check if value is different than undefined and null;\n I18n.isSet = isSet;\n\n // Find and process the translation using the provided scope and options.\n // This is used internally by some functions and should not be used as an\n // public API.\n I18n.lookup = function(scope, options) {\n options = options || {};\n\n var locales = this.locales.get(options.locale).slice()\n , locale\n , scopes\n , fullScope\n , translations\n ;\n\n fullScope = this.getFullScope(scope, options);\n\n while (locales.length) {\n locale = locales.shift();\n scopes = fullScope.split(options.separator || this.defaultSeparator);\n translations = this.translations[locale];\n\n if (!translations) {\n continue;\n }\n while (scopes.length) {\n translations = translations[scopes.shift()];\n\n if (translations === undefined || translations === null) {\n break;\n }\n }\n\n if (translations !== undefined \u0026\u0026 translations !== null) {\n return translations;\n }\n }\n\n if (isSet(options.defaultValue)) {\n return lazyEvaluate(options.defaultValue, scope);\n }\n };\n\n // lookup pluralization rule key into translations\n I18n.pluralizationLookupWithoutFallback = function(count, locale, translations) {\n var pluralizer = this.pluralization.get(locale)\n , pluralizerKeys = pluralizer(count)\n , pluralizerKey\n , message;\n\n if (translations \u0026\u0026 isObject(translations)) {\n while (pluralizerKeys.length) {\n pluralizerKey = pluralizerKeys.shift();\n if (isSet(translations[pluralizerKey])) {\n message = translations[pluralizerKey];\n break;\n }\n }\n }\n\n return message;\n };\n\n // Lookup dedicated to pluralization\n I18n.pluralizationLookup = function(count, scope, options) {\n options = options || {};\n var locales = this.locales.get(options.locale).slice()\n , locale\n , scopes\n , translations\n , message\n ;\n scope = this.getFullScope(scope, options);\n\n while (locales.length) {\n locale = locales.shift();\n scopes = scope.split(options.separator || this.defaultSeparator);\n translations = this.translations[locale];\n\n if (!translations) {\n continue;\n }\n\n while (scopes.length) {\n translations = translations[scopes.shift()];\n if (!isObject(translations)) {\n break;\n }\n if (scopes.length === 0) {\n message = this.pluralizationLookupWithoutFallback(count, locale, translations);\n }\n }\n if (typeof message !== \"undefined\" \u0026\u0026 message !== null) {\n break;\n }\n }\n\n if (typeof message === \"undefined\" || message === null) {\n if (isSet(options.defaultValue)) {\n if (isObject(options.defaultValue)) {\n message = this.pluralizationLookupWithoutFallback(count, options.locale, options.defaultValue);\n } else {\n message = options.defaultValue;\n }\n translations = options.defaultValue;\n }\n }\n\n return { message: message, translations: translations };\n };\n\n // Rails changed the way the meridian is stored.\n // It started with `date.meridian` returning an array,\n // then it switched to `time.am` and `time.pm`.\n // This function abstracts this difference and returns\n // the correct meridian or the default value when none is provided.\n I18n.meridian = function() {\n var time = this.lookup(\"time\");\n var date = this.lookup(\"date\");\n\n if (time \u0026\u0026 time.am \u0026\u0026 time.pm) {\n return [time.am, time.pm];\n } else if (date \u0026\u0026 date.meridian) {\n return date.meridian;\n } else {\n return DATE.meridian;\n }\n };\n\n // Merge serveral hash options, checking if value is set before\n // overwriting any value. The precedence is from left to right.\n //\n // I18n.prepareOptions({name: \"John Doe\"}, {name: \"Mary Doe\", role: \"user\"});\n // #=\u003e {name: \"John Doe\", role: \"user\"}\n //\n I18n.prepareOptions = function() {\n var args = slice.call(arguments)\n , options = {}\n , subject\n ;\n\n while (args.length) {\n subject = args.shift();\n\n if (typeof(subject) != \"object\") {\n continue;\n }\n\n for (var attr in subject) {\n if (!subject.hasOwnProperty(attr)) {\n continue;\n }\n\n if (isSet(options[attr])) {\n continue;\n }\n\n options[attr] = subject[attr];\n }\n }\n\n return options;\n };\n\n // Generate a list of translation options for default fallbacks.\n // `defaultValue` is also deleted from options as it is returned as part of\n // the translationOptions array.\n I18n.createTranslationOptions = function(scope, options) {\n var translationOptions = [{scope: scope}];\n\n // Defaults should be an array of hashes containing either\n // fallback scopes or messages\n if (isSet(options.defaults)) {\n translationOptions = translationOptions.concat(options.defaults);\n }\n\n // Maintain support for defaultValue. Since it is always a message\n // insert it in to the translation options as such.\n if (isSet(options.defaultValue)) {\n translationOptions.push({ message: options.defaultValue });\n }\n\n return translationOptions;\n };\n\n // Translate the given scope with the provided options.\n I18n.translate = function(scope, options) {\n options = options || {};\n\n var translationOptions = this.createTranslationOptions(scope, options);\n\n var translation;\n var usedScope = scope;\n\n var optionsWithoutDefault = this.prepareOptions(options)\n delete optionsWithoutDefault.defaultValue\n\n // Iterate through the translation options until a translation\n // or message is found.\n var translationFound =\n translationOptions.some(function(translationOption) {\n if (isSet(translationOption.scope)) {\n usedScope = translationOption.scope;\n translation = this.lookup(usedScope, optionsWithoutDefault);\n } else if (isSet(translationOption.message)) {\n translation = lazyEvaluate(translationOption.message, scope);\n }\n\n if (translation !== undefined \u0026\u0026 translation !== null) {\n return true;\n }\n }, this);\n\n if (!translationFound) {\n return this.missingTranslation(scope, options);\n }\n\n if (typeof(translation) === \"string\") {\n translation = this.interpolate(translation, options);\n } else if (isArray(translation)) {\n translation = translation.map(function(t) {\n return (typeof(t) === \"string\" ? this.interpolate(t, options) : t);\n }, this);\n } else if (isObject(translation) \u0026\u0026 isSet(options.count)) {\n translation = this.pluralize(options.count, usedScope, options);\n }\n\n return translation;\n };\n\n // This function interpolates the all variables in the given message.\n I18n.interpolate = function(message, options) {\n if (message == null) {\n return message;\n }\n\n options = options || {};\n var matches = message.match(this.placeholder)\n , placeholder\n , value\n , name\n , regex\n ;\n\n if (!matches) {\n return message;\n }\n\n while (matches.length) {\n placeholder = matches.shift();\n name = placeholder.replace(this.placeholder, \"$1\");\n\n if (isSet(options[name])) {\n value = options[name].toString().replace(/\\$/gm, \"_#$#_\");\n } else if (name in options) {\n value = this.nullPlaceholder(placeholder, message, options);\n } else {\n value = this.missingPlaceholder(placeholder, message, options);\n }\n\n regex = new RegExp(placeholder.replace(/{/gm, \"\\\\{\").replace(/}/gm, \"\\\\}\"));\n message = message.replace(regex, value);\n }\n\n return message.replace(/_#\\$#_/g, \"$\");\n };\n\n // Pluralize the given scope using the `count` value.\n // The pluralized translation may have other placeholders,\n // which will be retrieved from `options`.\n I18n.pluralize = function(count, scope, options) {\n options = this.prepareOptions({count: String(count)}, options)\n var pluralizer, result;\n\n result = this.pluralizationLookup(count, scope, options);\n if (typeof result.translations === \"undefined\" || result.translations == null) {\n return this.missingTranslation(scope, options);\n }\n\n if (typeof result.message !== \"undefined\" \u0026\u0026 result.message != null) {\n return this.interpolate(result.message, options);\n }\n else {\n pluralizer = this.pluralization.get(options.locale);\n return this.missingTranslation(scope + '.' + pluralizer(count)[0], options);\n }\n };\n\n // Return a missing translation message for the given parameters.\n I18n.missingTranslation = function(scope, options) {\n //guess intended string\n if(this.missingBehaviour === 'guess'){\n //get only the last portion of the scope\n var s = scope.split('.').slice(-1)[0];\n //replace underscore with space \u0026\u0026 camelcase with space and lowercase letter\n return (this.missingTranslationPrefix.length \u003e 0 ? this.missingTranslationPrefix : '') +\n s.replace(/_/g,' ').replace(/([a-z])([A-Z])/g,\n function(match, p1, p2) {return p1 + ' ' + p2.toLowerCase()} );\n }\n\n var localeForTranslation = (options != null \u0026\u0026 options.locale != null) ? options.locale : this.currentLocale();\n var fullScope = this.getFullScope(scope, options);\n var fullScopeWithLocale = [localeForTranslation, fullScope].join(options.separator || this.defaultSeparator);\n\n return '[missing \"' + fullScopeWithLocale + '\" translation]';\n };\n\n // Return a missing placeholder message for given parameters\n I18n.missingPlaceholder = function(placeholder, message, options) {\n return \"[missing \" + placeholder + \" value]\";\n };\n\n I18n.nullPlaceholder = function() {\n return I18n.missingPlaceholder.apply(I18n, arguments);\n };\n\n // Format number using localization rules.\n // The options will be retrieved from the `number.format` scope.\n // If this isn't present, then the following options will be used:\n //\n // - `precision`: `3`\n // - `separator`: `\".\"`\n // - `delimiter`: `\",\"`\n // - `strip_insignificant_zeros`: `false`\n //\n // You can also override these options by providing the `options` argument.\n //\n I18n.toNumber = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.format\")\n , NUMBER_FORMAT\n );\n\n var negative = number \u003c 0\n , string = toFixed(Math.abs(number), options.precision).toString()\n , parts = string.split(\".\")\n , precision\n , buffer = []\n , formattedNumber\n , format = options.format || \"%n\"\n , sign = negative ? \"-\" : \"\"\n ;\n\n number = parts[0];\n precision = parts[1];\n\n while (number.length \u003e 0) {\n buffer.unshift(number.substr(Math.max(0, number.length - 3), 3));\n number = number.substr(0, number.length -3);\n }\n\n formattedNumber = buffer.join(options.delimiter);\n\n if (options.strip_insignificant_zeros \u0026\u0026 precision) {\n precision = precision.replace(/0+$/, \"\");\n }\n\n if (options.precision \u003e 0 \u0026\u0026 precision) {\n formattedNumber += options.separator + precision;\n }\n\n if (options.sign_first) {\n format = \"%s\" + format;\n }\n else {\n format = format.replace(\"%n\", \"%s%n\");\n }\n\n formattedNumber = format\n .replace(\"%u\", options.unit)\n .replace(\"%n\", formattedNumber)\n .replace(\"%s\", sign)\n ;\n\n return formattedNumber;\n };\n\n // Format currency with localization rules.\n // The options will be retrieved from the `number.currency.format` and\n // `number.format` scopes, in that order.\n //\n // Any missing option will be retrieved from the `I18n.toNumber` defaults and\n // the following options:\n //\n // - `unit`: `\"$\"`\n // - `precision`: `2`\n // - `format`: `\"%u%n\"`\n // - `delimiter`: `\",\"`\n // - `separator`: `\".\"`\n //\n // You can also override these options by providing the `options` argument.\n //\n I18n.toCurrency = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.currency.format\", options)\n , this.lookup(\"number.format\", options)\n , CURRENCY_FORMAT\n );\n\n return this.toNumber(number, options);\n };\n\n // Localize several values.\n // You can provide the following scopes: `currency`, `number`, or `percentage`.\n // If you provide a scope that matches the `/^(date|time)/` regular expression\n // then the `value` will be converted by using the `I18n.toTime` function.\n //\n // It will default to the value's `toString` function.\n //\n I18n.localize = function(scope, value, options) {\n options || (options = {});\n\n switch (scope) {\n case \"currency\":\n return this.toCurrency(value, options);\n case \"number\":\n scope = this.lookup(\"number.format\", options);\n return this.toNumber(value, scope);\n case \"percentage\":\n return this.toPercentage(value, options);\n default:\n var localizedValue;\n\n if (scope.match(/^(date|time)/)) {\n localizedValue = this.toTime(scope, value, options);\n } else {\n localizedValue = value.toString();\n }\n\n return this.interpolate(localizedValue, options);\n }\n };\n\n // Parse a given `date` string into a JavaScript Date object.\n // This function is time zone aware.\n //\n // The following string formats are recognized:\n //\n // yyyy-mm-dd\n // yyyy-mm-dd[ T]hh:mm::ss\n // yyyy-mm-dd[ T]hh:mm::ss\n // yyyy-mm-dd[ T]hh:mm::ssZ\n // yyyy-mm-dd[ T]hh:mm::ss+0000\n // yyyy-mm-dd[ T]hh:mm::ss+00:00\n // yyyy-mm-dd[ T]hh:mm::ss.123Z\n //\n I18n.parseDate = function(date) {\n var matches, convertedDate, fraction;\n // A date input of `null` or `undefined` will be returned as-is\n if (date == null) {\n return date;\n }\n // we have a date, so just return it.\n if (typeof(date) === \"object\") {\n return date;\n }\n\n matches = date.toString().match(/(\\d{4})-(\\d{2})-(\\d{2})(?:[ T](\\d{2}):(\\d{2}):(\\d{2})([\\.,]\\d{1,3})?)?(Z|\\+00:?00)?/);\n\n if (matches) {\n for (var i = 1; i \u003c= 6; i++) {\n matches[i] = parseInt(matches[i], 10) || 0;\n }\n\n // month starts on 0\n matches[2] -= 1;\n\n fraction = matches[7] ? 1000 * (\"0\" + matches[7]) : null;\n\n if (matches[8]) {\n convertedDate = new Date(Date.UTC(matches[1], matches[2], matches[3], matches[4], matches[5], matches[6], fraction));\n } else {\n convertedDate = new Date(matches[1], matches[2], matches[3], matches[4], matches[5], matches[6], fraction);\n }\n } else if (typeof(date) == \"number\") {\n // UNIX timestamp\n convertedDate = new Date();\n convertedDate.setTime(date);\n } else if (date.match(/([A-Z][a-z]{2}) ([A-Z][a-z]{2}) (\\d+) (\\d+:\\d+:\\d+) ([+-]\\d+) (\\d+)/)) {\n // This format `Wed Jul 20 13:03:39 +0000 2011` is parsed by\n // webkit/firefox, but not by IE, so we must parse it manually.\n convertedDate = new Date();\n convertedDate.setTime(Date.parse([\n RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$6, RegExp.$4, RegExp.$5\n ].join(\" \")));\n } else if (date.match(/\\d+ \\d+:\\d+:\\d+ [+-]\\d+ \\d+/)) {\n // a valid javascript format with timezone info\n convertedDate = new Date();\n convertedDate.setTime(Date.parse(date));\n } else {\n // an arbitrary javascript string\n convertedDate = new Date();\n convertedDate.setTime(Date.parse(date));\n }\n\n return convertedDate;\n };\n\n // Formats time according to the directives in the given format string.\n // The directives begins with a percent (%) character. Any text not listed as a\n // directive will be passed through to the output string.\n //\n // The accepted formats are:\n //\n // %a - The abbreviated weekday name (Sun)\n // %A - The full weekday name (Sunday)\n // %b - The abbreviated month name (Jan)\n // %B - The full month name (January)\n // %c - The preferred local date and time representation\n // %d - Day of the month (01..31)\n // %-d - Day of the month (1..31)\n // %H - Hour of the day, 24-hour clock (00..23)\n // %-H/%k - Hour of the day, 24-hour clock (0..23)\n // %I - Hour of the day, 12-hour clock (01..12)\n // %-I/%l - Hour of the day, 12-hour clock (1..12)\n // %m - Month of the year (01..12)\n // %-m - Month of the year (1..12)\n // %M - Minute of the hour (00..59)\n // %-M - Minute of the hour (0..59)\n // %p - Meridian indicator (AM or PM)\n // %P - Meridian indicator (am or pm)\n // %S - Second of the minute (00..60)\n // %-S - Second of the minute (0..60)\n // %w - Day of the week (Sunday is 0, 0..6)\n // %y - Year without a century (00..99)\n // %-y - Year without a century (0..99)\n // %Y - Year with century\n // %z/%Z - Timezone offset (+0545)\n //\n I18n.strftime = function(date, format, options) {\n var options = this.lookup(\"date\", options)\n , meridianOptions = I18n.meridian()\n ;\n\n if (!options) {\n options = {};\n }\n\n options = this.prepareOptions(options, DATE);\n\n if (isNaN(date.getTime())) {\n throw new Error('I18n.strftime() requires a valid date object, but received an invalid date.');\n }\n\n var weekDay = date.getDay()\n , day = date.getDate()\n , year = date.getFullYear()\n , month = date.getMonth() + 1\n , hour = date.getHours()\n , hour12 = hour\n , meridian = hour \u003e 11 ? 1 : 0\n , secs = date.getSeconds()\n , mins = date.getMinutes()\n , offset = date.getTimezoneOffset()\n , absOffsetHours = Math.floor(Math.abs(offset / 60))\n , absOffsetMinutes = Math.abs(offset) - (absOffsetHours * 60)\n , timezoneoffset = (offset \u003e 0 ? \"-\" : \"+\") +\n (absOffsetHours.toString().length \u003c 2 ? \"0\" + absOffsetHours : absOffsetHours) +\n (absOffsetMinutes.toString().length \u003c 2 ? \"0\" + absOffsetMinutes : absOffsetMinutes)\n ;\n\n if (hour12 \u003e 12) {\n hour12 = hour12 - 12;\n } else if (hour12 === 0) {\n hour12 = 12;\n }\n\n format = format.replace(\"%a\", options.abbr_day_names[weekDay]);\n format = format.replace(\"%A\", options.day_names[weekDay]);\n format = format.replace(\"%b\", options.abbr_month_names[month]);\n format = format.replace(\"%B\", options.month_names[month]);\n format = format.replace(\"%d\", padding(day));\n format = format.replace(\"%e\", day);\n format = format.replace(\"%-d\", day);\n format = format.replace(\"%H\", padding(hour));\n format = format.replace(\"%-H\", hour);\n format = format.replace(\"%k\", hour);\n format = format.replace(\"%I\", padding(hour12));\n format = format.replace(\"%-I\", hour12);\n format = format.replace(\"%l\", hour12);\n format = format.replace(\"%m\", padding(month));\n format = format.replace(\"%-m\", month);\n format = format.replace(\"%M\", padding(mins));\n format = format.replace(\"%-M\", mins);\n format = format.replace(\"%p\", meridianOptions[meridian]);\n format = format.replace(\"%P\", meridianOptions[meridian].toLowerCase());\n format = format.replace(\"%S\", padding(secs));\n format = format.replace(\"%-S\", secs);\n format = format.replace(\"%w\", weekDay);\n format = format.replace(\"%y\", padding(year));\n format = format.replace(\"%-y\", padding(year).replace(/^0+/, \"\"));\n format = format.replace(\"%Y\", year);\n format = format.replace(\"%z\", timezoneoffset);\n format = format.replace(\"%Z\", timezoneoffset);\n\n return format;\n };\n\n // Convert the given dateString into a formatted date.\n I18n.toTime = function(scope, dateString, options) {\n var date = this.parseDate(dateString)\n , format = this.lookup(scope, options)\n ;\n\n // A date input of `null` or `undefined` will be returned as-is\n if (date == null) {\n return date;\n }\n\n var date_string = date.toString()\n if (date_string.match(/invalid/i)) {\n return date_string;\n }\n\n if (!format) {\n return date_string;\n }\n\n return this.strftime(date, format, options);\n };\n\n // Convert a number into a formatted percentage value.\n I18n.toPercentage = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.percentage.format\", options)\n , this.lookup(\"number.format\", options)\n , PERCENTAGE_FORMAT\n );\n\n return this.toNumber(number, options);\n };\n\n // Convert a number into a readable size representation.\n I18n.toHumanSize = function(number, options) {\n var kb = 1024\n , size = number\n , iterations = 0\n , unit\n , precision\n , fullScope\n ;\n\n while (size \u003e= kb \u0026\u0026 iterations \u003c 4) {\n size = size / kb;\n iterations += 1;\n }\n\n if (iterations === 0) {\n fullScope = this.getFullScope(\"number.human.storage_units.units.byte\", options);\n unit = this.t(fullScope, {count: size});\n precision = 0;\n } else {\n fullScope = this.getFullScope(\"number.human.storage_units.units.\" + SIZE_UNITS[iterations], options);\n unit = this.t(fullScope);\n precision = (size - Math.floor(size) === 0) ? 0 : 1;\n }\n\n options = this.prepareOptions(\n options\n , {unit: unit, precision: precision, format: \"%n%u\", delimiter: \"\"}\n );\n\n return this.toNumber(size, options);\n };\n\n I18n.getFullScope = function(scope, options) {\n options = options || {};\n\n // Deal with the scope as an array.\n if (isArray(scope)) {\n scope = scope.join(options.separator || this.defaultSeparator);\n }\n\n // Deal with the scope option provided through the second argument.\n //\n // I18n.t('hello', {scope: 'greetings'});\n //\n if (options.scope) {\n scope = [options.scope, scope].join(options.separator || this.defaultSeparator);\n }\n\n return scope;\n };\n /**\n * Merge obj1 with obj2 (shallow merge), without modifying inputs\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {Object} Merged values of obj1 and obj2\n *\n * In order to support ES3, `Object.prototype.hasOwnProperty.call` is used\n * Idea is from:\n * https://stackoverflow.com/questions/8157700/object-has-no-hasownproperty-method-i-e-its-undefined-ie8\n */\n I18n.extend = function ( obj1, obj2 ) {\n if (typeof(obj1) === \"undefined\" \u0026\u0026 typeof(obj2) === \"undefined\") {\n return {};\n }\n return merge(obj1, obj2);\n };\n\n // Set aliases, so we can save some typing.\n I18n.t = I18n.translate.bind(I18n);\n I18n.l = I18n.localize.bind(I18n);\n I18n.p = I18n.pluralize.bind(I18n);\n\n return I18n;\n}));\n/*!\n * Ahoy.js v0.4.3\n * Simple, powerful JavaScript analytics\n * https://github.com/ankane/ahoy.js\n * MIT License\n */\n\n(function (global, factory) {\n typeof exports === 'object' \u0026\u0026 typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' \u0026\u0026 define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ahoy = factory());\n})(this, (function () { 'use strict';\n\n // https://www.quirksmode.org/js/cookies.html\n\n var Cookies = {\n set: function (name, value, ttl, domain) {\n var expires = \"\";\n var cookieDomain = \"\";\n if (ttl) {\n var date = new Date();\n date.setTime(date.getTime() + (ttl * 60 * 1000));\n expires = \"; expires=\" + date.toGMTString();\n }\n if (domain) {\n cookieDomain = \"; domain=\" + domain;\n }\n document.cookie = name + \"=\" + escape(value) + expires + cookieDomain + \"; path=/; samesite=lax\";\n },\n get: function (name) {\n var i, c;\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n for (i = 0; i \u003c ca.length; i++) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n if (c.indexOf(nameEQ) === 0) {\n return unescape(c.substring(nameEQ.length, c.length));\n }\n }\n return null;\n }\n };\n\n var config = {\n urlPrefix: \"\",\n visitsUrl: \"/ahoy/visits\",\n eventsUrl: \"/ahoy/events\",\n page: null,\n platform: \"Web\",\n useBeacon: true,\n startOnReady: true,\n trackVisits: true,\n cookies: true,\n cookieDomain: null,\n headers: {},\n visitParams: {},\n withCredentials: false,\n visitDuration: 4 * 60, // default 4 hours\n visitorDuration: 2 * 365 * 24 * 60 // default 2 years\n };\n\n var ahoy = window.ahoy || window.Ahoy || {};\n\n ahoy.configure = function (options) {\n for (var key in options) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n config[key] = options[key];\n }\n }\n };\n\n // legacy\n ahoy.configure(ahoy);\n\n var $ = window.jQuery || window.Zepto || window.$;\n var visitId, visitorId, track;\n var isReady = false;\n var queue = [];\n var canStringify = typeof(JSON) !== \"undefined\" \u0026\u0026 typeof(JSON.stringify) !== \"undefined\";\n var eventQueue = [];\n\n function visitsUrl() {\n return config.urlPrefix + config.visitsUrl;\n }\n\n function eventsUrl() {\n return config.urlPrefix + config.eventsUrl;\n }\n\n function isEmpty(obj) {\n return Object.keys(obj).length === 0;\n }\n\n function canTrackNow() {\n return (config.useBeacon || config.trackNow) \u0026\u0026 isEmpty(config.headers) \u0026\u0026 canStringify \u0026\u0026 typeof(window.navigator.sendBeacon) !== \"undefined\" \u0026\u0026 !config.withCredentials;\n }\n\n function serialize(object) {\n var data = new FormData();\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n data.append(key, object[key]);\n }\n }\n return data;\n }\n\n // cookies\n\n function setCookie(name, value, ttl) {\n Cookies.set(name, value, ttl, config.cookieDomain || config.domain);\n }\n\n function getCookie(name) {\n return Cookies.get(name);\n }\n\n function destroyCookie(name) {\n Cookies.set(name, \"\", -1);\n }\n\n function log(message) {\n if (getCookie(\"ahoy_debug\")) {\n window.console.log(message);\n }\n }\n\n function setReady() {\n var callback;\n while ((callback = queue.shift())) {\n callback();\n }\n isReady = true;\n }\n\n ahoy.ready = function (callback) {\n if (isReady) {\n callback();\n } else {\n queue.push(callback);\n }\n };\n\n function matchesSelector(element, selector) {\n var matches = element.matches ||\n element.matchesSelector ||\n element.mozMatchesSelector ||\n element.msMatchesSelector ||\n element.oMatchesSelector ||\n element.webkitMatchesSelector;\n\n if (matches) {\n if (matches.apply(element, [selector])) {\n return element;\n } else if (element.parentElement) {\n return matchesSelector(element.parentElement, selector);\n }\n return null;\n } else {\n log(\"Unable to match\");\n return null;\n }\n }\n\n function onEvent(eventName, selector, callback) {\n document.addEventListener(eventName, function (e) {\n var matchedElement = matchesSelector(e.target, selector);\n if (matchedElement) {\n var skip = getClosest(matchedElement, \"data-ahoy-skip\");\n if (skip !== null \u0026\u0026 skip !== \"false\") { return; }\n\n callback.call(matchedElement, e);\n }\n });\n }\n\n // http://beeker.io/jquery-document-ready-equivalent-vanilla-javascript\n function documentReady(callback) {\n if (document.readyState === \"interactive\" || document.readyState === \"complete\") {\n setTimeout(callback, 0);\n } else {\n document.addEventListener(\"DOMContentLoaded\", callback);\n }\n }\n\n // https://stackoverflow.com/a/2117523/1177228\n function generateId() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0;\n var v = c === 'x' ? r : (r \u0026 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n function saveEventQueue() {\n if (config.cookies \u0026\u0026 canStringify) {\n setCookie(\"ahoy_events\", JSON.stringify(eventQueue), 1);\n }\n }\n\n // from rails-ujs\n\n function csrfToken() {\n var meta = document.querySelector(\"meta[name=csrf-token]\");\n return meta \u0026\u0026 meta.content;\n }\n\n function csrfParam() {\n var meta = document.querySelector(\"meta[name=csrf-param]\");\n return meta \u0026\u0026 meta.content;\n }\n\n function CSRFProtection(xhr) {\n var token = csrfToken();\n if (token) { xhr.setRequestHeader(\"X-CSRF-Token\", token); }\n }\n\n function sendRequest(url, data, success) {\n if (canStringify) {\n if ($ \u0026\u0026 $.ajax) {\n $.ajax({\n type: \"POST\",\n url: url,\n data: JSON.stringify(data),\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n beforeSend: CSRFProtection,\n success: success,\n headers: config.headers,\n xhrFields: {\n withCredentials: config.withCredentials\n }\n });\n } else {\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.withCredentials = config.withCredentials;\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n for (var header in config.headers) {\n if (Object.prototype.hasOwnProperty.call(config.headers, header)) {\n xhr.setRequestHeader(header, config.headers[header]);\n }\n }\n xhr.onload = function () {\n if (xhr.status === 200) {\n success();\n }\n };\n CSRFProtection(xhr);\n xhr.send(JSON.stringify(data));\n }\n }\n }\n\n function eventData(event) {\n var data = {\n events: [event]\n };\n if (config.cookies) {\n data.visit_token = event.visit_token;\n data.visitor_token = event.visitor_token;\n }\n delete event.visit_token;\n delete event.visitor_token;\n return data;\n }\n\n function trackEvent(event) {\n ahoy.ready(function () {\n sendRequest(eventsUrl(), eventData(event), function () {\n // remove from queue\n for (var i = 0; i \u003c eventQueue.length; i++) {\n if (eventQueue[i].id === event.id) {\n eventQueue.splice(i, 1);\n break;\n }\n }\n saveEventQueue();\n });\n });\n }\n\n function trackEventNow(event) {\n ahoy.ready(function () {\n var data = eventData(event);\n var param = csrfParam();\n var token = csrfToken();\n if (param \u0026\u0026 token) { data[param] = token; }\n // stringify so we keep the type\n data.events_json = JSON.stringify(data.events);\n delete data.events;\n window.navigator.sendBeacon(eventsUrl(), serialize(data));\n });\n }\n\n function page() {\n return config.page || window.location.pathname;\n }\n\n function presence(str) {\n return (str \u0026\u0026 str.length \u003e 0) ? str : null;\n }\n\n function cleanObject(obj) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] === null) {\n delete obj[key];\n }\n }\n }\n return obj;\n }\n\n function eventProperties() {\n return cleanObject({\n tag: this.tagName.toLowerCase(),\n id: presence(this.id),\n \"class\": presence(this.className),\n page: page(),\n section: getClosest(this, \"data-section\")\n });\n }\n\n function getClosest(element, attribute) {\n for (; element \u0026\u0026 element !== document; element = element.parentNode) {\n if (element.hasAttribute(attribute)) {\n return element.getAttribute(attribute);\n }\n }\n\n return null;\n }\n\n function createVisit() {\n isReady = false;\n\n visitId = ahoy.getVisitId();\n visitorId = ahoy.getVisitorId();\n track = getCookie(\"ahoy_track\");\n\n if (config.cookies === false || config.trackVisits === false) {\n log(\"Visit tracking disabled\");\n setReady();\n } else if (visitId \u0026\u0026 visitorId \u0026\u0026 !track) {\n // TODO keep visit alive?\n log(\"Active visit\");\n setReady();\n } else {\n if (!visitId) {\n visitId = generateId();\n setCookie(\"ahoy_visit\", visitId, config.visitDuration);\n }\n\n // make sure cookies are enabled\n if (getCookie(\"ahoy_visit\")) {\n log(\"Visit started\");\n\n if (!visitorId) {\n visitorId = generateId();\n setCookie(\"ahoy_visitor\", visitorId, config.visitorDuration);\n }\n\n var data = {\n visit_token: visitId,\n visitor_token: visitorId,\n platform: config.platform,\n landing_page: window.location.href,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n js: true\n };\n\n // referrer\n if (document.referrer.length \u003e 0) {\n data.referrer = document.referrer;\n }\n\n for (var key in config.visitParams) {\n if (Object.prototype.hasOwnProperty.call(config.visitParams, key)) {\n data[key] = config.visitParams[key];\n }\n }\n\n log(data);\n\n sendRequest(visitsUrl(), data, function () {\n // wait until successful to destroy\n destroyCookie(\"ahoy_track\");\n setReady();\n });\n } else {\n log(\"Cookies disabled\");\n setReady();\n }\n }\n }\n\n ahoy.getVisitId = ahoy.getVisitToken = function () {\n return getCookie(\"ahoy_visit\");\n };\n\n ahoy.getVisitorId = ahoy.getVisitorToken = function () {\n return getCookie(\"ahoy_visitor\");\n };\n\n ahoy.reset = function () {\n destroyCookie(\"ahoy_visit\");\n destroyCookie(\"ahoy_visitor\");\n destroyCookie(\"ahoy_events\");\n destroyCookie(\"ahoy_track\");\n return true;\n };\n\n ahoy.debug = function (enabled) {\n if (enabled === false) {\n destroyCookie(\"ahoy_debug\");\n } else {\n setCookie(\"ahoy_debug\", \"t\", 365 * 24 * 60); // 1 year\n }\n return true;\n };\n\n ahoy.track = function (name, properties) {\n // generate unique id\n var event = {\n name: name,\n properties: properties || {},\n time: (new Date()).getTime() / 1000.0,\n id: generateId(),\n js: true\n };\n\n ahoy.ready(function () {\n if (config.cookies \u0026\u0026 !ahoy.getVisitId()) {\n createVisit();\n }\n\n ahoy.ready(function () {\n log(event);\n\n event.visit_token = ahoy.getVisitId();\n event.visitor_token = ahoy.getVisitorId();\n\n if (canTrackNow()) {\n trackEventNow(event);\n } else {\n eventQueue.push(event);\n saveEventQueue();\n\n // wait in case navigating to reduce duplicate events\n setTimeout(function () {\n trackEvent(event);\n }, 1000);\n }\n });\n });\n\n return true;\n };\n\n ahoy.trackView = function (additionalProperties) {\n var properties = {\n url: window.location.href,\n title: document.title,\n page: page()\n };\n\n if (additionalProperties) {\n for (var propName in additionalProperties) {\n if (Object.prototype.hasOwnProperty.call(additionalProperties, propName)) {\n properties[propName] = additionalProperties[propName];\n }\n }\n }\n ahoy.track(\"$view\", properties);\n };\n\n ahoy.trackClicks = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"click\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n properties.text = properties.tag === \"input\" ? this.value : (this.textContent || this.innerText || this.innerHTML).replace(/[\\s\\r\\n]+/g, \" \").trim();\n properties.href = this.href;\n ahoy.track(\"$click\", properties);\n });\n };\n\n ahoy.trackSubmits = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"submit\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$submit\", properties);\n });\n };\n\n ahoy.trackChanges = function (selector) {\n log(\"trackChanges is deprecated and will be removed in 0.5.0\");\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"change\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$change\", properties);\n });\n };\n\n // push events from queue\n try {\n eventQueue = JSON.parse(getCookie(\"ahoy_events\") || \"[]\");\n } catch (e) {\n // do nothing\n }\n\n for (var i = 0; i \u003c eventQueue.length; i++) {\n trackEvent(eventQueue[i]);\n }\n\n ahoy.start = function () {\n createVisit();\n\n ahoy.start = function () {};\n };\n\n documentReady(function () {\n if (config.startOnReady) {\n ahoy.start();\n }\n });\n\n return ahoy;\n\n}));\n\n\n\n\n\n\n\n\n\nI18n.defaultLocale = 'en';\nI18n.locale = document.body.dataset.locale;\nI18n.translations = JSON.parse(document.getElementById('i18n-translations').dataset.translations);\nvar instantClick\n , InstantClick = instantClick = function(document, location, $userAgent) {\n // Internal variables\n var $isChromeForIOS = $userAgent.indexOf(' CriOS/') \u003e -1\n , $currentLocationWithoutHash\n , $urlToPreload\n , $preloadTimer\n , $lastTouchTimestamp\n\n // Preloading-related variables\n , $history = {}\n , $xhr\n , $url = false\n , $mustRedirect = false\n , $fetchedBodies = {}\n , $timing = {}\n , $isPreloading = false\n , $isWaitingForCompletion = false\n , $trackedAssets = []\n\n // Variables defined by public functions\n , $preloadOnMousedown\n , $delayBeforePreload\n , $eventsCallbacks = {\n fetch: [],\n receive: [],\n wait: [],\n change: [],\n restore: []\n }\n\n\n ////////// HELPERS //////////\n\n\n function removeHash(url) {\n var index = url.indexOf('#')\n if (index \u003c 0) {\n return url\n }\n return url.substr(0, index)\n }\n\n function getLinkTarget(target) {\n while (target \u0026\u0026 target.nodeName != 'A') {\n target = target.parentNode\n }\n return target\n }\n\n function isNotPreloadable(elem) {\n do {\n if (!elem.hasAttribute) { // Parent of \u003chtml\u003e\n break\n }\n if (elem.hasAttribute('data-instant')) {\n return false\n }\n if (elem.hasAttribute('data-no-instant')) {\n return true\n }\n }\n while (elem = elem.parentNode)\n return false\n }\n\n function isPreloadable(a) {\n var domain = location.protocol + '//' + location.host\n\n if (a.target // target=\"_blank\" etc.\n || a.hasAttribute('download')\n || a.href.indexOf(domain + '/') != 0 // Another domain, or no href attribute\n || (a.href.indexOf('#') \u003e -1\n \u0026\u0026 removeHash(a.href) == $currentLocationWithoutHash) // Anchor\n || isNotPreloadable(a)\n ) {\n return false\n }\n return true\n }\n\n function triggerPageEvent(eventType, arg1, arg2, arg3) {\n var returnValue = false\n for (var i = 0; i \u003c $eventsCallbacks[eventType].length; i++) {\n if (eventType == 'receive') {\n var altered = $eventsCallbacks[eventType][i](arg1, arg2, arg3)\n if (altered) {\n /* Update args for the next iteration of the loop. */\n if ('body' in altered) {\n arg2 = altered.body\n }\n if ('title' in altered) {\n arg3 = altered.title\n }\n\n returnValue = altered\n }\n }\n else {\n $eventsCallbacks[eventType][i](arg1, arg2, arg3)\n }\n }\n return returnValue\n }\n\n function changePage(title, body, newUrl, scrollY, pop) {\n var pageContentDiv = document.getElementById(\"page-content\");\n var memberMenuButton = document.getElementById(\"member-menu-button\")\n if (memberMenuButton) {\n memberMenuButton.classList.remove('showing')\n }\n document.body.replaceChild(body, pageContentDiv)\n\n var prog = document.getElementById(\"navigation-progress\");\n prog.classList.remove(\"showing\");\n\n if (newUrl) {\n const routeChangeTarget = document.getElementById('route-change-target');\n if(routeChangeTarget) {\n routeChangeTarget.focus();\n }\n document.getElementById('page-route-change').textContent = title;\n history.pushState(null, null, newUrl.replace(\"?samepage=true\",\"\").replace(\"\u0026samepage=true\",\"\"))\n\n var hashIndex = newUrl.indexOf('#'),\n hashElem = hashIndex \u003e -1 \u0026\u0026 (\n document.getElementById(newUrl.substr(hashIndex + 1)) ||\n document.querySelector(`[name=${newUrl.substr(hashIndex + 1)}].anchor`)\n ),\n offset = 0,\n samePage = newUrl.indexOf(\"samepage=true\") \u003e -1;\n\n if (hashElem) {\n while (hashElem.offsetParent) {\n offset += hashElem.offsetTop\n\n hashElem = hashElem.offsetParent\n }\n }\n if (!samePage){\n scrollTo(0, offset)\n }\n\n\n $currentLocationWithoutHash = removeHash(newUrl)\n }\n else {\n scrollTo(0, scrollY)\n }\n\n if ($isChromeForIOS \u0026\u0026 document.title == title) {\n /* Chrome for iOS:\n *\n * 1. Removes title on pushState, so the title needs to be set after.\n *\n * 2. Will not set the title if it's identical when trimmed, so\n * appending a space won't do; but a non-breaking space works.\n */\n document.title = title + String.fromCharCode(160)\n }\n else {\n document.title = title\n }\n\n instantanize()\n if (pop) {\n triggerPageEvent('restore')\n }\n else {\n triggerPageEvent('change', false)\n }\n }\n\n function setPreloadingAsHalted() {\n $isPreloading = false\n $isWaitingForCompletion = false\n }\n\n function removeNoscriptTags(html) {\n /* Must be done on text, not on a node's innerHTML, otherwise strange\n * things happen with implicitly closed elements (see the Noscript test).\n */\n return html.replace(/\u003cnoscript[\\s\\S]+?\u003c\\/noscript\u003e/gi, '')\n }\n\n\n ////////// EVENT LISTENERS //////////\n\n\n function mousedownListener(e) {\n if ($lastTouchTimestamp \u003e (+new Date - 500)) {\n return // Otherwise, click doesn't fire\n }\n\n var a = getLinkTarget(e.target)\n\n if (!a || !isPreloadable(a)) {\n return\n }\n\n preload(a.href)\n }\n\n function mouseoverListener(e) {\n if ($lastTouchTimestamp \u003e (+new Date - 500)) {\n return // Otherwise, click doesn't fire\n }\n\n var a = getLinkTarget(e.target)\n\n if (!a || !isPreloadable(a)) {\n return\n }\n\n a.addEventListener('mouseout', mouseoutListener)\n\n if (!$delayBeforePreload) {\n preload(a.href)\n }\n else {\n $urlToPreload = a.href\n $preloadTimer = setTimeout(preload, $delayBeforePreload)\n }\n getImageForLink(a);\n }\n\n function touchstartListener(e) {\n $lastTouchTimestamp = +new Date\n var a = getLinkTarget(e.target)\n\n if (!a || !isPreloadable(a)) {\n return\n }\n\n if ($preloadOnMousedown) {\n a.removeEventListener('mousedown', mousedownListener)\n }\n else {\n a.removeEventListener('mouseover', mouseoverListener)\n }\n preload(a.href);\n getImageForLink(a);\n }\n\n // If a link is focused, it is preloaded just like on mouseover.\n // It also covers the issue where a user needs to press \u003creturn\u003e\n // twice in order to follow a focused link.\n function focusListener(e) {\n var a = getLinkTarget(e.target)\n\n if (!a || !isPreloadable(a)) {\n return\n }\n\n if (!$delayBeforePreload) {\n preload(a.href)\n }\n else {\n $urlToPreload = a.href\n $preloadTimer = setTimeout(preload, $delayBeforePreload)\n }\n getImageForLink(a);\n }\n\n function clickListener(e) {\n try{\n var a = getLinkTarget(e.target)\n\n if (!a || !isPreloadable(a)) {\n return\n }\n\n if (e.which \u003e 1 || e.metaKey || e.ctrlKey) { // Opening in new tab\n return\n }\n display(a.href);\n e.preventDefault();\n }\n catch(err){\n console.log(err);\n }\n }\n\n function mouseoutListener() {\n if ($preloadTimer) {\n clearTimeout($preloadTimer)\n $preloadTimer = false\n return\n }\n\n if (!$isPreloading || $isWaitingForCompletion) {\n return\n }\n $xhr.abort()\n setPreloadingAsHalted()\n }\n\n function readystatechangeListener() {\n processXHR($xhr,$url);\n }\n\n function processXHR(xhr,url) {\n if (xhr.readyState \u003c 4) {\n return\n }\n if (xhr.status == 0) {\n /* Request aborted */\n return\n }\n\n $timing.ready = +new Date - $timing.start\n var pageContentDiv = document.getElementById(\"page-content\");\n if (pageContentDiv \u0026\u0026 xhr.status === 200 \u0026\u0026 xhr.getResponseHeader('Content-Type').match(/\\/(x|ht|xht)ml/)) {\n var doc = document.implementation.createHTMLDocument('');\n doc.documentElement.innerHTML = removeNoscriptTags(xhr.responseText)\n var title = doc.title\n var body = doc.getElementById(\"page-content\")\n var alteredOnReceive = triggerPageEvent('receive', url, body, title)\n if (alteredOnReceive) {\n if ('body' in alteredOnReceive) {\n body = alteredOnReceive.body\n }\n if ('title' in alteredOnReceive) {\n title = alteredOnReceive.title\n }\n }\n $fetchedBodies[url] = {body:body, title:title};\n var urlWithoutHash = removeHash(url)\n\n var elems = doc.head.children\n , found = 0\n , elem\n , data\n\n for (var i = 0; i \u003c elems.length; i++) {\n elem = elems[i]\n if (elem.hasAttribute('data-instant-track')) {\n data = elem.getAttribute('href') || elem.getAttribute('src') || elem.innerHTML\n for (var j = 0; j \u003c $trackedAssets.length; j++) {\n if ($trackedAssets[j] == data) {\n found++\n }\n }\n }\n }\n if (found != $trackedAssets.length) {\n $mustRedirect = true // Assets have changed\n }\n }\n else {\n $mustRedirect = true // Not an HTML document\n }\n\n if ($isWaitingForCompletion \u0026\u0026 $url === url) {\n $isWaitingForCompletion = false\n display($url)\n }\n }\n\n function popstateListener() {\n var loc = removeHash(location.href)\n if (loc == $currentLocationWithoutHash) {\n return\n }\n\n if (!(loc in $history)) {\n location.href = location.href\n return\n }\n $history[$currentLocationWithoutHash] = {\n body: document.getElementById(\"page-content\"),\n title: document.title,\n scrollY: pageYOffset\n }\n\n $currentLocationWithoutHash = loc\n changePage($history[loc].title, $history[loc].body, false, $history[loc].scrollY, true)\n }\n\n\n ////////// MAIN FUNCTIONS //////////\n\n\n function instantanize(isInitializing) {\n var docBody = document.body;\n if (docBody) {\n document.body.addEventListener('touchstart', touchstartListener, true)\n document.body.addEventListener('focus', focusListener, true)\n if ($preloadOnMousedown) {\n document.body.addEventListener('mousedown', mousedownListener, true)\n } else {\n document.body.addEventListener('mouseover', mouseoverListener, true)\n }\n document.body.addEventListener('click', clickListener, true)\n }\n\n if (!isInitializing) {\n var scriptElementsInDOM = document.body.getElementsByTagName('script')\n , scriptElementsToCopy = []\n , originalElement\n , copyElement\n , parentNode\n , nextSibling\n , i\n\n // `scriptElementsInDOM` will change during the copy of scripts if\n // a script add or delete script elements, so we need to put script\n // elements in an array to loop through them correctly.\n for (i = 0; i \u003c scriptElementsInDOM.length; i++) {\n // gist liquid tags are handled seperately via app/javascript/utilities/gist.js\n if(scriptElementsInDOM[i].id === 'gist-ltag') continue;\n scriptElementsToCopy.push(scriptElementsInDOM[i])\n }\n\n for (i = 0; i \u003c scriptElementsToCopy.length; i++) {\n originalElement = scriptElementsToCopy[i]\n if (!originalElement) { // Might have disappeared, see previous comment\n continue\n }\n if (originalElement.hasAttribute('data-no-instant')) {\n continue\n }\n\n copyElement = document.createElement('script')\n for (var j = 0; j \u003c originalElement.attributes.length; j++) {\n copyElement.setAttribute(originalElement.attributes[j].name, originalElement.attributes[j].value)\n }\n copyElement.textContent = originalElement.textContent\n\n parentNode = originalElement.parentNode\n nextSibling = originalElement.nextSibling\n parentNode.removeChild(originalElement)\n parentNode.insertBefore(copyElement, nextSibling)\n }\n }\n }\n\n function preload(url, option) {\n if (!$preloadOnMousedown\n \u0026\u0026 'display' in $timing\n \u0026\u0026 +new Date - ($timing.start + $timing.display) \u003c 100) {\n return\n }\n if ($preloadTimer) {\n clearTimeout($preloadTimer)\n $preloadTimer = false\n }\n\n if (!url) {\n url = $urlToPreload\n }\n\n if ($isPreloading \u0026\u0026 (url == $url || $isWaitingForCompletion)) {\n return\n }\n $isPreloading = true\n $isWaitingForCompletion = false\n\n $mustRedirect = false\n $timing = {\n start: +new Date\n }\n if (url.indexOf(\"?\") == -1) {\n var internalUrl = url+\"?i=i\"\n }\n else {\n var internalUrl = url+\"\u0026i=i\"\n }\n removeExpiredKeys()\n triggerPageEvent('fetch')\n if (!$fetchedBodies[url]){\n if (option === \"force\") {\n getURLInfo(url, function () {\n processXHR(this,url);\n })\n }\n else {\n $url = url\n $xhr.open('GET', internalUrl)\n $xhr.send()\n }\n }\n }\n\n function removeExpiredKeys(option) {\n if ( Object.keys($fetchedBodies).length \u003e 13 || option == \"force\" ) {\n $fetchedBodies = {};\n }\n\n }\n\n function getURLInfo(url, callback) {\n var xhr = new XMLHttpRequest();\n if (url.indexOf(\"?\") == -1) {\n var internalUrl = url+\"?i=i\"\n }\n else {\n var internalUrl = url+\"\u0026i=i\"\n }\n xhr.open (\n \"GET\",\n internalUrl,\n true\n );\n xhr.onreadystatechange = function() {\n if (xhr.readyState == 4) {\n // defensive check\n if (typeof callback == \"function\") {\n // apply() sets the meaning of \"this\" in the callback\n callback.apply(xhr);\n }\n }\n }\n // send the request *after* the event handler is defined\n xhr.send();\n }\n\n function display(url) {\n $url = url;\n if($fetchedBodies[url]){\n var body = $fetchedBodies[url]['body'];\n var title = $fetchedBodies[url]['title'];\n }\n else {\n var prog = document.getElementById(\"navigation-progress\");\n prog.classList.add(\"showing\");\n }\n\n if (!('display' in $timing)) {\n $timing.display = +new Date - $timing.start\n }\n if ($preloadTimer || !$isPreloading) {\n if ($preloadTimer \u0026\u0026 $url \u0026\u0026 $url != url) {\n location.href = url\n return\n }\n preload(url)\n triggerPageEvent('wait')\n $isWaitingForCompletion = true // Must be set *after* calling `preload`\n return\n }\n if ($isWaitingForCompletion) {\n /* The user clicked on a link while a page was preloading. Either on\n the same link or on another link. If it's the same link something\n might have gone wrong (or he could have double clicked, we don't\n handle that case), so we send him to the page without pjax.\n If it's another link, it hasn't been preloaded, so we redirect the\n user to it.\n */\n location.href = url\n return\n }\n if ($mustRedirect) {\n location.href = $url\n return\n }\n\n if (!body) {\n triggerPageEvent('wait')\n $isWaitingForCompletion = true\n return\n }\n $history[$currentLocationWithoutHash] = {\n body: document.getElementById(\"page-content\"),\n title: document.title,\n scrollY: pageYOffset\n }\n setPreloadingAsHalted()\n changePage(title, body, $url)\n }\n\n\n ////////// PUBLIC VARIABLE AND FUNCTIONS //////////\n\n var supported = 'pushState' in history\n \u0026\u0026 (!$userAgent.match('Android') || $userAgent.match('Chrome/') || $userAgent.match('Firefox/'))\n \u0026\u0026 location.protocol != \"file:\"\n\n /* The (sad) state of Android's AOSP browsers:\n\n 2.3.7: pushState appears to work correctly, but\n `doc.documentElement.innerHTML = body` is buggy.\n Update: InstantClick doesn't use that anymore, but it may\n fail where 3.0 do, this needs testing again.\n\n 3.0: pushState appears to work correctly (though the address bar is\n only updated on focus), but\n `document.documentElement.replaceChild(doc.body, document.body)`\n throws DOMException: WRONG_DOCUMENT_ERR.\n\n 4.0.2: Doesn't support pushState.\n\n 4.0.4,\n 4.1.1,\n 4.2,\n 4.3: Claims support for pushState, but doesn't update the address bar.\n\n 4.4: Works correctly. Claims to be 'Chrome/30.0.0.0'.\n\n All androids tested with Android SDK's Emulator.\n Version numbers are from the browser's user agent.\n\n Because of this mess, the only allowed browser on Android is Chrome.\n */\n\n function init(preloadingMode) {\n if ($currentLocationWithoutHash) {\n /* Already initialized */\n return\n }\n if (!supported) {\n triggerPageEvent('change', true)\n return\n }\n\n if (preloadingMode == 'mousedown') {\n $preloadOnMousedown = true\n }\n else if (typeof preloadingMode == 'number') {\n $delayBeforePreload = preloadingMode\n }\n $currentLocationWithoutHash = removeHash(location.href)\n $history[$currentLocationWithoutHash] = {\n body: document.getElementById(\"page-content\"),\n title: document.title,\n scrollY: pageYOffset\n }\n\n var elems = document.head.children\n , elem\n , data\n for (var i = 0; i \u003c elems.length; i++) {\n elem = elems[i]\n if (elem.hasAttribute('data-instant-track')) {\n data = elem.getAttribute('href') || elem.getAttribute('src') || elem.innerHTML\n /* We can't use just `elem.href` and `elem.src` because we can't\n retrieve `href`s and `src`s from the Ajax response.\n */\n $trackedAssets.push(data)\n }\n }\n\n $xhr = new XMLHttpRequest()\n $xhr.addEventListener('readystatechange', readystatechangeListener)\n\n instantanize(true)\n\n triggerPageEvent('change', true)\n\n addEventListener('popstate', popstateListener)\n addRefreshBehavior();\n }\n\n function on(eventType, callback) {\n $eventsCallbacks[eventType].push(callback)\n }\n\n function addRefreshBehavior(){\n if (!(\"ontouchstart\" in document.documentElement)) {\n return\n }\n\n var script = document.createElement('script');\n script.src = \"/assets/lib/pulltorefresh-9b56f74a421b6273bdafaa34b17521df12711be7191050b1193dfd958a99a81a.js\";\n document.head.appendChild(script);\n var waitingOnPTR = setInterval(function(){\n if (typeof PullToRefresh !== 'undefined') {\n var ptr = PullToRefresh.init({\n mainElement: 'body',\n passive: true,\n onRefresh: function(){\n window.location.reload();\n }\n });\n clearInterval(waitingOnPTR)\n }\n }, 1)\n }\n\n\n ////////////////////\n\n\n return {\n supported: supported,\n init: init,\n isPreloadable: isPreloadable,\n preload: preload,\n removeExpiredKeys: removeExpiredKeys,\n display: display,\n on: on\n }\n\n}(document, location, navigator.userAgent);\n\n\n// FUNCTIONAL CODE FOR PAGE\n\n function initializeBaseApp() {\n InstantClick.on('change', function() {\n initializePage();\n });\n InstantClick.init();\n }\n\n// INITIALIZE/ERROR HANDLING\n\n Honeybadger.configure({\n apiKey: document.body.dataset.honeybadgerKey,\n environment: \"production\",\n revision: document.body.dataset.releaseFootprint,\n });\n\n Honeybadger.beforeNotify(function(notice) {\n const ignorePatterns = [/ResizeObserver/i, /MetaMask/i, /MtPopUpList/i, /ChunkLoadError/i]\n return !(ignorePatterns.some((pattern) =\u003e pattern.test(notice.message)));\n });\n\n// INITIALIZE AHOY TRACKING\n// Setting cookies to false matches what we do in ahoy's initializer.\n// Setting trackVisits to false prevents ahoy from creating a visit on the server-side.\n ahoy.configure({\n cookies: false,\n trackVisits: false\n });\n\n// Start BaseApp for Page\n initializeBaseApp();\n"]}