{"version":3,"sources":["SmartSnippet.min__7d400a8f34d33214ce02.js","./src/utils/AccessibleModal.ts","./src/ui/SmartSnippet/SmartSnippetCommon.ts","./src/ui/SmartSnippet/SmartSnippet.ts","./src/ui/FocusTrap/FocusTrap.ts","./src/ui/ResultLink/ResultLinkCommon.ts","./src/misc/AttachShadowPolyfill.ts","./node_modules/dompurify/dist/purify.js","./src/ui/ResultLink/ResultLink.ts","./src/ui/SmartSnippet/UserFeedbackBanner.ts","./src/ui/SmartSnippet/HeightLimiter.ts","./src/ui/SmartSnippet/ExplanationModal.ts","./src/ui/FormWidgets/RadioButton.ts"],"names":["webpackJsonpCoveo__temporary","179","module","exports","__webpack_require__","__assign","this","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","defineProperty","value","className","ownerElement","modalboxModule","options","ModalBox","sizeMod","get","focusTrap","enumerable","configurable","activeModal","modalBox","content","wrapper","element","querySelector","openResult","parameters","isOpen","openModalAndTrap","validation","origin","title","DomUtils","getQuickviewHeader","result","bindings","el","makeAccessible","open","initiallyFocusedElement","document","activeElement","onModalClose","body","overlayClose","FocusTrap","close","setAttribute","headerElement","makeCloseButtonAccessible","updateFocus","closeButton","l","tabIndex","$$","on","KeyboardUtils","keypressAction","KEYBOARD","ENTER","click","focusOnOpen","focus","disable","contains","AccessibleModal","229","questionAnswer","answerSnippet","sanitize","USE_PROFILES","html","e","getDefaultSnippetStyle","contentClassName","transformSnippetLinks","renderedSnippetParent","alwaysOpenInNewWindow","logAnalytics","Dom","nodeListToArray","querySelectorAll","forEach","link","bindAnalyticsToLink","target","298","__extends","extendStatics","setPrototypeOf","__proto__","Array","d","b","__","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","apply","__generator","verb","v","op","f","TypeError","_","y","label","ops","pop","trys","push","g","sent","throw","return","Symbol","iterator","reasons","analytics","AnalyticsSmartSnippetFeedbackReason","DoesNotAnswer","localeKey","PartiallyAnswers","WasNotAQuestion","Other","hasDetails","BASE_CLASSNAME","CONTENT_CLASSNAME","SOURCE_CLASSNAME","SmartSnippetClassNames","QUESTION_CLASSNAME","ANSWER_CONTAINER_CLASSNAME","HAS_ANSWER_CLASSNAME","SHADOW_CLASSNAME","SOURCE_TITLE_CLASSNAME","SOURCE_URL_CLASSNAME","SmartSnippet","ID","lastRenderedResult","ComponentOptions","initComponentOptions","bind","onRootElement","QueryEvents","deferredQuerySuccess","data","handleQuerySuccess","_this","shadowLoading","styles","children","filter","HTMLScriptElement","type","toLowerCase","map","innerHTML","join","set","hasAnswer","toggleClass","createDom","appendChild","buildAnswerContainer","feedbackBanner","UserFeedbackBanner","isUseful","sendLikeSmartSnippetAnalytics","sendDislikeSmartSnippetAnalytics","openExplanationModal","build","explanationModal","ExplanationModal","reason","id","replace","onSelect","sendExplanationAnalytics","details","onClosed","sendCloseFeedbackModalAnalytics","searchInterface","modalContainer","modalBoxModule","buildQuestion","buildShadow","buildHeightLimiter","buildSourceContainer","questionContainer","shadowContainer","snippetContainer","attachShadow","mode","onSizeChanged","handleAnswerSizeChanged","useIFrame","shadow","style","buildStyle","heightLimiter","HeightLimiter","childNodes","item","maximumSnippetHeight","isExpanded","sendExpandSmartSnippetAnalytics","sendCollapseSmartSnippetAnalytics","toggleButton","sourceContainer","Utils","isNullOrUndefined","styleTag","createElement","onContentHeightChanged","getCorrespondingResult","lastResults","queryController","getLastResults","results","childResults","flatten","lastResult","attachments","find","compact","concat","raw","documentId","contentIdKey","contentIdValue","_a","containsQuestionAnswer","searchUid","render","question","ensureDom","reset","innerText","renderSnippet","renderSource","getSanitizedAnswerSnippet","sendClickSnippetLinkAnalytics","container","empty","append","renderSourceUrl","renderSourceTitle","buildLink","text","getFieldValue","titleField","href","addClass","ResultLink","hrefTemplate","sendClickSourceAnalytics","getBindings","resultElement","sendOpenFeedbackModalAnalytics","explainWhy","usageAnalytics","logCustomEvent","analyticsActionCauseList","likeSmartSnippet","searchQueryUid","dislikeSmartSnippet","expandSmartSnippet","collapseSmartSnippet","openSmartSnippetFeedbackModal","closeSmartSnippetFeedbackModal","sendSmartSnippetReason","logClickEvent","openSmartSnippetSource","documentTitle","author","documentURL","openSmartSnippetInlineLink","linkText","linkURL","doExport","exportGlobally","buildNumberOption","defaultValue","min","buildFieldOption","buildStringOption","buildBooleanOption","Component","Initialization","registerAutoCreateComponent","470","focusableSelector","hiddenElements","enable","chain","isVisible","sortBy","removeEventListener","focusInEvent","focusOutEvent","showHiddenElements","enabled","addEventListener","onFocusIn","onFocusOut","hideAllExcept","removeAttribute","hideElement","getAttribute","hideSiblings","allowedElement","parent","parentElement","without","elementToHide","getFocusableSibling","previous","elements","focusableElements","currentIndex","indexOf","focusSibling","sibling","focusFirstElement","elementIsBefore","oldElement","newElement","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","onLosingFocus","Defer","defer","focusIsAllowed","elementIsInPage","relatedTarget","474","executeOnlyOnce","once","longPressTimer","window","setTimeout","clearTimeout","522","elementOptions","autoUpdateContainer","contentBody","onLoad","shadowRootContainer","scrolling","contentDocument","margin","autoUpdateHeight","elementToResize","onUpdate","lastWidth","clientWidth","lastHeight","clientHeight","MutationObserver","width","height","observe","attributes","characterData","childList","subtree","534","560","587","588","global","factory","_typeof","obj","_setPrototypeOf","o","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","_construct","Parent","args","Class","a","Constructor","Function","instance","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","isArray","_arrayLikeToArray","iter","from","minLen","toString","slice","name","test","len","arr2","unapply","func","_len","_key","addToSet","array","transformCaseFunc","stringToLowerCase","lcElement","isFrozen","clone","object","property","newObject","lookupGetter","prop","fallbackValue","console","warn","desc","getOwnPropertyDescriptor","getPrototypeOf","createDOMPurify","undefined","getGlobal","DOMPurify","root","version","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Element","NodeFilter","_window$NamedNodeMap","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","ownerDocument","trustedTypesPolicy","_createTrustedTypesPolicy","emptyHTML","createHTML","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","documentMode","hooks","createHTMLDocument","PARSER_MEDIA_TYPE","MUSTACHE_EXPR$1","MUSTACHE_EXPR","ERB_EXPR$1","ERB_EXPR","DATA_ATTR$1","DATA_ATTR","ARIA_ATTR$1","ARIA_ATTR","IS_SCRIPT_OR_DATA$1","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE$1","ATTR_WHITESPACE","IS_ALLOWED_URI$1","IS_ALLOWED_URI","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","html$1","svg$1","svgFilters","mathMl$1","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","svg","mathMl","xml","CUSTOM_ELEMENT_HANDLING","seal","tagNameCheck","writable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","KEEP_CONTENT","IN_PLACE","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","RegExp","_parseConfig","cfg","x","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","freeze","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","svgDisallowed","ALL_MATHML_TAGS","mathMlDisallowed","_checkValidNamespace","tagName","namespaceURI","parentTagName","_forceRemove","node","arrayPush","parentNode","removeChild","outerHTML","remove","_removeAttribute","attribute","getAttributeNode","_initDocument","dirty","doc","leadingWhitespace","matches","stringMatch","dirtyPayload","parseFromString","documentElement","createDocument","insertBefore","createTextNode","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","_isNode","_executeHook","entryPoint","currentNode","arrayForEach","hook","_sanitizeElements","regExpTest","allowedTags","hasChildNodes","firstElementChild","_basicCustomElementTest","childCount","stringReplace","_isValidAttribute","lcTag","lcName","stringIndexOf","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","_attr","stringTrim","forceKeepAttr","getAttributeType","createScriptURL","setAttributeNS","arrayPop","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","importedNode","oldNode","returnNode","typeErrorCreate","toStaticHTML","firstChild","nodeIterator","shadowroot","serializedHTML","doctype","DOCTYPE_NAME","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","_ref","fun","thisValue","Func","String","match","trim","_len2","_key2","createPolicy","suffix","currentScript","hasAttribute","policyName","scriptUrl","70","os","debounce","saveLastQuery","escapedClickUri","logDocumentOpen","flush","globalOptions","originalOptionsObject","initialOptions","resultLinkOptions","componentOptionsModel","ComponentOptionsModel","attributesEnum","resultLink","extend","resolveResult","openQuickview","DeviceUtils","isMobileDevice","Assert","exists","quickviewShouldBeOpened","renderUri","bindEventToOpen","getDisplayedTitle","titleAsText","getDisplayedTitleAsText","openLink","location","getResultUri","openLinkInNewWindow","openLinkInOutlook","hasOutlookField","openLinkAsConfigured","toExecuteOnOpen","bindOnClickIfNotUndefined","bindOpenQuickviewIfNotUndefined","setHrefIfNotAlready","openLinkThatIsNotAnAnchor","titleTemplate","newTitle","StringUtils","buildStringTemplateFromResult","StreamHighlightUtils","highlightStreamText","termsToHighlight","phrasesToHighlight","HighlightUtils","highlightString","titleHighlights","setHtml","escape","clickUri","onClick","AccessibleButton","withElement","withLabel","withSelectAction","trigger","ResultListEvents","preventDefault","elementIsAnAnchor","openInOutlook","isNonEmptyString","documentOpen","filterProtocol","uri","isAbsolute","isRelative","field","setField","OSUtils","OS_NAME","MACOSX","WINDOWS","isUriThatMustBeOpenedInQuickview","QueryUtils","hasHTMLVersion","buildCustomOption","704","705","UsefulState","ROOT_CLASSNAME","LABEL_CLASSNAME","BUTTON_ACTIVE_CLASSNAME","ICON_CLASSNAME","THANK_YOU_BANNER_CLASSNAME","UserFeedbackBannerClassNames","CONTAINER_CLASSNAME","BUTTONS_CONTAINER_CLASSNAME","YES_BUTTON_CLASSNAME","NO_BUTTON_CLASSNAME","THANK_YOU_BANNER_ACTIVE_CLASSNAME","EXPLAIN_WHY_CLASSNAME","EXPLAIN_WHY_ACTIVE_CLASSNAME","sendUsefulnessAnalytics","onExplainWhyPressed","Unknown","labelId","uniqueId","ariaLive","buildContainer","buildThankYouBanner","yesButton","removeClass","noButton","thankYouBanner","ariaLabelledby","buildLabel","buildButtons","buildButton","action","requestExplaination","buttonsContainer","showThankYouBanner","icon","SVGIcons","icons","checkYes","ariaPressed","ariaDescribedby","clearSmall","button","Yes","No","706","BUTTON_CLASSNAME","HeightLimiterClassNames","CONTAINER_ACTIVE_CLASSNAME","CONTAINER_EXPANDED_CLASSNAME","BUTTON_LABEL_CLASSNAME","BUTTON_ICON_CLASSNAME","containerElement","contentElement","heightLimit","onToggle","updateActiveAppearance","ariaLabel","ariaHidden","buttonLabel","buttonIcon","toggle","updateButton","shouldBeActive","contentHeight","updateExpandedAppearance","arrowUp","arrowDown","707","EXPLANATION_SECTION_CLASSNAME","REASONS_CLASSNAME","REASONS_LABEL_CLASSNAME","DETAILS_SECTION_CLASSNAME","DETAILS_TEXTAREA_CLASSNAME","DETAILS_LABEL_CLASSNAME","BUTTONS_SECTION_CLASSNAME","SEND_BUTTON_CLASSNAME","CANCEL_BUTTON_CLASSNAME","DETAILS_ID","ExplanationModalClassNames","shouldCallCloseEvent","modal","sendButton","selectedReason","detailsTextArea","buildContent","buildExplanationSection","buildButtonsSection","detailsSection","buildDetailsSection","buildReasons","buildSendButton","buildCancelButton","reasonsContainer","buildReasonsLabel","buildReasonRadioButton","select","radioButton","getElement","for","disabled","RadioButton","isSelected","708","98","onChange","currentlySelected","getRadio","checked","triggerChange","getValue","getLabel","radioOption","radioInput","labelInput"],"mappings":"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","file":"SmartSnippet.min__7d400a8f34d33214ce02.js","sourcesContent":["webpackJsonpCoveo__temporary([18,42,56],{\n\n/***/ 179:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExternalModulesShim_1 = __webpack_require__(26);\nvar FocusTrap_1 = __webpack_require__(470);\nvar Strings_1 = __webpack_require__(6);\nvar Dom_1 = __webpack_require__(1);\nvar KeyboardUtils_1 = __webpack_require__(25);\nvar Core_1 = __webpack_require__(20);\nvar AccessibleModal = /** @class */ (function () {\n function AccessibleModal(className, ownerElement, modalboxModule, options) {\n if (modalboxModule === void 0) { modalboxModule = ExternalModulesShim_1.ModalBox; }\n if (options === void 0) { options = {}; }\n this.className = className;\n this.ownerElement = ownerElement;\n this.modalboxModule = modalboxModule;\n this.options = __assign({\n sizeMod: 'big'\n }, options);\n }\n Object.defineProperty(AccessibleModal.prototype, \"isOpen\", {\n get: function () {\n return !!this.focusTrap;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AccessibleModal.prototype, \"element\", {\n get: function () {\n return this.activeModal && this.activeModal.modalBox;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AccessibleModal.prototype, \"content\", {\n get: function () {\n return this.activeModal && this.activeModal.content;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AccessibleModal.prototype, \"wrapper\", {\n get: function () {\n return this.activeModal && this.activeModal.wrapper;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AccessibleModal.prototype, \"headerElement\", {\n get: function () {\n return this.element && this.element.querySelector('.coveo-modal-header h1');\n },\n enumerable: true,\n configurable: true\n });\n AccessibleModal.prototype.openResult = function (parameters) {\n if (this.isOpen) {\n return;\n }\n this.openModalAndTrap({\n content: parameters.content,\n validation: parameters.validation,\n origin: parameters.origin,\n title: Core_1.DomUtils.getQuickviewHeader(parameters.result, parameters.options, parameters.bindings).el\n });\n this.makeAccessible(parameters.options.title || parameters.result.title);\n };\n AccessibleModal.prototype.open = function (parameters) {\n if (this.isOpen) {\n return;\n }\n this.openModalAndTrap(parameters);\n this.makeAccessible();\n };\n AccessibleModal.prototype.openModalAndTrap = function (parameters) {\n var _this = this;\n this.initiallyFocusedElement = parameters.origin || document.activeElement;\n this.activeModal = this.modalboxModule.open(parameters.content, {\n title: parameters.title,\n className: this.className,\n validation: function () {\n _this.onModalClose();\n return parameters.validation();\n },\n body: this.ownerElement,\n sizeMod: this.options.sizeMod,\n overlayClose: this.options.overlayClose\n });\n this.focusTrap = new FocusTrap_1.FocusTrap(this.element);\n };\n AccessibleModal.prototype.close = function () {\n if (!this.isOpen) {\n return;\n }\n this.activeModal.close();\n this.activeModal = null;\n };\n AccessibleModal.prototype.makeAccessible = function (title) {\n this.element.setAttribute('aria-modal', 'true');\n if (title) {\n this.headerElement.setAttribute('aria-label', title);\n }\n this.makeCloseButtonAccessible();\n this.updateFocus();\n };\n Object.defineProperty(AccessibleModal.prototype, \"closeButton\", {\n get: function () {\n return this.element.querySelector('.coveo-small-close');\n },\n enumerable: true,\n configurable: true\n });\n AccessibleModal.prototype.makeCloseButtonAccessible = function () {\n var closeButton = this.closeButton;\n closeButton.setAttribute('aria-label', Strings_1.l('Close'));\n closeButton.setAttribute('role', 'button');\n closeButton.tabIndex = 0;\n Dom_1.$$(closeButton).on('keyup', KeyboardUtils_1.KeyboardUtils.keypressAction(KeyboardUtils_1.KEYBOARD.ENTER, function () { return closeButton.click(); }));\n };\n AccessibleModal.prototype.updateFocus = function () {\n var focusOnElement = (this.options.focusOnOpen && this.options.focusOnOpen()) || this.closeButton;\n focusOnElement.focus();\n };\n AccessibleModal.prototype.onModalClose = function () {\n this.focusTrap.disable();\n this.focusTrap = null;\n if (this.initiallyFocusedElement && document.body.contains(this.initiallyFocusedElement)) {\n this.initiallyFocusedElement.focus();\n }\n };\n return AccessibleModal;\n}());\nexports.AccessibleModal = AccessibleModal;\n\n\n/***/ }),\n\n/***/ 229:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dompurify_1 = __webpack_require__(588);\nvar Dom_1 = __webpack_require__(1);\nvar ResultLinkCommon_1 = __webpack_require__(474);\nexports.getDefaultSnippetStyle = function (contentClassName) { return \"\\n body {\\n font-family: \\\"Lato\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif, sans-serif;\\n }\\n\\n .\" + contentClassName + \" > :first-child {\\n margin-top: 0;\\n }\\n\\n .\" + contentClassName + \" > :last-child {\\n margin-bottom: 0;\\n }\\n\"; };\nfunction getSanitizedAnswerSnippet(questionAnswer) {\n if (!questionAnswer.answerSnippet) {\n return '';\n }\n // dompurify can fail to execute in some environment (salesforce locker service)\n try {\n return dompurify_1.sanitize(questionAnswer.answerSnippet, {\n USE_PROFILES: { html: true }\n });\n }\n catch (e) {\n return questionAnswer.answerSnippet;\n }\n}\nexports.getSanitizedAnswerSnippet = getSanitizedAnswerSnippet;\nexports.transformSnippetLinks = function (renderedSnippetParent, alwaysOpenInNewWindow, logAnalytics) {\n Dom_1.Dom.nodeListToArray(renderedSnippetParent.querySelectorAll('a')).forEach(function (link) {\n ResultLinkCommon_1.bindAnalyticsToLink(link, function () { return logAnalytics(link); });\n link.target = alwaysOpenInNewWindow ? '_blank' : '_top';\n });\n};\n\n\n/***/ }),\n\n/***/ 298:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExternalModulesShim_1 = __webpack_require__(26);\nvar GlobalExports_1 = __webpack_require__(3);\nvar Component_1 = __webpack_require__(7);\nvar Core_1 = __webpack_require__(20);\n__webpack_require__(704);\nvar underscore_1 = __webpack_require__(0);\nvar UserFeedbackBanner_1 = __webpack_require__(705);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar HeightLimiter_1 = __webpack_require__(706);\nvar ExplanationModal_1 = __webpack_require__(707);\nvar Strings_1 = __webpack_require__(6);\nvar AttachShadowPolyfill_1 = __webpack_require__(522);\nvar Utils_1 = __webpack_require__(4);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar SmartSnippetCommon_1 = __webpack_require__(229);\nvar ResultLink_1 = __webpack_require__(70);\nvar reasons = [\n {\n analytics: AnalyticsActionListMeta_1.AnalyticsSmartSnippetFeedbackReason.DoesNotAnswer,\n localeKey: 'UsefulnessFeedbackDoesNotAnswer'\n },\n {\n analytics: AnalyticsActionListMeta_1.AnalyticsSmartSnippetFeedbackReason.PartiallyAnswers,\n localeKey: 'UsefulnessFeedbackPartiallyAnswers'\n },\n {\n analytics: AnalyticsActionListMeta_1.AnalyticsSmartSnippetFeedbackReason.WasNotAQuestion,\n localeKey: 'UsefulnessFeedbackWasNotAQuestion'\n },\n {\n analytics: AnalyticsActionListMeta_1.AnalyticsSmartSnippetFeedbackReason.Other,\n localeKey: 'Other',\n hasDetails: true\n }\n];\nvar BASE_CLASSNAME = 'coveo-smart-snippet';\nvar QUESTION_CLASSNAME = BASE_CLASSNAME + \"-question\";\nvar ANSWER_CONTAINER_CLASSNAME = BASE_CLASSNAME + \"-answer\";\nvar HAS_ANSWER_CLASSNAME = BASE_CLASSNAME + \"-has-answer\";\nvar SHADOW_CLASSNAME = BASE_CLASSNAME + \"-content\";\nvar CONTENT_CLASSNAME = BASE_CLASSNAME + \"-content-wrapper\";\nvar SOURCE_CLASSNAME = BASE_CLASSNAME + \"-source\";\nvar SOURCE_TITLE_CLASSNAME = SOURCE_CLASSNAME + \"-title\";\nvar SOURCE_URL_CLASSNAME = SOURCE_CLASSNAME + \"-url\";\nexports.SmartSnippetClassNames = {\n QUESTION_CLASSNAME: QUESTION_CLASSNAME,\n ANSWER_CONTAINER_CLASSNAME: ANSWER_CONTAINER_CLASSNAME,\n HAS_ANSWER_CLASSNAME: HAS_ANSWER_CLASSNAME,\n SHADOW_CLASSNAME: SHADOW_CLASSNAME,\n CONTENT_CLASSNAME: CONTENT_CLASSNAME,\n SOURCE_CLASSNAME: SOURCE_CLASSNAME,\n SOURCE_TITLE_CLASSNAME: SOURCE_TITLE_CLASSNAME,\n SOURCE_URL_CLASSNAME: SOURCE_URL_CLASSNAME\n};\n/**\n * The SmartSnippet component displays the excerpt of a document that would be most likely to answer a particular query.\n *\n * This excerpt can be visually customized using inline styling.\n */\nvar SmartSnippet = /** @class */ (function (_super) {\n __extends(SmartSnippet, _super);\n function SmartSnippet(element, options, bindings, ModalBox) {\n if (ModalBox === void 0) { ModalBox = ExternalModulesShim_1.ModalBox; }\n var _this = _super.call(this, element, SmartSnippet.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.ModalBox = ModalBox;\n _this.lastRenderedResult = null;\n _this.options = ComponentOptions_1.ComponentOptions.initComponentOptions(element, SmartSnippet, options);\n _this.bind.onRootElement(Core_1.QueryEvents.deferredQuerySuccess, function (data) { return _this.handleQuerySuccess(data); });\n return _this;\n }\n Object.defineProperty(SmartSnippet.prototype, \"loading\", {\n get: function () {\n return this.shadowLoading;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SmartSnippet.prototype, \"style\", {\n get: function () {\n var styles = Core_1.$$(this.element)\n .children()\n .filter(function (element) { return element instanceof HTMLScriptElement && element.type.toLowerCase() === 'text/css'; })\n .map(function (element) { return element.innerHTML; });\n return styles.length ? styles.join('\\n') : null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SmartSnippet.prototype, \"hasAnswer\", {\n set: function (hasAnswer) {\n Core_1.$$(this.element).toggleClass(HAS_ANSWER_CLASSNAME, hasAnswer);\n },\n enumerable: true,\n configurable: true\n });\n SmartSnippet.prototype.createDom = function () {\n var _this = this;\n this.element.appendChild(this.buildAnswerContainer());\n this.feedbackBanner = new UserFeedbackBanner_1.UserFeedbackBanner(function (isUseful) { return (isUseful ? _this.sendLikeSmartSnippetAnalytics() : _this.sendDislikeSmartSnippetAnalytics()); }, function () { return _this.openExplanationModal(); });\n this.element.appendChild(this.feedbackBanner.build());\n this.explanationModal = new ExplanationModal_1.ExplanationModal({\n reasons: reasons.map(function (reason) {\n return ({\n label: Strings_1.l(reason.localeKey),\n id: reason.analytics.replace(/_/g, '-'),\n onSelect: function () { return _this.sendExplanationAnalytics(reason.analytics, _this.explanationModal.details); },\n hasDetails: reason.hasDetails\n });\n }),\n onClosed: function () { return _this.sendCloseFeedbackModalAnalytics(); },\n ownerElement: this.searchInterface.options.modalContainer,\n modalBoxModule: this.ModalBox\n });\n };\n SmartSnippet.prototype.buildAnswerContainer = function () {\n return Core_1.$$('div', {\n className: ANSWER_CONTAINER_CLASSNAME\n }, this.buildQuestion(), this.buildShadow(), this.buildHeightLimiter(), this.buildSourceContainer()).el;\n };\n SmartSnippet.prototype.buildQuestion = function () {\n return (this.questionContainer = Core_1.$$('div', { className: QUESTION_CLASSNAME }).el);\n };\n SmartSnippet.prototype.buildShadow = function () {\n var _this = this;\n this.shadowContainer = Core_1.$$('div', { className: SHADOW_CLASSNAME }).el;\n this.snippetContainer = Core_1.$$('section', { className: CONTENT_CLASSNAME }).el;\n this.shadowLoading = AttachShadowPolyfill_1.attachShadow(this.shadowContainer, {\n mode: 'open',\n title: Strings_1.l('AnswerSnippet'),\n onSizeChanged: function () { return _this.handleAnswerSizeChanged(); },\n useIFrame: this.options.useIFrame\n }).then(function (shadow) {\n shadow.appendChild(_this.snippetContainer);\n var style = _this.buildStyle();\n shadow.appendChild(style);\n return shadow;\n });\n return this.shadowContainer;\n };\n SmartSnippet.prototype.buildHeightLimiter = function () {\n var _this = this;\n return (this.heightLimiter = new HeightLimiter_1.HeightLimiter(this.shadowContainer, this.shadowContainer.childNodes.item(0), this.options.maximumSnippetHeight, function (isExpanded) { return (isExpanded ? _this.sendExpandSmartSnippetAnalytics() : _this.sendCollapseSmartSnippetAnalytics()); })).toggleButton;\n };\n SmartSnippet.prototype.buildSourceContainer = function () {\n return (this.sourceContainer = Core_1.$$('div', { className: SOURCE_CLASSNAME }).el);\n };\n SmartSnippet.prototype.buildStyle = function () {\n var style = Utils_1.Utils.isNullOrUndefined(this.style) ? SmartSnippetCommon_1.getDefaultSnippetStyle(CONTENT_CLASSNAME) : this.style;\n var styleTag = document.createElement('style');\n styleTag.innerHTML = style;\n return styleTag;\n };\n SmartSnippet.prototype.handleAnswerSizeChanged = function () {\n this.heightLimiter.onContentHeightChanged();\n };\n /**\n * @warning This method only works for the demo. In practice, the source of the answer will not always be part of the results.\n */\n SmartSnippet.prototype.getCorrespondingResult = function (questionAnswer) {\n var lastResults = this.queryController.getLastResults().results;\n var childResults = underscore_1.flatten(underscore_1.map(lastResults, function (lastResult) { return lastResult.childResults; }));\n var attachments = underscore_1.flatten(underscore_1.map(lastResults, function (lastResult) { return lastResult.attachments; }));\n return underscore_1.find(underscore_1.compact(lastResults.concat(childResults, attachments)), function (result) { return result.raw[questionAnswer.documentId.contentIdKey] === questionAnswer.documentId.contentIdValue; });\n };\n SmartSnippet.prototype.handleQuerySuccess = function (data) {\n return __awaiter(this, void 0, void 0, function () {\n var questionAnswer;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n questionAnswer = data.results.questionAnswer;\n if (!this.containsQuestionAnswer(questionAnswer)) {\n this.hasAnswer = false;\n return [2 /*return*/];\n }\n this.hasAnswer = true;\n this.searchUid = data.results.searchUid;\n return [4 /*yield*/, this.render(questionAnswer)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SmartSnippet.prototype.containsQuestionAnswer = function (questionAnswer) {\n return questionAnswer && questionAnswer.question && questionAnswer.answerSnippet;\n };\n SmartSnippet.prototype.render = function (questionAnswer) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n this.ensureDom();\n this.feedbackBanner.reset();\n this.questionContainer.innerText = questionAnswer.question;\n this.renderSnippet(questionAnswer);\n this.lastRenderedResult = this.getCorrespondingResult(questionAnswer);\n if (this.lastRenderedResult) {\n this.renderSource();\n }\n else {\n this.lastRenderedResult = null;\n }\n return [2 /*return*/];\n });\n });\n };\n SmartSnippet.prototype.renderSnippet = function (questionAnswer) {\n var _this = this;\n this.snippetContainer.innerHTML = SmartSnippetCommon_1.getSanitizedAnswerSnippet(questionAnswer);\n SmartSnippetCommon_1.transformSnippetLinks(this.snippetContainer, this.options.alwaysOpenInNewWindow, function (link) { return _this.sendClickSnippetLinkAnalytics(link); });\n };\n SmartSnippet.prototype.renderSource = function () {\n var container = Core_1.$$(this.sourceContainer);\n container.empty();\n container.append(this.renderSourceUrl().el);\n container.append(this.renderSourceTitle().el);\n };\n SmartSnippet.prototype.renderSourceTitle = function () {\n var link = this.buildLink(SOURCE_TITLE_CLASSNAME);\n link.text(Utils_1.Utils.getFieldValue(this.lastRenderedResult, this.options.titleField));\n return link;\n };\n SmartSnippet.prototype.renderSourceUrl = function () {\n var link = this.buildLink(SOURCE_URL_CLASSNAME);\n link.text(link.el.href);\n return link;\n };\n SmartSnippet.prototype.buildLink = function (className) {\n var _this = this;\n var element = Core_1.$$('a', { className: 'CoveoResultLink' });\n element.addClass(className);\n new ResultLink_1.ResultLink(element.el, {\n hrefTemplate: this.options.hrefTemplate,\n logAnalytics: function (href) { return _this.sendClickSourceAnalytics(element.el, href); },\n alwaysOpenInNewWindow: this.options.alwaysOpenInNewWindow\n }, __assign({}, this.getBindings(), { resultElement: this.element }), this.lastRenderedResult);\n return element;\n };\n SmartSnippet.prototype.openExplanationModal = function () {\n this.sendOpenFeedbackModalAnalytics();\n this.explanationModal.open(this.feedbackBanner.explainWhy);\n };\n SmartSnippet.prototype.sendLikeSmartSnippetAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.likeSmartSnippet, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendDislikeSmartSnippetAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.dislikeSmartSnippet, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendExpandSmartSnippetAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.expandSmartSnippet, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendCollapseSmartSnippetAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.collapseSmartSnippet, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendOpenFeedbackModalAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.openSmartSnippetFeedbackModal, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendCloseFeedbackModalAnalytics = function () {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.closeSmartSnippetFeedbackModal, { searchQueryUid: this.searchUid }, this.element);\n };\n SmartSnippet.prototype.sendExplanationAnalytics = function (reason, details) {\n return this.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.sendSmartSnippetReason, {\n searchQueryUid: this.searchUid,\n reason: reason,\n details: details\n }, this.element);\n };\n SmartSnippet.prototype.sendClickSourceAnalytics = function (element, href) {\n return this.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.openSmartSnippetSource, {\n searchQueryUid: this.searchUid,\n documentTitle: this.lastRenderedResult.title,\n author: Utils_1.Utils.getFieldValue(this.lastRenderedResult, 'author'),\n documentURL: href\n }, this.lastRenderedResult, element);\n };\n SmartSnippet.prototype.sendClickSnippetLinkAnalytics = function (link) {\n return this.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.openSmartSnippetInlineLink, {\n searchQueryUid: this.searchUid,\n linkText: link.innerText,\n linkURL: link.href\n }, this.lastRenderedResult, link);\n };\n SmartSnippet.ID = 'SmartSnippet';\n SmartSnippet.doExport = function () {\n GlobalExports_1.exportGlobally({\n SmartSnippet: SmartSnippet\n });\n };\n /**\n * The options for the SmartSnippet\n * @componentOptions\n */\n SmartSnippet.options = {\n /**\n * The maximum height an answer can have in pixels.\n * Any part of an answer exceeding this height will be hidden by default and expendable via a \"show more\" button.\n * Default value is `250`.\n */\n maximumSnippetHeight: ComponentOptions_1.ComponentOptions.buildNumberOption({ defaultValue: 250, min: 0 }),\n /**\n * The field to display for the title.\n */\n titleField: ComponentOptions_1.ComponentOptions.buildFieldOption({ defaultValue: '@title' }),\n /**\n * Specifies a template literal from which to generate the title and URI's `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link SmartSnippet.options.uriField} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies whether the component should open its links in a new window instead of opening them in the current\n * context.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specify if the SmartSnippet should be displayed inside an iframe or not.\n *\n * Use this option in specific cases where your environment has limitations around iframe usage.\n *\n * **Examples:**\n *\n * ```html\n * <div class='CoveoSmartSnippet' data-use-i-frame='true'></div>\n * ```\n *\n * Default value is `true`.\n */\n useIFrame: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n return SmartSnippet;\n}(Component_1.Component));\nexports.SmartSnippet = SmartSnippet;\nCore_1.Initialization.registerAutoCreateComponent(SmartSnippet);\n\n\n/***/ }),\n\n/***/ 470:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Defer_1 = __webpack_require__(31);\nvar underscore_1 = __webpack_require__(0);\nvar Dom_1 = __webpack_require__(1);\nvar FocusTrap = /** @class */ (function () {\n function FocusTrap(container, options) {\n if (options === void 0) { options = {\n focusableSelector: '[tabindex], button'\n }; }\n this.container = container;\n this.options = options;\n this.hiddenElements = [];\n this.enable();\n }\n Object.defineProperty(FocusTrap.prototype, \"focusableElements\", {\n get: function () {\n return underscore_1.chain(Dom_1.Dom.nodeListToArray(this.container.querySelectorAll(this.options.focusableSelector)))\n .filter(function (element) { return Dom_1.$$(element).isVisible(); })\n .sortBy(function (element) { return element.tabIndex; })\n .value();\n },\n enumerable: true,\n configurable: true\n });\n FocusTrap.prototype.disable = function () {\n document.removeEventListener('focusin', this.focusInEvent);\n document.removeEventListener('focusout', this.focusOutEvent);\n this.showHiddenElements();\n this.enabled = false;\n };\n FocusTrap.prototype.enable = function () {\n var _this = this;\n document.addEventListener('focusin', (this.focusInEvent = function (e) { return _this.onFocusIn(e); }));\n document.addEventListener('focusout', (this.focusOutEvent = function (e) { return _this.onFocusOut(e); }));\n this.hideAllExcept(this.container);\n this.enabled = true;\n };\n FocusTrap.prototype.showHiddenElements = function () {\n while (this.hiddenElements.length) {\n this.hiddenElements.pop().removeAttribute('aria-hidden');\n }\n };\n FocusTrap.prototype.hideElement = function (element) {\n if (element.getAttribute('aria-hidden')) {\n return;\n }\n this.hiddenElements.push(element);\n element.setAttribute('aria-hidden', \"\" + true);\n };\n FocusTrap.prototype.hideSiblings = function (allowedElement) {\n var _this = this;\n var parent = allowedElement.parentElement;\n if (parent) {\n underscore_1.without(Dom_1.$$(parent).children(), allowedElement).forEach(function (elementToHide) {\n _this.hideElement(elementToHide);\n });\n }\n };\n FocusTrap.prototype.hideAllExcept = function (allowedElement) {\n this.hideSiblings(allowedElement);\n var parent = allowedElement.parentElement;\n if (parent && parent !== document.body) {\n this.hideAllExcept(parent);\n }\n };\n FocusTrap.prototype.getFocusableSibling = function (element, previous) {\n if (previous === void 0) { previous = false; }\n var elements = this.focusableElements;\n var currentIndex = elements.indexOf(element);\n if (currentIndex === -1) {\n return null;\n }\n return elements[(currentIndex + (previous ? -1 : 1) + elements.length) % elements.length];\n };\n FocusTrap.prototype.focusSibling = function (element, previous) {\n if (previous === void 0) { previous = false; }\n var sibling = this.getFocusableSibling(element, previous);\n if (sibling) {\n sibling.focus();\n }\n };\n FocusTrap.prototype.focusFirstElement = function () {\n var elements = this.focusableElements;\n if (elements.length) {\n elements[0].focus();\n }\n };\n FocusTrap.prototype.elementIsBefore = function (oldElement, newElement) {\n if (!newElement) {\n return false;\n }\n return oldElement.compareDocumentPosition(newElement) === Node.DOCUMENT_POSITION_PRECEDING;\n };\n FocusTrap.prototype.onLosingFocus = function (oldElement, newElement) {\n var _this = this;\n Defer_1.Defer.defer(function () {\n if (!_this.enabled) {\n return;\n }\n _this.enabled = false;\n if (oldElement && _this.focusIsAllowed(oldElement)) {\n _this.focusSibling(oldElement, _this.elementIsBefore(oldElement, newElement));\n }\n else {\n _this.focusFirstElement();\n }\n _this.enabled = true;\n });\n };\n FocusTrap.prototype.focusIsAllowed = function (element) {\n return this.container.contains(element);\n };\n FocusTrap.prototype.elementIsInPage = function (element) {\n return element && element !== document.body.parentElement;\n };\n FocusTrap.prototype.onFocusIn = function (e) {\n if (!this.enabled) {\n return;\n }\n var oldElement = e.relatedTarget;\n var handledByFocusOut = this.elementIsInPage(oldElement);\n if (handledByFocusOut) {\n return;\n }\n var newElement = e.target;\n if (!this.elementIsInPage(newElement)) {\n return;\n }\n if (!this.focusIsAllowed(newElement)) {\n this.onLosingFocus(null, newElement);\n }\n };\n FocusTrap.prototype.onFocusOut = function (e) {\n if (!this.enabled) {\n return;\n }\n var newElement = e.relatedTarget;\n if (!this.elementIsInPage(newElement)) {\n return;\n }\n if (!newElement || !this.focusIsAllowed(newElement)) {\n this.onLosingFocus(e.target, newElement);\n }\n };\n return FocusTrap;\n}());\nexports.FocusTrap = FocusTrap;\n\n\n/***/ }),\n\n/***/ 474:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar Dom_1 = __webpack_require__(1);\nfunction bindAnalyticsToLink(element, logAnalytics) {\n var executeOnlyOnce = underscore_1.once(function () { return logAnalytics(); });\n Dom_1.$$(element).on(['contextmenu', 'click', 'mousedown', 'mouseup'], executeOnlyOnce);\n var longPressTimer;\n Dom_1.$$(element).on('touchstart', function () {\n longPressTimer = window.setTimeout(executeOnlyOnce, 1000);\n });\n Dom_1.$$(element).on('touchend', function () {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n }\n });\n}\nexports.bindAnalyticsToLink = bindAnalyticsToLink;\n\n\n/***/ }),\n\n/***/ 522:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\n__webpack_require__(587);\nfunction attachShadow(element, options) {\n return __awaiter(this, void 0, void 0, function () {\n var elementOptions, autoUpdateContainer, contentBody, onLoad, shadowRootContainer;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n elementOptions = { className: 'coveo-shadow-iframe', scrolling: 'no', title: options.title };\n if (!options.useIFrame) return [3 /*break*/, 2];\n autoUpdateContainer = Dom_1.$$('iframe', elementOptions).el;\n onLoad = new Promise(function (resolve) { return autoUpdateContainer.addEventListener('load', function () { return resolve(); }); });\n element.appendChild(autoUpdateContainer);\n return [4 /*yield*/, onLoad];\n case 1:\n _a.sent();\n contentBody = autoUpdateContainer.contentDocument.body;\n return [3 /*break*/, 3];\n case 2:\n autoUpdateContainer = Dom_1.$$('div', elementOptions).el;\n contentBody = autoUpdateContainer;\n element.appendChild(autoUpdateContainer);\n _a.label = 3;\n case 3:\n contentBody.style.margin = '0';\n shadowRootContainer = Dom_1.$$('div', { style: 'overflow: auto;' }).el;\n contentBody.appendChild(shadowRootContainer);\n autoUpdateHeight(autoUpdateContainer, shadowRootContainer, options.onSizeChanged);\n if (options.mode === 'open') {\n Object.defineProperty(element, 'shadowRoot', { get: function () { return shadowRootContainer; } });\n }\n return [2 /*return*/, shadowRootContainer];\n }\n });\n });\n}\nexports.attachShadow = attachShadow;\nfunction autoUpdateHeight(elementToResize, content, onUpdate) {\n var lastWidth = content.clientWidth;\n var lastHeight = content.clientHeight;\n var heightObserver = new MutationObserver(function () {\n if (lastWidth === content.clientWidth && lastHeight === content.clientHeight) {\n return;\n }\n lastWidth = content.clientWidth;\n lastHeight = content.clientHeight;\n elementToResize.style.width = content.clientWidth + \"px\";\n elementToResize.style.height = content.clientHeight + \"px\";\n if (onUpdate) {\n onUpdate();\n }\n });\n heightObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n}\n\n\n/***/ }),\n\n/***/ 534:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 560:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 587:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 588:\n/***/ (function(module, exports, __webpack_require__) {\n\n/*! @license DOMPurify 2.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.0/LICENSE */\n\n(function (global, factory) {\n true ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\n})(this, (function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var hasOwnProperty = Object.hasOwnProperty,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\n\n var _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\n\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n\n if (!construct) {\n construct = function construct(Func, args) {\n return _construct(Func, _toConsumableArray(args));\n };\n }\n\n var arrayForEach = unapply(Array.prototype.forEach);\n var arrayPop = unapply(Array.prototype.pop);\n var arrayPush = unapply(Array.prototype.push);\n var stringToLowerCase = unapply(String.prototype.toLowerCase);\n var stringMatch = unapply(String.prototype.match);\n var stringReplace = unapply(String.prototype.replace);\n var stringIndexOf = unapply(String.prototype.indexOf);\n var stringTrim = unapply(String.prototype.trim);\n var regExpTest = unapply(RegExp.prototype.test);\n var typeErrorCreate = unconstruct(TypeError);\n function unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return apply(func, thisArg, args);\n };\n }\n function unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return construct(func, args);\n };\n }\n /* Add properties to a lookup table */\n\n function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;\n\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n var l = array.length;\n\n while (l--) {\n var element = array[l];\n\n if (typeof element === 'string') {\n var lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n }\n /* Shallow clone an object */\n\n function clone(object) {\n var newObject = create(null);\n var property;\n\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n }\n /* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\n\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n }\n\n var html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); // SVG\n\n var svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n\n var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n var mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']); // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n\n var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n var text = freeze(['#text']);\n\n var html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\n var svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n var mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n\n var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\n var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n );\n var DOCTYPE_NAME = seal(/^html$/i);\n\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\n\n\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n } // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n\n\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html) {\n return html;\n },\n createScriptURL: function createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n\n\n DOMPurify.version = '2.4.0';\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n\n var originalDocument = window.document;\n var document = window.document;\n var DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n HTMLFormElement = window.HTMLFormElement,\n DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\n var ElementPrototype = Element.prototype;\n var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n var getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n\n var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n var _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n var hooks = {};\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n var MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n\n var ALLOWED_TAGS = null;\n var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text)));\n /* Allowed attribute names */\n\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n\n var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n\n var FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n\n var FORBID_ATTR = null;\n /* Decide if ARIA attributes are okay */\n\n var ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n\n var ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n\n var SAFE_FOR_TEMPLATES = false;\n /* Decide if document with <html>... should be returned */\n\n var WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n\n var SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n\n var FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n\n var RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n\n var RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n\n var RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n\n var SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n\n var SANITIZE_NAMED_PROPS = false;\n var SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n\n var KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n\n var IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n\n var USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n /* Parsing of strict XHTML documents */\n\n var PARSER_MEDIA_TYPE;\n var SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n var transformCaseFunc;\n /* Keep a reference to config to pass to hooks */\n\n var CONFIG = null;\n /* Ideally, do not touch anything below this line */\n\n /* ______________________________________________ */\n\n var formElement = document.createElement('form');\n\n var isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n\n\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n\n\n if (!cfg || _typeof(cfg) !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n\n\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n return x;\n } : stringToLowerCase;\n /* Set configuration parameters */\n\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n\n\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n ALLOWED_ATTR = [];\n\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n\n\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n\n\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n\n\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n\n\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n } // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n\n\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n\n var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n\n var ALL_SVG_TAGS = addToSet({}, svg$1);\n addToSet(ALL_SVG_TAGS, svgFilters);\n addToSet(ALL_SVG_TAGS, svgDisallowed);\n var ALL_MATHML_TAGS = addToSet({}, mathMl$1);\n addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n } // The only way to switch from MathML to SVG is via\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n\n\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n } // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n\n\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n } // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n\n\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n } // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n\n\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n } // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n\n\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n } // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n\n\n return false;\n };\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n\n\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n\n\n var _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n\n node.removeAttribute(name); // We void attribute values for unremovable \"is\"\" attributes\n\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n\n\n var _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n var doc;\n var leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n\n\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n } catch (_) {// Syntax error if dirtyPayload is invalid xml\n }\n }\n\n var body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n\n\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n\n\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n\n\n var _isClobbered = function _isClobbered(elm) {\n return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');\n };\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n\n\n var _isNode = function _isNode(object) {\n return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n };\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n\n\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n\n\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeElements', currentNode, null);\n /* Check if element is clobbered or can clobber */\n\n\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check if tagname contains Unicode */\n\n\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Now let's check the element's type and name */\n\n\n var tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n\n\n if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Mitigate a problem with templates inside select */\n\n\n if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Remove element if anything forbids its presence */\n\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;\n }\n /* Keep content except for bad-listed elements */\n\n\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n\n if (childNodes && parentNode) {\n var childCount = childNodes.length;\n\n for (var i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n }\n }\n }\n\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check whether element has a valid namespace */\n\n\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n\n if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Sanitize element content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n content = stringReplace(content, ERB_EXPR$1, ' ');\n\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n\n\n var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n\n\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (!value) ; else {\n return false;\n }\n\n return true;\n };\n /**\n * _basicCustomElementCheck\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n * @param {string} tagName name of the tag of the node to sanitize\n */\n\n\n var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n return tagName.indexOf('-') > 0;\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n\n\n var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n var attr;\n var value;\n var lcName;\n var l;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n var attributes = currentNode.attributes;\n /* Check if we have attributes; if not we might have a text node */\n\n if (!attributes) {\n return;\n }\n\n var hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n\n while (l--) {\n attr = attributes[l];\n var _attr = attr,\n name = _attr.name,\n namespaceURI = _attr.namespaceURI;\n value = name === 'value' ? attr.value : stringTrim(attr.value);\n lcName = transformCaseFunc(name);\n /* Execute a hook if present */\n\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Remove attribute */\n\n\n _removeAttribute(name, currentNode);\n /* Did the hooks approve of the attribute? */\n\n\n if (!hookEvent.keepAttr) {\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n\n\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n value = stringReplace(value, ERB_EXPR$1, ' ');\n }\n /* Is `value` valid for this attribute? */\n\n\n var lcTag = transformCaseFunc(currentNode.nodeName);\n\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n\n\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value\n\n\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Handle attributes that require Trusted Types */\n\n\n if (trustedTypesPolicy && _typeof(trustedTypes) === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n value = trustedTypesPolicy.createHTML(value);\n break;\n\n case 'TrustedScriptURL':\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n\n\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n\n\n var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n var shadowNode;\n\n var shadowIterator = _createIterator(fragment);\n /* Execute a hook if present */\n\n\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n /* Deep shadow DOM detected */\n\n\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(shadowNode);\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n\n\n DOMPurify.sanitize = function (dirty) {\n var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var body;\n var importedNode;\n var currentNode;\n var oldNode;\n var returnNode;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n\n IS_EMPTY_INPUT = !dirty;\n\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n\n\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n /* Check we can run. Otherwise fall back or ignore */\n\n\n if (!DOMPurify.isSupported) {\n if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n /* Assign config vars */\n\n\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n\n\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n var tagName = transformCaseFunc(dirty.nodeName);\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n\n\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n\n\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n\n\n var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n\n\n while (currentNode = nodeIterator.nextNode()) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n /* Shadow DOM detected, sanitize it */\n\n\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n /* If we sanitized `dirty` in-place, return it. */\n\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n\n\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (ALLOWED_ATTR.shadowroot) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n\n\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n\n SET_CONFIG = true;\n };\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n\n\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n\n\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n var lcTag = transformCaseFunc(tag);\n var lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n\n\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n\n\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n\n\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n\n\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n }\n\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n\n\n/***/ }),\n\n/***/ 70:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Component_1 = __webpack_require__(7);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar ComponentOptionsModel_1 = __webpack_require__(28);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar ResultListEvents_1 = __webpack_require__(29);\nvar HighlightUtils_1 = __webpack_require__(68);\nvar DeviceUtils_1 = __webpack_require__(24);\nvar OSUtils_1 = __webpack_require__(180);\nvar Initialization_1 = __webpack_require__(2);\nvar QueryUtils_1 = __webpack_require__(21);\nvar Assert_1 = __webpack_require__(5);\nvar Utils_1 = __webpack_require__(4);\nvar Defer_1 = __webpack_require__(31);\nvar Dom_1 = __webpack_require__(1);\nvar StreamHighlightUtils_1 = __webpack_require__(119);\nvar StringUtils_1 = __webpack_require__(22);\nvar underscore_1 = __webpack_require__(0);\nvar GlobalExports_1 = __webpack_require__(3);\n__webpack_require__(534);\nvar AccessibleButton_1 = __webpack_require__(15);\nvar ResultLinkCommon_1 = __webpack_require__(474);\n/**\n * The `ResultLink` component automatically transform a search result title into a clickable link pointing to the\n * original item.\n *\n * This component is a result template component (see [Result Templates](https://docs.coveo.com/en/413/)).\n */\nvar ResultLink = /** @class */ (function (_super) {\n __extends(ResultLink, _super);\n /**\n * Creates a new `ResultLink` component.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the `ResultLink` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n * @param result The result to associate the component with.\n * @param os\n */\n function ResultLink(element, options, bindings, result, os) {\n var _this = _super.call(this, element, ResultLink.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.bindings = bindings;\n _this.result = result;\n _this.os = os;\n _this.logAnalytics = underscore_1.debounce(function () {\n _this.queryController.saveLastQuery();\n var documentURL = Dom_1.$$(_this.element).getAttribute('href');\n if (documentURL == undefined || documentURL == '') {\n documentURL = _this.escapedClickUri;\n }\n if (_this.options.logAnalytics) {\n _this.options.logAnalytics(documentURL);\n }\n else {\n _this.logDocumentOpen(documentURL);\n }\n Defer_1.Defer.flush();\n }, 1500, true);\n var globalOptions = _this.searchInterface.options.originalOptionsObject[ResultLink.ID] || {};\n var initialOptions = ComponentOptions_1.ComponentOptions.initComponentOptions(element, ResultLink, __assign({}, globalOptions, options));\n var resultLinkOptions = _this.componentOptionsModel.get(ComponentOptionsModel_1.ComponentOptionsModel.attributesEnum.resultLink);\n _this.options = underscore_1.extend({}, initialOptions, resultLinkOptions);\n _this.result = result || _this.resolveResult();\n if (_this.options.openQuickview == null) {\n _this.options.openQuickview = result.raw['connectortype'] == 'ExchangeCrawler' && DeviceUtils_1.DeviceUtils.isMobileDevice();\n }\n if (!_this.element.hasAttribute('tabindex')) {\n _this.element.setAttribute('tabindex', '0');\n }\n Assert_1.Assert.exists(_this.componentOptionsModel);\n Assert_1.Assert.exists(_this.result);\n if (!_this.quickviewShouldBeOpened()) {\n // Bind on multiple \"click\" or \"mouse\" events.\n // Create a function that will be executed only once, so as not to log multiple events\n // Once a result link has been opened, and that we log at least one analytics event,\n // it should not matter if the end user open the same link multiple times with different methods.\n // It's still only one \"click\" event as far as UA is concerned.\n // Also need to handle \"longpress\" on mobile (the contextual menu), which we assume to be 1 s long.\n ResultLinkCommon_1.bindAnalyticsToLink(element, function () { return _this.logAnalytics(); });\n }\n _this.renderUri(element, result);\n _this.bindEventToOpen();\n return _this;\n }\n ResultLink.prototype.renderUri = function (element, result) {\n if (/^\\s*$/.test(this.element.innerHTML)) {\n var title = this.getDisplayedTitle();\n this.element.innerHTML = title;\n var titleAsText = this.getDisplayedTitleAsText();\n if (!this.element.hasAttribute('aria-label')) {\n this.element.setAttribute('aria-label', titleAsText);\n }\n if (!this.element.title) {\n this.element.title = titleAsText;\n }\n }\n };\n /**\n * Opens the result in the same window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLink = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.location.href = this.getResultUri();\n };\n /**\n * Opens the result in a new window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkInNewWindow = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.open(this.getResultUri(), '_blank');\n };\n /**\n * Tries to open the result in Microsoft Outlook if the result has an `outlookformacuri` or `outlookuri` field.\n *\n * Normally, this implies the result should be a link to an email.\n *\n * If the needed fields are not present, this method does nothing.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkInOutlook = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (this.hasOutlookField()) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.openLink();\n }\n };\n /**\n * Opens the link in the same manner the end user would.\n *\n * This essentially simulates a click on the result link.\n *\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkAsConfigured = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (this.toExecuteOnOpen) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.toExecuteOnOpen();\n }\n };\n ResultLink.prototype.bindEventToOpen = function () {\n return (this.bindOnClickIfNotUndefined() ||\n this.bindOpenQuickviewIfNotUndefined() ||\n this.setHrefIfNotAlready() ||\n this.openLinkThatIsNotAnAnchor());\n };\n ResultLink.prototype.getDisplayedTitle = function () {\n if (!this.options.titleTemplate) {\n return this.result.title\n ? HighlightUtils_1.HighlightUtils.highlightString(this.result.title, this.result.titleHighlights, null, 'coveo-highlight')\n : this.escapedClickUri;\n }\n else {\n var newTitle = StringUtils_1.StringUtils.buildStringTemplateFromResult(this.options.titleTemplate, this.result);\n return newTitle\n ? StreamHighlightUtils_1.StreamHighlightUtils.highlightStreamText(newTitle, this.result.termsToHighlight, this.result.phrasesToHighlight)\n : this.escapedClickUri;\n }\n };\n ResultLink.prototype.getDisplayedTitleAsText = function () {\n var container = Dom_1.$$('div');\n container.setHtml(this.getDisplayedTitle());\n return container.text();\n };\n Object.defineProperty(ResultLink.prototype, \"escapedClickUri\", {\n get: function () {\n return underscore_1.escape(this.result.clickUri);\n },\n enumerable: true,\n configurable: true\n });\n ResultLink.prototype.bindOnClickIfNotUndefined = function () {\n var _this = this;\n if (this.options.onClick != undefined) {\n this.toExecuteOnOpen = function (e) {\n _this.options.onClick.call(_this, e, _this.result);\n };\n new AccessibleButton_1.AccessibleButton()\n .withElement(this.element)\n .withLabel(this.result.title)\n .withSelectAction(function (e) { return _this.toExecuteOnOpen(e); })\n .build();\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.bindOpenQuickviewIfNotUndefined = function () {\n var _this = this;\n if (this.quickviewShouldBeOpened()) {\n this.toExecuteOnOpen = function () {\n Dom_1.$$(_this.bindings.resultElement).trigger(ResultListEvents_1.ResultListEvents.openQuickview);\n };\n Dom_1.$$(this.element).on('click', function (e) {\n e.preventDefault();\n _this.toExecuteOnOpen();\n });\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.openLinkThatIsNotAnAnchor = function () {\n var _this = this;\n if (!this.elementIsAnAnchor()) {\n this.toExecuteOnOpen = function () {\n if (_this.options.alwaysOpenInNewWindow) {\n if (_this.options.openInOutlook) {\n _this.openLinkInOutlook();\n }\n else {\n _this.openLinkInNewWindow();\n }\n }\n else {\n _this.openLink();\n }\n };\n Dom_1.$$(this.element).on('click', function () {\n _this.toExecuteOnOpen();\n });\n return true;\n }\n return false;\n };\n ResultLink.prototype.setHrefIfNotAlready = function () {\n // Do not erase any value put in href by the template, etc. Allows\n // using custom click urls while still keeping analytics recording\n // and other behavior brought by the component.\n if (this.elementIsAnAnchor() && !Utils_1.Utils.isNonEmptyString(Dom_1.$$(this.element).getAttribute('href'))) {\n Dom_1.$$(this.element).setAttribute('href', this.getResultUri());\n if (this.options.alwaysOpenInNewWindow && !(this.options.openInOutlook && this.hasOutlookField())) {\n Dom_1.$$(this.element).setAttribute('target', '_blank');\n }\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.logDocumentOpen = function (href) {\n this.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.documentOpen, {\n documentURL: href,\n documentTitle: this.result.title,\n author: Utils_1.Utils.getFieldValue(this.result, 'author')\n }, this.result, this.root);\n };\n ResultLink.prototype.filterProtocol = function (uri) {\n var isAbsolute = /^(https?|ftp|file|mailto|tel|sip):/i.test(uri);\n var isRelative = /^(\\/|\\.\\/|\\.\\.\\/)/.test(uri);\n return isAbsolute || isRelative ? uri : '';\n };\n ResultLink.prototype.getResultUri = function () {\n if (this.options.hrefTemplate) {\n var uri = StringUtils_1.StringUtils.buildStringTemplateFromResult(this.options.hrefTemplate, this.result);\n return this.filterProtocol(uri);\n }\n if (this.options.field == undefined && this.options.openInOutlook) {\n this.setField();\n }\n if (this.options.field != undefined) {\n return this.filterProtocol(Utils_1.Utils.getFieldValue(this.result, this.options.field));\n }\n return this.filterProtocol(this.result.clickUri);\n };\n ResultLink.prototype.elementIsAnAnchor = function () {\n return this.element.tagName == 'A';\n };\n ResultLink.prototype.setField = function () {\n var os = Utils_1.Utils.exists(this.os) ? this.os : OSUtils_1.OSUtils.get();\n if (os == OSUtils_1.OS_NAME.MACOSX && this.hasOutlookField()) {\n this.options.field = '@outlookformacuri';\n }\n else if (os == OSUtils_1.OS_NAME.WINDOWS && this.hasOutlookField()) {\n this.options.field = '@outlookuri';\n }\n };\n ResultLink.prototype.hasOutlookField = function () {\n var os = Utils_1.Utils.exists(this.os) ? this.os : OSUtils_1.OSUtils.get();\n if (os == OSUtils_1.OS_NAME.MACOSX && this.result.raw['outlookformacuri'] != undefined) {\n return true;\n }\n else if (os == OSUtils_1.OS_NAME.WINDOWS && this.result.raw['outlookuri'] != undefined) {\n return true;\n }\n return false;\n };\n ResultLink.prototype.isUriThatMustBeOpenedInQuickview = function () {\n return this.escapedClickUri.toLowerCase().indexOf('ldap://') == 0;\n };\n ResultLink.prototype.quickviewShouldBeOpened = function () {\n return (this.options.openQuickview || this.isUriThatMustBeOpenedInQuickview()) && QueryUtils_1.QueryUtils.hasHTMLVersion(this.result);\n };\n ResultLink.ID = 'ResultLink';\n ResultLink.doExport = function () {\n GlobalExports_1.exportGlobally({\n ResultLink: ResultLink\n });\n };\n /**\n * The options for the ResultLink\n * @componentOptions\n */\n ResultLink.options = {\n /**\n * Specifies the field to use to output the component `href` attribute value.\n *\n * **Tip:**\n * > Instead of specifying a value for the `field` option, you can directly add an `href` attribute to the\n * > `ResultLink` HTML element. Then, you can use a custom script to generate the `href` value.\n *\n * **Examples:**\n * - With the following markup, the `ResultLink` outputs its `href` value using the `@uri` field (rather than the\n * default field):\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-field=\"@uri\"></a>\n * ```\n *\n * - In the following result template, the custom `getMyKBUri()` function provides the `href` value:\n *\n * ```html\n * <script id=\"KnowledgeArticle\" type=\"text/underscore\" class=\"result-template\">\n * <div class='CoveoIcon>'></div>\n * <a class=\"CoveoResultLink\" href=\"<%= getMyKBUri(raw) %>\"></a>\n * <div class=\"CoveoExcerpt\"></div>\n * </script>\n * ```\n *\n * See also [`hrefTemplate`]{@link ResultLink.options.hrefTemplate}, which can override this option.\n *\n * By default, the component uses the `@clickUri` field of the item to output the value of its `href` attribute.\n */\n field: ComponentOptions_1.ComponentOptions.buildFieldOption(),\n /**\n * Specifies whether the component should try to open its link in Microsoft Outlook.\n *\n * Setting this option to `true` is normally useful for `ResultLink` instances related to Microsoft Exchange emails.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInOutlook`]{@link ResultLink.openLinkInOutlook} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * Default value is `false`.\n */\n openInOutlook: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies whether the component should open its link in the [`Quickview`]{@link Quickview} component rather than\n * loading through the original URL.\n *\n * Default value is `false`.\n */\n openQuickview: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies whether the component should open its link in a new window instead of opening it in the current\n * context.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInNewWindow`]{@link ResultLink.openLinkInNewWindow} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * **Note:**\n * > If a search page contains a [`ResultPreferences`]{@link ResultsPreferences} component whose\n * > [`enableOpenInNewWindow`]{@link ResultsPreferences.options.enableOpenInNewWindow} option is `true`, and the end\n * > user checks the <b>Always open results in new window</b> box, `ResultLink` components in this page will always\n * > open their links in a new window when the end user clicks them, no matter what the value of their\n * > `alwaysOpenInNewWindow` option is.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies a template literal from which to generate the `ResultLink` `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link ResultLink.options.field} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies a template literal from which to generate the `ResultLink` display title (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the default `ResultLink` display title behavior.\n *\n * The template literal can reference any number of fields from the parent result. However, if the template literal\n * references a key whose value is undefined in the parent result fields, the `ResultLink` title displays the\n * name of this key instead.\n *\n * This option is ignored if the `ResultLink` innerHTML contains any value.\n *\n * **Examples:**\n *\n * - The following markup generates a `ResultLink` display title such as `Case number: 123456` if both the\n * `raw.objecttype` and `raw.objectnumber` keys are defined in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${raw.objecttype} number: ${raw.objectnumber}\"></a>\n * ```\n *\n * - The following markup generates `${myField}` as a `ResultLink` display title if the `myField` key is undefined\n * in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${myField}\"></a>\n * ```\n *\n * - The following markup generates `Foobar` as a `ResultLink` display title, because the `ResultLink` innterHTML is\n * not empty:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${will} ${be} ${ignored}\">Foobar</a>\n * ```\n *\n * Default value is `undefined`.\n *\n * @availablesince [January 2017 Release (v1.1865.9)](https://docs.coveo.com/en/396/#january-2017-release-v118659)\n */\n titleTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies an event handler function to execute when the user clicks the `ResultLink` component.\n *\n * The handler function takes a JavaScript [`Event`](https://developer.mozilla.org/en/docs/Web/API/Event) object and\n * an [`IQueryResult`]{@link IQueryResult} as its parameters.\n *\n * Overriding the default behavior of the `onClick` event can allow you to execute specific code instead.\n *\n * **Note:**\n * > You cannot set this option directly in the component markup as an HTML attribute. You must either set it in the\n * > [`init`]{@link init} call of your search interface (see\n * > [Passing Component Options in the init Call](https://docs.coveo.com/en/346/#passing-component-options-in-the-init-call)),\n * > or before the `init` call, using the `options` top-level function (see\n * > [Passing Component Options Before the init Call](https://docs.coveo.com/en/346/#passing-component-options-before-the-init-call)).\n *\n * **Example:**\n * ```javascript\n * // You can set the option in the 'init' call:\n * Coveo.init(document.querySelector(\"#search\"), {\n * ResultLink : {\n * onClick : function(e, result) {\n * e.preventDefault();\n * // Custom code to execute with the item URI and title.\n * openUriInASpecialTab(result.clickUri, result.title);\n * }\n * }\n * });\n *\n * // Or before the 'init' call, using the 'options' top-level function:\n * // Coveo.options(document.querySelector('#search'), {\n * // ResultLink : {\n * // onClick : function(e, result) {\n * // e.preventDefault();\n * // // Custom code to execute with the item URI and title.\n * // openUriInASpecialTab(result.clickUri, result.title);\n * // }\n * // }\n * // });\n * ```\n */\n onClick: ComponentOptions_1.ComponentOptions.buildCustomOption(function () {\n return null;\n }),\n /**\n * Specify this option to log additional analytics when this result link is pressed.\n *\n * **Example:**\n * ```javascript\n * const resultLink = new Coveo.ResultLink(\n * linkElement,\n * {\n * logAnalytics: (href) => Coveo.logCustomEvent(\n * Coveo.analyticsActionCauseList.openSmartSnippetSource,\n * {\n * searchQueryUid: searchInterface.queryController.lastSearchUid,\n * documentTitle: result.title,\n * author: Utils.getFieldValue(result, 'author'),\n * documentURL: href\n * },\n * element\n * )\n * },\n * searchInterface.getBindings(),\n * result\n * )\n * ```\n */\n logAnalytics: ComponentOptions_1.ComponentOptions.buildCustomOption(function () { return null; })\n };\n return ResultLink;\n}(Component_1.Component));\nexports.ResultLink = ResultLink;\nInitialization_1.Initialization.registerAutoCreateComponent(ResultLink);\n\n\n/***/ }),\n\n/***/ 704:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 705:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar Strings_1 = __webpack_require__(6);\nvar SVGIcons_1 = __webpack_require__(12);\nvar underscore_1 = __webpack_require__(0);\nvar ROOT_CLASSNAME = 'coveo-user-feedback-banner';\nvar CONTAINER_CLASSNAME = ROOT_CLASSNAME + \"-container\";\nvar LABEL_CLASSNAME = ROOT_CLASSNAME + \"-label\";\nvar BUTTONS_CONTAINER_CLASSNAME = ROOT_CLASSNAME + \"-buttons\";\nvar YES_BUTTON_CLASSNAME = ROOT_CLASSNAME + \"-yes-button\";\nvar NO_BUTTON_CLASSNAME = ROOT_CLASSNAME + \"-no-button\";\nvar BUTTON_ACTIVE_CLASSNAME = ROOT_CLASSNAME + \"-button-active\";\nvar THANK_YOU_BANNER_CLASSNAME = ROOT_CLASSNAME + \"-thanks\";\nvar THANK_YOU_BANNER_ACTIVE_CLASSNAME = THANK_YOU_BANNER_CLASSNAME + \"-active\";\nvar ICON_CLASSNAME = THANK_YOU_BANNER_CLASSNAME + \"-icon\";\nvar EXPLAIN_WHY_CLASSNAME = ROOT_CLASSNAME + \"-explain-why\";\nvar EXPLAIN_WHY_ACTIVE_CLASSNAME = EXPLAIN_WHY_CLASSNAME + \"-active\";\nvar UsefulState;\n(function (UsefulState) {\n UsefulState[UsefulState[\"Unknown\"] = 0] = \"Unknown\";\n UsefulState[UsefulState[\"Yes\"] = 1] = \"Yes\";\n UsefulState[UsefulState[\"No\"] = 2] = \"No\";\n})(UsefulState || (UsefulState = {}));\nexports.UserFeedbackBannerClassNames = {\n ROOT_CLASSNAME: ROOT_CLASSNAME,\n CONTAINER_CLASSNAME: CONTAINER_CLASSNAME,\n LABEL_CLASSNAME: LABEL_CLASSNAME,\n BUTTONS_CONTAINER_CLASSNAME: BUTTONS_CONTAINER_CLASSNAME,\n YES_BUTTON_CLASSNAME: YES_BUTTON_CLASSNAME,\n NO_BUTTON_CLASSNAME: NO_BUTTON_CLASSNAME,\n BUTTON_ACTIVE_CLASSNAME: BUTTON_ACTIVE_CLASSNAME,\n THANK_YOU_BANNER_CLASSNAME: THANK_YOU_BANNER_CLASSNAME,\n THANK_YOU_BANNER_ACTIVE_CLASSNAME: THANK_YOU_BANNER_ACTIVE_CLASSNAME,\n ICON_CLASSNAME: ICON_CLASSNAME,\n EXPLAIN_WHY_CLASSNAME: EXPLAIN_WHY_CLASSNAME,\n EXPLAIN_WHY_ACTIVE_CLASSNAME: EXPLAIN_WHY_ACTIVE_CLASSNAME\n};\nvar UserFeedbackBanner = /** @class */ (function () {\n function UserFeedbackBanner(sendUsefulnessAnalytics, onExplainWhyPressed) {\n this.sendUsefulnessAnalytics = sendUsefulnessAnalytics;\n this.onExplainWhyPressed = onExplainWhyPressed;\n this.isUseful = UsefulState.Unknown;\n this.labelId = underscore_1.uniqueId(LABEL_CLASSNAME);\n }\n UserFeedbackBanner.prototype.build = function () {\n return Dom_1.$$('div', {\n className: ROOT_CLASSNAME,\n ariaLive: 'polite'\n }, this.buildContainer(), this.buildThankYouBanner()).el;\n };\n UserFeedbackBanner.prototype.reset = function () {\n this.isUseful = UsefulState.Unknown;\n Dom_1.$$(this.yesButton).removeClass(BUTTON_ACTIVE_CLASSNAME);\n Dom_1.$$(this.yesButton).setAttribute('aria-pressed', 'false');\n Dom_1.$$(this.noButton).removeClass(BUTTON_ACTIVE_CLASSNAME);\n Dom_1.$$(this.noButton).setAttribute('aria-pressed', 'false');\n Dom_1.$$(this.thankYouBanner).removeClass(THANK_YOU_BANNER_ACTIVE_CLASSNAME);\n Dom_1.$$(this.explainWhy).removeClass(EXPLAIN_WHY_ACTIVE_CLASSNAME);\n };\n UserFeedbackBanner.prototype.buildContainer = function () {\n return Dom_1.$$('div', {\n className: CONTAINER_CLASSNAME,\n ariaLabelledby: this.labelId\n }, this.buildLabel(), this.buildButtons()).el;\n };\n UserFeedbackBanner.prototype.buildLabel = function () {\n return Dom_1.$$('span', { className: LABEL_CLASSNAME, id: this.labelId }, Strings_1.l('UsefulnessFeedbackRequest')).el;\n };\n UserFeedbackBanner.prototype.buildThankYouBanner = function () {\n var _this = this;\n this.thankYouBanner = Dom_1.$$('div', { className: THANK_YOU_BANNER_CLASSNAME }).el;\n var text = Dom_1.$$('span', {}, Strings_1.l('UsefulnessFeedbackThankYou')).el;\n this.thankYouBanner.appendChild(text);\n this.explainWhy = this.buildButton({\n text: Strings_1.l('UsefulnessFeedbackExplainWhy'),\n className: EXPLAIN_WHY_CLASSNAME,\n action: function () { return _this.requestExplaination(); }\n });\n this.thankYouBanner.appendChild(this.explainWhy);\n return this.thankYouBanner;\n };\n UserFeedbackBanner.prototype.buildButtons = function () {\n var _this = this;\n var buttonsContainer = Dom_1.$$('div', { className: BUTTONS_CONTAINER_CLASSNAME }).el;\n this.yesButton = this.buildButton({\n text: Strings_1.l('Yes'),\n className: YES_BUTTON_CLASSNAME,\n action: function () { return _this.showThankYouBanner(true); },\n icon: {\n className: ICON_CLASSNAME,\n content: SVGIcons_1.SVGIcons.icons.checkYes\n },\n attributes: {\n ariaPressed: false,\n ariaDescribedby: this.labelId\n }\n });\n this.yesButton.setAttribute('aria-pressed', 'false');\n buttonsContainer.appendChild(this.yesButton);\n this.noButton = this.buildButton({\n text: Strings_1.l('No'),\n className: NO_BUTTON_CLASSNAME,\n action: function () { return _this.showThankYouBanner(false); },\n icon: {\n className: ICON_CLASSNAME,\n content: SVGIcons_1.SVGIcons.icons.clearSmall\n },\n attributes: {\n ariaPressed: false,\n ariaDescribedby: this.labelId\n }\n });\n buttonsContainer.appendChild(this.noButton);\n return buttonsContainer;\n };\n UserFeedbackBanner.prototype.buildButton = function (options) {\n var button = Dom_1.$$('button', __assign({}, (options.attributes || {}), { className: options.className, type: 'button' })).el;\n if (options.icon) {\n var icon = Dom_1.$$('span', { className: options.icon.className }, options.icon.content).el;\n button.appendChild(icon);\n var text = Dom_1.$$('span', {}, options.text).el;\n button.appendChild(text);\n }\n else {\n button.innerText = options.text;\n }\n button.addEventListener('click', function () { return options.action(); });\n return button;\n };\n UserFeedbackBanner.prototype.showThankYouBanner = function (isUseful) {\n if (this.isUseful !== UsefulState.Unknown && isUseful === (this.isUseful === UsefulState.Yes)) {\n return;\n }\n this.isUseful = isUseful ? UsefulState.Yes : UsefulState.No;\n Dom_1.$$(this.yesButton).toggleClass(BUTTON_ACTIVE_CLASSNAME, isUseful);\n Dom_1.$$(this.yesButton).setAttribute('aria-pressed', \"\" + isUseful);\n Dom_1.$$(this.noButton).toggleClass(BUTTON_ACTIVE_CLASSNAME, !isUseful);\n Dom_1.$$(this.noButton).setAttribute('aria-pressed', \"\" + !isUseful);\n Dom_1.$$(this.thankYouBanner).addClass(THANK_YOU_BANNER_ACTIVE_CLASSNAME);\n Dom_1.$$(this.explainWhy).toggleClass(EXPLAIN_WHY_ACTIVE_CLASSNAME, !isUseful);\n this.sendUsefulnessAnalytics(isUseful);\n };\n UserFeedbackBanner.prototype.requestExplaination = function () {\n this.onExplainWhyPressed();\n };\n return UserFeedbackBanner;\n}());\nexports.UserFeedbackBanner = UserFeedbackBanner;\n\n\n/***/ }),\n\n/***/ 706:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar SVGIcons_1 = __webpack_require__(12);\nvar Strings_1 = __webpack_require__(6);\nvar BASE_CLASSNAME = 'coveo-height-limiter';\nvar CONTAINER_ACTIVE_CLASSNAME = BASE_CLASSNAME + \"-container-active\";\nvar CONTAINER_EXPANDED_CLASSNAME = BASE_CLASSNAME + \"-container-expanded\";\nvar BUTTON_CLASSNAME = BASE_CLASSNAME + \"-button\";\nvar BUTTON_LABEL_CLASSNAME = BUTTON_CLASSNAME + \"-label\";\nvar BUTTON_ICON_CLASSNAME = BUTTON_CLASSNAME + \"-icon\";\nvar BUTTON_ACTIVE_CLASSNAME = BUTTON_CLASSNAME + \"-active\";\nexports.HeightLimiterClassNames = {\n CONTAINER_ACTIVE_CLASSNAME: CONTAINER_ACTIVE_CLASSNAME,\n CONTAINER_EXPANDED_CLASSNAME: CONTAINER_EXPANDED_CLASSNAME,\n BUTTON_CLASSNAME: BUTTON_CLASSNAME,\n BUTTON_LABEL_CLASSNAME: BUTTON_LABEL_CLASSNAME,\n BUTTON_ICON_CLASSNAME: BUTTON_ICON_CLASSNAME,\n BUTTON_ACTIVE_CLASSNAME: BUTTON_ACTIVE_CLASSNAME\n};\nvar HeightLimiter = /** @class */ (function () {\n function HeightLimiter(containerElement, contentElement, heightLimit, onToggle) {\n this.containerElement = containerElement;\n this.contentElement = contentElement;\n this.heightLimit = heightLimit;\n this.onToggle = onToggle;\n this.isExpanded = false;\n this.buildButton();\n this.updateActiveAppearance();\n }\n Object.defineProperty(HeightLimiter.prototype, \"toggleButton\", {\n get: function () {\n return this.button;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HeightLimiter.prototype, \"height\", {\n set: function (height) {\n this.containerElement.style.height = height + \"px\";\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HeightLimiter.prototype, \"contentHeight\", {\n get: function () {\n return this.contentElement.clientHeight;\n },\n enumerable: true,\n configurable: true\n });\n HeightLimiter.prototype.onContentHeightChanged = function () {\n this.updateActiveAppearance();\n };\n HeightLimiter.prototype.buildButton = function () {\n var _this = this;\n this.button = Dom_1.$$('button', { className: BUTTON_CLASSNAME, type: 'button', ariaLabel: Strings_1.l('ShowMore'), ariaPressed: 'false', ariaHidden: 'true' }, (this.buttonLabel = Dom_1.$$('span', { className: BUTTON_LABEL_CLASSNAME }).el), (this.buttonIcon = Dom_1.$$('span', { className: BUTTON_ICON_CLASSNAME }).el)).el;\n this.button.addEventListener('click', function () { return _this.toggle(); });\n this.updateButton();\n return this.button;\n };\n HeightLimiter.prototype.updateActiveAppearance = function () {\n var shouldBeActive = this.contentHeight > this.heightLimit;\n Dom_1.$$(this.containerElement).toggleClass(CONTAINER_ACTIVE_CLASSNAME, shouldBeActive);\n Dom_1.$$(this.button).toggleClass(BUTTON_ACTIVE_CLASSNAME, shouldBeActive);\n if (shouldBeActive) {\n this.updateExpandedAppearance();\n }\n else {\n this.isExpanded = false;\n this.updateExpandedAppearance();\n this.containerElement.style.height = '';\n }\n };\n HeightLimiter.prototype.updateButton = function () {\n this.buttonLabel.innerText = this.isExpanded ? Strings_1.l('ShowLess') : Strings_1.l('ShowMore');\n this.button.setAttribute('aria-pressed', \"\" + this.isExpanded);\n this.buttonIcon.innerHTML = this.isExpanded ? SVGIcons_1.SVGIcons.icons.arrowUp : SVGIcons_1.SVGIcons.icons.arrowDown;\n };\n HeightLimiter.prototype.updateExpandedAppearance = function () {\n this.updateButton();\n Dom_1.$$(this.containerElement).toggleClass(CONTAINER_EXPANDED_CLASSNAME, this.isExpanded);\n this.height = this.isExpanded ? this.contentHeight : this.heightLimit;\n };\n HeightLimiter.prototype.toggle = function () {\n this.isExpanded = !this.isExpanded;\n this.updateExpandedAppearance();\n if (this.onToggle) {\n this.onToggle(this.isExpanded);\n }\n };\n return HeightLimiter;\n}());\nexports.HeightLimiter = HeightLimiter;\n\n\n/***/ }),\n\n/***/ 707:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar AccessibleModal_1 = __webpack_require__(179);\nvar Strings_1 = __webpack_require__(6);\nvar Dom_1 = __webpack_require__(1);\nvar RadioButton_1 = __webpack_require__(98);\n__webpack_require__(708);\nvar ROOT_CLASSNAME = 'coveo-user-explanation-modal';\nvar CONTENT_CLASSNAME = ROOT_CLASSNAME + \"-content\";\nvar EXPLANATION_SECTION_CLASSNAME = ROOT_CLASSNAME + \"-explanation-section\";\nvar REASONS_CLASSNAME = ROOT_CLASSNAME + \"-explanations\";\nvar REASONS_LABEL_CLASSNAME = REASONS_CLASSNAME + \"-label\";\nvar DETAILS_SECTION_CLASSNAME = ROOT_CLASSNAME + \"-details\";\nvar DETAILS_TEXTAREA_CLASSNAME = DETAILS_SECTION_CLASSNAME + \"-textarea\";\nvar DETAILS_LABEL_CLASSNAME = DETAILS_SECTION_CLASSNAME + \"-label\";\nvar BUTTONS_SECTION_CLASSNAME = ROOT_CLASSNAME + \"-buttons-section\";\nvar SEND_BUTTON_CLASSNAME = ROOT_CLASSNAME + \"-send-button\";\nvar CANCEL_BUTTON_CLASSNAME = ROOT_CLASSNAME + \"-cancel-button\";\nvar DETAILS_ID = DETAILS_SECTION_CLASSNAME;\nexports.ExplanationModalClassNames = {\n ROOT_CLASSNAME: ROOT_CLASSNAME,\n CONTENT_CLASSNAME: CONTENT_CLASSNAME,\n EXPLANATION_SECTION_CLASSNAME: EXPLANATION_SECTION_CLASSNAME,\n REASONS_CLASSNAME: REASONS_CLASSNAME,\n REASONS_LABEL_CLASSNAME: REASONS_LABEL_CLASSNAME,\n DETAILS_SECTION_CLASSNAME: DETAILS_SECTION_CLASSNAME,\n DETAILS_TEXTAREA_CLASSNAME: DETAILS_TEXTAREA_CLASSNAME,\n DETAILS_LABEL_CLASSNAME: DETAILS_LABEL_CLASSNAME,\n BUTTONS_SECTION_CLASSNAME: BUTTONS_SECTION_CLASSNAME,\n SEND_BUTTON_CLASSNAME: SEND_BUTTON_CLASSNAME,\n CANCEL_BUTTON_CLASSNAME: CANCEL_BUTTON_CLASSNAME\n};\nvar ExplanationModal = /** @class */ (function () {\n function ExplanationModal(options) {\n var _this = this;\n this.options = options;\n this.shouldCallCloseEvent = false;\n this.modal = new AccessibleModal_1.AccessibleModal(ROOT_CLASSNAME, this.options.ownerElement, this.options.modalBoxModule, {\n focusOnOpen: function () { return _this.sendButton(); }\n });\n }\n ExplanationModal.prototype.sendButton = function () {\n return this.modal.element.querySelector(\".\" + REASONS_CLASSNAME + \" input\");\n };\n Object.defineProperty(ExplanationModal.prototype, \"details\", {\n get: function () {\n if (!this.selectedReason || !this.selectedReason.hasDetails) {\n return null;\n }\n return this.detailsTextArea.value;\n },\n enumerable: true,\n configurable: true\n });\n ExplanationModal.prototype.open = function (origin) {\n var _this = this;\n this.modal.open({\n origin: origin,\n title: Dom_1.$$('span', {}, Strings_1.l('UsefulnessFeedbackExplainWhyImperative')).el,\n content: this.buildContent(),\n validation: function () {\n if (_this.shouldCallCloseEvent) {\n _this.options.onClosed();\n _this.shouldCallCloseEvent = false;\n }\n return true;\n }\n });\n this.shouldCallCloseEvent = true;\n };\n ExplanationModal.prototype.buildContent = function () {\n return Dom_1.$$('div', {\n className: CONTENT_CLASSNAME\n }, this.buildExplanationSection(), this.buildButtonsSection()).el;\n };\n ExplanationModal.prototype.buildExplanationSection = function () {\n var detailsSection = this.buildDetailsSection();\n return Dom_1.$$('div', {\n className: EXPLANATION_SECTION_CLASSNAME\n }, this.buildReasons(), detailsSection).el;\n };\n ExplanationModal.prototype.buildButtonsSection = function () {\n return Dom_1.$$('div', {\n className: BUTTONS_SECTION_CLASSNAME\n }, this.buildSendButton(), this.buildCancelButton());\n };\n ExplanationModal.prototype.buildReasons = function () {\n var _this = this;\n var reasonsContainer = Dom_1.$$('fieldset', { className: REASONS_CLASSNAME }, this.buildReasonsLabel()).el;\n this.reasons = this.options.reasons.map(function (reason) { return _this.buildReasonRadioButton(reason); });\n this.reasons[0].select();\n this.reasons.forEach(function (radioButton) { return reasonsContainer.appendChild(radioButton.getElement()); });\n return reasonsContainer;\n };\n ExplanationModal.prototype.buildReasonsLabel = function () {\n return Dom_1.$$('legend', { className: REASONS_LABEL_CLASSNAME }, Strings_1.l('UsefulnessFeedbackReason')).el;\n };\n ExplanationModal.prototype.buildDetailsSection = function () {\n return (this.detailsSection = Dom_1.$$('div', { className: \"coveo-hidden \" + DETAILS_SECTION_CLASSNAME }, Dom_1.$$('label', { className: DETAILS_LABEL_CLASSNAME, for: DETAILS_ID }, Strings_1.l('Details')).el, (this.detailsTextArea = Dom_1.$$('textarea', { className: DETAILS_TEXTAREA_CLASSNAME, id: DETAILS_ID, disabled: true })\n .el)));\n };\n ExplanationModal.prototype.buildSendButton = function () {\n var _this = this;\n var button = Dom_1.$$('button', { className: SEND_BUTTON_CLASSNAME, type: 'button' }, Strings_1.l('Send'));\n button.on('click', function () {\n _this.selectedReason.onSelect();\n _this.shouldCallCloseEvent = false;\n _this.modal.close();\n });\n return button.el;\n };\n ExplanationModal.prototype.buildCancelButton = function () {\n var _this = this;\n var button = Dom_1.$$('button', { className: CANCEL_BUTTON_CLASSNAME, type: 'button' }, Strings_1.l('Cancel'));\n button.on('click', function () { return _this.modal.close(); });\n return button.el;\n };\n ExplanationModal.prototype.buildReasonRadioButton = function (reason) {\n var _this = this;\n return new RadioButton_1.RadioButton(function (radioButton) {\n if (!radioButton.isSelected()) {\n return;\n }\n _this.detailsSection.toggleClass('coveo-hidden', !reason.hasDetails);\n _this.detailsTextArea.disabled = !reason.hasDetails;\n _this.selectedReason = reason;\n }, reason.label, 'reason', \"coveo-reason-\" + reason.id);\n };\n return ExplanationModal;\n}());\nexports.ExplanationModal = ExplanationModal;\n\n\n/***/ }),\n\n/***/ 708:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 98:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\n__webpack_require__(560);\nvar GlobalExports_1 = __webpack_require__(3);\n/**\n * A radio button widget with standard styling.\n */\nvar RadioButton = /** @class */ (function () {\n /**\n * Creates a new `RadioButton`.\n * @param onChange The function to call when the radio button value changes. This function takes the current\n * `RadioButton` instance as an argument.\n * @param label The label to display next to the radio button.\n * @param name The value to set the `input` HTMLElement `name` attribute to.\n */\n function RadioButton(onChange, label, name, id) {\n if (onChange === void 0) { onChange = function (radioButton) { }; }\n if (id === void 0) { id = label; }\n this.onChange = onChange;\n this.label = label;\n this.name = name;\n this.id = id;\n this.buildContent();\n }\n RadioButton.doExport = function () {\n GlobalExports_1.exportGlobally({\n RadioButton: RadioButton\n });\n };\n /**\n * Resets the radio button.\n */\n RadioButton.prototype.reset = function () {\n var currentlySelected = this.isSelected();\n this.getRadio().checked = false;\n if (currentlySelected) {\n this.onChange(this);\n }\n };\n /**\n * Select the radio button\n * @param triggerChange will trigger change event if specified and the radio button is not already selected\n */\n RadioButton.prototype.select = function (triggerChange) {\n if (triggerChange === void 0) { triggerChange = true; }\n var currentlySelected = this.isSelected();\n this.getRadio().checked = true;\n if (!currentlySelected && triggerChange) {\n this.onChange(this);\n }\n };\n /**\n * Gets the element on which the radio button is bound.\n * @returns {HTMLElement} The radio button element.\n */\n RadioButton.prototype.build = function () {\n return this.element;\n };\n /**\n * Gets the element on which the radio button is bound.\n * @returns {HTMLElement} The radio button element.\n */\n RadioButton.prototype.getElement = function () {\n return this.element;\n };\n RadioButton.prototype.getValue = function () {\n return this.label;\n };\n /**\n * Indicates whether the radio button is selected.\n * @returns {boolean} `true` if the radio button is selected, `false` otherwise.\n */\n RadioButton.prototype.isSelected = function () {\n return this.getRadio().checked;\n };\n /**\n * Gets the `input` element (the radio button itself).\n * @returns {HTMLInputElement} The `input` element.\n */\n RadioButton.prototype.getRadio = function () {\n return Dom_1.$$(this.element).find('input');\n };\n /**\n * Gets the radio button [`label`]{@link RadioButton.label} element.\n * @returns {HTMLLabelElement} The `label` element.\n */\n RadioButton.prototype.getLabel = function () {\n return Dom_1.$$(this.element).find('label');\n };\n RadioButton.prototype.buildContent = function () {\n var _this = this;\n var radioOption = Dom_1.$$('div', { className: 'coveo-radio' });\n var radioInput = Dom_1.$$('input', { type: 'radio', name: this.name, id: this.id });\n var labelInput = Dom_1.$$('label', { className: 'coveo-radio-input-label', for: this.id });\n labelInput.text(this.label);\n radioInput.on('change', function () {\n _this.onChange(_this);\n });\n radioOption.append(radioInput.el);\n radioOption.append(labelInput.el);\n this.element = radioOption.el;\n };\n return RadioButton;\n}());\nexports.RadioButton = RadioButton;\n\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// SmartSnippet.min__7d400a8f34d33214ce02.js","import { ModalBox as ModalBoxModule } from '../ExternalModulesShim';\nimport { FocusTrap } from '../ui/FocusTrap/FocusTrap';\nimport { l } from '../strings/Strings';\nimport { $$ } from './Dom';\nimport { KeyboardUtils, KEYBOARD } from './KeyboardUtils';\nimport { IQuickViewHeaderOptions } from './DomUtils';\nimport { IQueryResult } from '../rest/QueryResult';\nimport { IComponentBindings } from '../ui/Base/ComponentBindings';\nimport { DomUtils } from '../Core';\n\nexport interface IAccessibleModalOptions {\n overlayClose?: boolean;\n sizeMod: 'small' | 'normal' | 'big';\n focusOnOpen?(): HTMLElement;\n}\n\nexport interface IAccessibleModalOpenParameters {\n content: HTMLElement;\n validation: () => boolean;\n origin: HTMLElement;\n}\n\nexport interface IAccessibleModalOpenResultParameters extends IAccessibleModalOpenParameters {\n result: IQueryResult;\n options: IQuickViewHeaderOptions;\n bindings: IComponentBindings;\n}\n\nexport interface IAccessibleModalOpenNormalParameters extends IAccessibleModalOpenParameters {\n title: HTMLElement;\n}\n\nexport class AccessibleModal {\n private focusTrap: FocusTrap;\n private activeModal: Coveo.ModalBox.ModalBox;\n private options: IAccessibleModalOptions;\n private initiallyFocusedElement: HTMLElement;\n\n public get isOpen() {\n return !!this.focusTrap;\n }\n\n public get element() {\n return this.activeModal && this.activeModal.modalBox;\n }\n\n public get content() {\n return this.activeModal && this.activeModal.content;\n }\n\n public get wrapper() {\n return this.activeModal && this.activeModal.wrapper;\n }\n\n private get headerElement() {\n return this.element && this.element.querySelector<HTMLElement>('.coveo-modal-header h1');\n }\n\n constructor(\n private className: string,\n private ownerElement: HTMLElement,\n private modalboxModule: Coveo.ModalBox.ModalBox = ModalBoxModule,\n options: Partial<IAccessibleModalOptions> = {}\n ) {\n this.options = {\n ...{\n sizeMod: 'big'\n },\n ...options\n };\n }\n\n public openResult(parameters: IAccessibleModalOpenResultParameters) {\n if (this.isOpen) {\n return;\n }\n this.openModalAndTrap({\n content: parameters.content,\n validation: parameters.validation,\n origin: parameters.origin,\n title: DomUtils.getQuickviewHeader(parameters.result, parameters.options, parameters.bindings).el\n });\n this.makeAccessible(parameters.options.title || parameters.result.title);\n }\n\n public open(parameters: IAccessibleModalOpenNormalParameters) {\n if (this.isOpen) {\n return;\n }\n this.openModalAndTrap(parameters);\n this.makeAccessible();\n }\n\n private openModalAndTrap(parameters: IAccessibleModalOpenNormalParameters) {\n this.initiallyFocusedElement = parameters.origin || (document.activeElement as HTMLElement);\n this.activeModal = this.modalboxModule.open(parameters.content, {\n title: parameters.title,\n className: this.className,\n validation: () => {\n this.onModalClose();\n return parameters.validation();\n },\n body: this.ownerElement,\n sizeMod: this.options.sizeMod,\n overlayClose: this.options.overlayClose\n });\n this.focusTrap = new FocusTrap(this.element);\n }\n\n public close() {\n if (!this.isOpen) {\n return;\n }\n this.activeModal.close();\n this.activeModal = null;\n }\n\n private makeAccessible(title?: string) {\n this.element.setAttribute('aria-modal', 'true');\n if (title) {\n this.headerElement.setAttribute('aria-label', title);\n }\n this.makeCloseButtonAccessible();\n this.updateFocus();\n }\n\n private get closeButton(): HTMLElement {\n return this.element.querySelector('.coveo-small-close');\n }\n\n private makeCloseButtonAccessible() {\n const closeButton = this.closeButton;\n closeButton.setAttribute('aria-label', l('Close'));\n closeButton.setAttribute('role', 'button');\n closeButton.tabIndex = 0;\n $$(closeButton).on(\n 'keyup',\n KeyboardUtils.keypressAction(KEYBOARD.ENTER, () => closeButton.click())\n );\n }\n\n private updateFocus() {\n const focusOnElement: HTMLElement = (this.options.focusOnOpen && this.options.focusOnOpen()) || this.closeButton;\n focusOnElement.focus();\n }\n\n private onModalClose() {\n this.focusTrap.disable();\n this.focusTrap = null;\n if (this.initiallyFocusedElement && document.body.contains(this.initiallyFocusedElement)) {\n this.initiallyFocusedElement.focus();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/AccessibleModal.ts","import { sanitize } from 'dompurify';\nimport { IQuestionAnswerResponse, IRelatedQuestionAnswerResponse } from '../../rest/QuestionAnswerResponse';\nimport { Dom } from '../../utils/Dom';\nimport { bindAnalyticsToLink } from '../ResultLink/ResultLinkCommon';\n\nexport const getDefaultSnippetStyle = (contentClassName: string) => `\n body {\n font-family: \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif, sans-serif;\n }\n\n .${contentClassName} > :first-child {\n margin-top: 0;\n }\n\n .${contentClassName} > :last-child {\n margin-bottom: 0;\n }\n`;\n\nexport function getSanitizedAnswerSnippet(questionAnswer: IQuestionAnswerResponse | IRelatedQuestionAnswerResponse) {\n if (!questionAnswer.answerSnippet) {\n return '';\n }\n // dompurify can fail to execute in some environment (salesforce locker service)\n try {\n return sanitize(questionAnswer.answerSnippet, {\n USE_PROFILES: { html: true }\n });\n } catch (e) {\n return questionAnswer.answerSnippet;\n }\n}\n\nexport const transformSnippetLinks = (\n renderedSnippetParent: HTMLElement,\n alwaysOpenInNewWindow: boolean,\n logAnalytics: (link: HTMLAnchorElement) => void\n) => {\n Dom.nodeListToArray(renderedSnippetParent.querySelectorAll('a')).forEach((link: HTMLAnchorElement) => {\n bindAnalyticsToLink(link, () => logAnalytics(link));\n link.target = alwaysOpenInNewWindow ? '_blank' : '_top';\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/SmartSnippetCommon.ts","import { ModalBox as ModalBoxModule } from '../../ExternalModulesShim';\nimport { exportGlobally } from '../../GlobalExports';\nimport { Component } from '../Base/Component';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { QueryEvents, Initialization, $$ } from '../../Core';\nimport { IQuerySuccessEventArgs } from '../../events/QueryEvents';\nimport { IQuestionAnswerResponse } from '../../rest/QuestionAnswerResponse';\nimport 'styling/_SmartSnippet';\nimport { find, map, flatten, compact } from 'underscore';\nimport { IQueryResult } from '../../rest/QueryResult';\nimport { UserFeedbackBanner } from './UserFeedbackBanner';\nimport {\n analyticsActionCauseList,\n IAnalyticsNoMeta,\n IAnalyticsSmartSnippetFeedbackMeta,\n AnalyticsSmartSnippetFeedbackReason,\n IAnalyticsSmartSnippetOpenSourceMeta,\n IAnalyticsSmartSnippetOpenSnippetInlineLinkMeta\n} from '../Analytics/AnalyticsActionListMeta';\nimport { HeightLimiter } from './HeightLimiter';\nimport { ExplanationModal, IReason } from './ExplanationModal';\nimport { l } from '../../strings/Strings';\nimport { attachShadow } from '../../misc/AttachShadowPolyfill';\nimport { Utils } from '../../utils/Utils';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { transformSnippetLinks, getDefaultSnippetStyle, getSanitizedAnswerSnippet } from './SmartSnippetCommon';\nimport { ResultLink } from '../ResultLink/ResultLink';\nimport { IFieldOption } from '../Base/IComponentOptions';\n\ninterface ISmartSnippetReason {\n analytics: AnalyticsSmartSnippetFeedbackReason;\n localeKey: string;\n hasDetails?: boolean;\n}\n\nconst reasons: ISmartSnippetReason[] = [\n {\n analytics: AnalyticsSmartSnippetFeedbackReason.DoesNotAnswer,\n localeKey: 'UsefulnessFeedbackDoesNotAnswer'\n },\n {\n analytics: AnalyticsSmartSnippetFeedbackReason.PartiallyAnswers,\n localeKey: 'UsefulnessFeedbackPartiallyAnswers'\n },\n {\n analytics: AnalyticsSmartSnippetFeedbackReason.WasNotAQuestion,\n localeKey: 'UsefulnessFeedbackWasNotAQuestion'\n },\n {\n analytics: AnalyticsSmartSnippetFeedbackReason.Other,\n localeKey: 'Other',\n hasDetails: true\n }\n];\n\nconst BASE_CLASSNAME = 'coveo-smart-snippet';\nconst QUESTION_CLASSNAME = `${BASE_CLASSNAME}-question`;\nconst ANSWER_CONTAINER_CLASSNAME = `${BASE_CLASSNAME}-answer`;\nconst HAS_ANSWER_CLASSNAME = `${BASE_CLASSNAME}-has-answer`;\nconst SHADOW_CLASSNAME = `${BASE_CLASSNAME}-content`;\nconst CONTENT_CLASSNAME = `${BASE_CLASSNAME}-content-wrapper`;\nconst SOURCE_CLASSNAME = `${BASE_CLASSNAME}-source`;\nconst SOURCE_TITLE_CLASSNAME = `${SOURCE_CLASSNAME}-title`;\nconst SOURCE_URL_CLASSNAME = `${SOURCE_CLASSNAME}-url`;\n\nexport const SmartSnippetClassNames = {\n QUESTION_CLASSNAME,\n ANSWER_CONTAINER_CLASSNAME,\n HAS_ANSWER_CLASSNAME,\n SHADOW_CLASSNAME,\n CONTENT_CLASSNAME,\n SOURCE_CLASSNAME,\n SOURCE_TITLE_CLASSNAME,\n SOURCE_URL_CLASSNAME\n};\n\nexport interface ISmartSnippetOptions {\n maximumSnippetHeight: number;\n titleField: IFieldOption;\n hrefTemplate?: string;\n alwaysOpenInNewWindow?: boolean;\n useIFrame?: boolean;\n}\n/**\n * The SmartSnippet component displays the excerpt of a document that would be most likely to answer a particular query.\n *\n * This excerpt can be visually customized using inline styling.\n */\nexport class SmartSnippet extends Component {\n static ID = 'SmartSnippet';\n\n static doExport = () => {\n exportGlobally({\n SmartSnippet\n });\n };\n\n /**\n * The options for the SmartSnippet\n * @componentOptions\n */\n static options: ISmartSnippetOptions = {\n /**\n * The maximum height an answer can have in pixels.\n * Any part of an answer exceeding this height will be hidden by default and expendable via a \"show more\" button.\n * Default value is `250`.\n */\n maximumSnippetHeight: ComponentOptions.buildNumberOption({ defaultValue: 250, min: 0 }),\n\n /**\n * The field to display for the title.\n */\n titleField: ComponentOptions.buildFieldOption({ defaultValue: '@title' }),\n\n /**\n * Specifies a template literal from which to generate the title and URI's `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link SmartSnippet.options.uriField} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies whether the component should open its links in a new window instead of opening them in the current\n * context.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specify if the SmartSnippet should be displayed inside an iframe or not.\n *\n * Use this option in specific cases where your environment has limitations around iframe usage.\n *\n * **Examples:**\n *\n * ```html\n * <div class='CoveoSmartSnippet' data-use-i-frame='true'></div>\n * ```\n *\n * Default value is `true`.\n */\n useIFrame: ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n\n private lastRenderedResult: IQueryResult = null;\n private searchUid: string;\n private questionContainer: HTMLElement;\n private shadowContainer: HTMLElement;\n private sourceContainer: HTMLElement;\n private snippetContainer: HTMLElement;\n private heightLimiter: HeightLimiter;\n private explanationModal: ExplanationModal;\n private feedbackBanner: UserFeedbackBanner;\n private shadowLoading: Promise<HTMLElement>;\n\n constructor(\n public element: HTMLElement,\n public options?: ISmartSnippetOptions,\n bindings?: IComponentBindings,\n private ModalBox = ModalBoxModule\n ) {\n super(element, SmartSnippet.ID, bindings);\n this.options = ComponentOptions.initComponentOptions(element, SmartSnippet, options);\n this.bind.onRootElement(QueryEvents.deferredQuerySuccess, (data: IQuerySuccessEventArgs) => this.handleQuerySuccess(data));\n }\n\n public get loading() {\n return this.shadowLoading;\n }\n\n private get style() {\n const styles = $$(this.element)\n .children()\n .filter(element => element instanceof HTMLScriptElement && element.type.toLowerCase() === 'text/css')\n .map(element => element.innerHTML);\n return styles.length ? styles.join('\\n') : null;\n }\n\n private set hasAnswer(hasAnswer: boolean) {\n $$(this.element).toggleClass(HAS_ANSWER_CLASSNAME, hasAnswer);\n }\n\n public createDom() {\n this.element.appendChild(this.buildAnswerContainer());\n this.feedbackBanner = new UserFeedbackBanner(\n isUseful => (isUseful ? this.sendLikeSmartSnippetAnalytics() : this.sendDislikeSmartSnippetAnalytics()),\n () => this.openExplanationModal()\n );\n this.element.appendChild(this.feedbackBanner.build());\n this.explanationModal = new ExplanationModal({\n reasons: reasons.map(\n reason =>\n <IReason>{\n label: l(reason.localeKey),\n id: reason.analytics.replace(/_/g, '-'),\n onSelect: () => this.sendExplanationAnalytics(reason.analytics, this.explanationModal.details),\n hasDetails: reason.hasDetails\n }\n ),\n onClosed: () => this.sendCloseFeedbackModalAnalytics(),\n ownerElement: this.searchInterface.options.modalContainer,\n modalBoxModule: this.ModalBox\n });\n }\n\n private buildAnswerContainer() {\n return $$(\n 'div',\n {\n className: ANSWER_CONTAINER_CLASSNAME\n },\n this.buildQuestion(),\n this.buildShadow(),\n this.buildHeightLimiter(),\n this.buildSourceContainer()\n ).el;\n }\n\n private buildQuestion() {\n return (this.questionContainer = $$('div', { className: QUESTION_CLASSNAME }).el);\n }\n\n private buildShadow() {\n this.shadowContainer = $$('div', { className: SHADOW_CLASSNAME }).el;\n this.snippetContainer = $$('section', { className: CONTENT_CLASSNAME }).el;\n this.shadowLoading = attachShadow(this.shadowContainer, {\n mode: 'open',\n title: l('AnswerSnippet'),\n onSizeChanged: () => this.handleAnswerSizeChanged(),\n useIFrame: this.options.useIFrame\n }).then(shadow => {\n shadow.appendChild(this.snippetContainer);\n const style = this.buildStyle();\n shadow.appendChild(style);\n return shadow;\n });\n return this.shadowContainer;\n }\n\n private buildHeightLimiter() {\n return (this.heightLimiter = new HeightLimiter(\n this.shadowContainer,\n this.shadowContainer.childNodes.item(0) as HTMLElement,\n this.options.maximumSnippetHeight,\n isExpanded => (isExpanded ? this.sendExpandSmartSnippetAnalytics() : this.sendCollapseSmartSnippetAnalytics())\n )).toggleButton;\n }\n\n private buildSourceContainer() {\n return (this.sourceContainer = $$('div', { className: SOURCE_CLASSNAME }).el);\n }\n\n private buildStyle() {\n const style = Utils.isNullOrUndefined(this.style) ? getDefaultSnippetStyle(CONTENT_CLASSNAME) : this.style;\n const styleTag = document.createElement('style');\n styleTag.innerHTML = style;\n return styleTag;\n }\n\n private handleAnswerSizeChanged() {\n this.heightLimiter.onContentHeightChanged();\n }\n\n /**\n * @warning This method only works for the demo. In practice, the source of the answer will not always be part of the results.\n */\n private getCorrespondingResult(questionAnswer: IQuestionAnswerResponse) {\n const lastResults = this.queryController.getLastResults().results;\n const childResults = flatten(map(lastResults, lastResult => lastResult.childResults)) as IQueryResult[];\n const attachments = flatten(map(lastResults, lastResult => lastResult.attachments)) as IQueryResult[];\n\n return find(\n compact(lastResults.concat(childResults, attachments)),\n result => result.raw[questionAnswer.documentId.contentIdKey] === questionAnswer.documentId.contentIdValue\n );\n }\n\n private async handleQuerySuccess(data: IQuerySuccessEventArgs) {\n const { questionAnswer } = data.results;\n if (!this.containsQuestionAnswer(questionAnswer)) {\n this.hasAnswer = false;\n return;\n }\n this.hasAnswer = true;\n this.searchUid = data.results.searchUid;\n await this.render(questionAnswer);\n }\n\n private containsQuestionAnswer(questionAnswer: IQuestionAnswerResponse) {\n return questionAnswer && questionAnswer.question && questionAnswer.answerSnippet;\n }\n\n private async render(questionAnswer: IQuestionAnswerResponse) {\n this.ensureDom();\n this.feedbackBanner.reset();\n this.questionContainer.innerText = questionAnswer.question;\n this.renderSnippet(questionAnswer);\n this.lastRenderedResult = this.getCorrespondingResult(questionAnswer);\n if (this.lastRenderedResult) {\n this.renderSource();\n } else {\n this.lastRenderedResult = null;\n }\n }\n\n private renderSnippet(questionAnswer: IQuestionAnswerResponse) {\n this.snippetContainer.innerHTML = getSanitizedAnswerSnippet(questionAnswer);\n transformSnippetLinks(this.snippetContainer, this.options.alwaysOpenInNewWindow, link => this.sendClickSnippetLinkAnalytics(link));\n }\n\n private renderSource() {\n const container = $$(this.sourceContainer);\n container.empty();\n container.append(this.renderSourceUrl().el);\n container.append(this.renderSourceTitle().el);\n }\n\n private renderSourceTitle() {\n const link = this.buildLink(SOURCE_TITLE_CLASSNAME);\n link.text(Utils.getFieldValue(this.lastRenderedResult, <string>this.options.titleField));\n return link;\n }\n\n private renderSourceUrl() {\n const link = this.buildLink(SOURCE_URL_CLASSNAME);\n link.text((link.el as HTMLAnchorElement).href);\n return link;\n }\n\n private buildLink(className: string) {\n const element = $$('a', { className: 'CoveoResultLink' });\n element.addClass(className);\n new ResultLink(\n element.el,\n {\n hrefTemplate: this.options.hrefTemplate,\n logAnalytics: href => this.sendClickSourceAnalytics(element.el, href),\n alwaysOpenInNewWindow: this.options.alwaysOpenInNewWindow\n },\n { ...this.getBindings(), resultElement: this.element },\n this.lastRenderedResult\n );\n return element;\n }\n\n private openExplanationModal() {\n this.sendOpenFeedbackModalAnalytics();\n this.explanationModal.open(this.feedbackBanner.explainWhy);\n }\n\n private sendLikeSmartSnippetAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.likeSmartSnippet,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendDislikeSmartSnippetAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.dislikeSmartSnippet,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendExpandSmartSnippetAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.expandSmartSnippet,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendCollapseSmartSnippetAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.collapseSmartSnippet,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendOpenFeedbackModalAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.openSmartSnippetFeedbackModal,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendCloseFeedbackModalAnalytics() {\n return this.usageAnalytics.logCustomEvent<IAnalyticsNoMeta>(\n analyticsActionCauseList.closeSmartSnippetFeedbackModal,\n { searchQueryUid: this.searchUid },\n this.element\n );\n }\n\n private sendExplanationAnalytics(reason: AnalyticsSmartSnippetFeedbackReason, details?: string) {\n return this.usageAnalytics.logCustomEvent<IAnalyticsSmartSnippetFeedbackMeta>(\n analyticsActionCauseList.sendSmartSnippetReason,\n {\n searchQueryUid: this.searchUid,\n reason,\n details\n },\n this.element\n );\n }\n\n private sendClickSourceAnalytics(element: HTMLElement, href: string) {\n return this.usageAnalytics.logClickEvent<IAnalyticsSmartSnippetOpenSourceMeta>(\n analyticsActionCauseList.openSmartSnippetSource,\n {\n searchQueryUid: this.searchUid,\n documentTitle: this.lastRenderedResult.title,\n author: Utils.getFieldValue(this.lastRenderedResult, 'author'),\n documentURL: href\n },\n this.lastRenderedResult,\n element\n );\n }\n\n private sendClickSnippetLinkAnalytics(link: HTMLAnchorElement) {\n return this.usageAnalytics.logClickEvent<IAnalyticsSmartSnippetOpenSnippetInlineLinkMeta>(\n analyticsActionCauseList.openSmartSnippetInlineLink,\n {\n searchQueryUid: this.searchUid,\n linkText: link.innerText,\n linkURL: link.href\n },\n this.lastRenderedResult,\n link\n );\n }\n}\nInitialization.registerAutoCreateComponent(SmartSnippet);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/SmartSnippet.ts","import { Defer } from '../../misc/Defer';\nimport { without, chain } from 'underscore';\nimport { $$, Dom } from '../../utils/Dom';\n\nexport interface FocusTrapOptions {\n focusableSelector: string;\n}\n\nexport class FocusTrap {\n private focusInEvent: (e: FocusEvent) => void;\n private focusOutEvent: (e: FocusEvent) => void;\n private hiddenElements: HTMLElement[];\n private enabled: boolean;\n\n private get focusableElements(): HTMLElement[] {\n return chain(Dom.nodeListToArray(this.container.querySelectorAll(this.options.focusableSelector)))\n .filter(element => $$(element).isVisible())\n .sortBy(element => element.tabIndex)\n .value();\n }\n\n constructor(\n private container: HTMLElement,\n private options: FocusTrapOptions = {\n focusableSelector: '[tabindex], button'\n }\n ) {\n this.hiddenElements = [];\n this.enable();\n }\n\n public disable() {\n document.removeEventListener('focusin', this.focusInEvent);\n document.removeEventListener('focusout', this.focusOutEvent);\n this.showHiddenElements();\n this.enabled = false;\n }\n\n private enable() {\n document.addEventListener('focusin', (this.focusInEvent = e => this.onFocusIn(e)));\n document.addEventListener('focusout', (this.focusOutEvent = e => this.onFocusOut(e)));\n this.hideAllExcept(this.container);\n this.enabled = true;\n }\n\n private showHiddenElements() {\n while (this.hiddenElements.length) {\n this.hiddenElements.pop().removeAttribute('aria-hidden');\n }\n }\n\n private hideElement(element: HTMLElement) {\n if (element.getAttribute('aria-hidden')) {\n return;\n }\n this.hiddenElements.push(element);\n element.setAttribute('aria-hidden', `${true}`);\n }\n\n private hideSiblings(allowedElement: HTMLElement) {\n const parent = allowedElement.parentElement;\n if (parent) {\n without($$(parent).children(), allowedElement).forEach(elementToHide => {\n this.hideElement(elementToHide);\n });\n }\n }\n\n private hideAllExcept(allowedElement: HTMLElement) {\n this.hideSiblings(allowedElement);\n const parent = allowedElement.parentElement;\n if (parent && parent !== document.body) {\n this.hideAllExcept(parent);\n }\n }\n\n private getFocusableSibling(element: HTMLElement, previous = false) {\n const elements = this.focusableElements;\n const currentIndex = elements.indexOf(element);\n if (currentIndex === -1) {\n return null;\n }\n return elements[(currentIndex + (previous ? -1 : 1) + elements.length) % elements.length];\n }\n\n private focusSibling(element: HTMLElement, previous = false) {\n const sibling = this.getFocusableSibling(element, previous);\n if (sibling) {\n sibling.focus();\n }\n }\n\n private focusFirstElement() {\n const elements = this.focusableElements;\n if (elements.length) {\n elements[0].focus();\n }\n }\n\n private elementIsBefore(oldElement: HTMLElement, newElement: HTMLElement) {\n if (!newElement) {\n return false;\n }\n return oldElement.compareDocumentPosition(newElement) === Node.DOCUMENT_POSITION_PRECEDING;\n }\n\n private onLosingFocus(oldElement: HTMLElement, newElement: HTMLElement) {\n Defer.defer(() => {\n if (!this.enabled) {\n return;\n }\n this.enabled = false;\n if (oldElement && this.focusIsAllowed(oldElement)) {\n this.focusSibling(oldElement, this.elementIsBefore(oldElement, newElement));\n } else {\n this.focusFirstElement();\n }\n this.enabled = true;\n });\n }\n\n private focusIsAllowed(element: HTMLElement) {\n return this.container.contains(element);\n }\n\n private elementIsInPage(element: HTMLElement) {\n return element && element !== document.body.parentElement;\n }\n\n private onFocusIn(e: FocusEvent) {\n if (!this.enabled) {\n return;\n }\n const oldElement = e.relatedTarget as HTMLElement;\n const handledByFocusOut = this.elementIsInPage(oldElement);\n if (handledByFocusOut) {\n return;\n }\n const newElement = e.target as HTMLElement;\n if (!this.elementIsInPage(newElement)) {\n return;\n }\n if (!this.focusIsAllowed(newElement)) {\n this.onLosingFocus(null, newElement);\n }\n }\n\n private onFocusOut(e: FocusEvent) {\n if (!this.enabled) {\n return;\n }\n const newElement = e.relatedTarget as HTMLElement;\n if (!this.elementIsInPage(newElement)) {\n return;\n }\n if (!newElement || !this.focusIsAllowed(newElement)) {\n this.onLosingFocus(e.target as HTMLElement, newElement);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/FocusTrap/FocusTrap.ts","import { once } from 'underscore';\nimport { $$ } from '../../utils/Dom';\n\nexport function bindAnalyticsToLink(element: HTMLElement, logAnalytics: () => void) {\n const executeOnlyOnce = once(() => logAnalytics());\n\n $$(element).on(['contextmenu', 'click', 'mousedown', 'mouseup'], executeOnlyOnce);\n let longPressTimer: number;\n $$(element).on('touchstart', () => {\n longPressTimer = window.setTimeout(executeOnlyOnce, 1000);\n });\n $$(element).on('touchend', () => {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/ResultLink/ResultLinkCommon.ts","import { $$ } from '../utils/Dom';\nimport 'styling/_AttachShadowPolyfill';\n\nexport interface IShadowOptions {\n title: string;\n onSizeChanged?: Function;\n useIFrame?: Boolean;\n}\n\nexport async function attachShadow(element: HTMLElement, options: IShadowOptions & ShadowRootInit): Promise<HTMLElement> {\n const elementOptions = { className: 'coveo-shadow-iframe', scrolling: 'no', title: options.title };\n let autoUpdateContainer: HTMLIFrameElement | HTMLElement;\n let contentBody: HTMLElement;\n if (options.useIFrame) {\n autoUpdateContainer = $$('iframe', elementOptions).el;\n const onLoad = new Promise(resolve => autoUpdateContainer.addEventListener('load', () => resolve()));\n element.appendChild(autoUpdateContainer);\n await onLoad;\n contentBody = (autoUpdateContainer as HTMLIFrameElement).contentDocument.body;\n } else {\n autoUpdateContainer = $$('div', elementOptions).el;\n contentBody = autoUpdateContainer;\n element.appendChild(autoUpdateContainer);\n }\n\n contentBody.style.margin = '0';\n const shadowRootContainer = $$('div', { style: 'overflow: auto;' }).el;\n contentBody.appendChild(shadowRootContainer);\n autoUpdateHeight(autoUpdateContainer, shadowRootContainer, options.onSizeChanged);\n if (options.mode === 'open') {\n Object.defineProperty(element, 'shadowRoot', { get: () => shadowRootContainer });\n }\n\n return shadowRootContainer;\n}\n\nfunction autoUpdateHeight(elementToResize: HTMLElement, content: HTMLElement, onUpdate?: Function) {\n let lastWidth = content.clientWidth;\n let lastHeight = content.clientHeight;\n\n const heightObserver = new MutationObserver(() => {\n if (lastWidth === content.clientWidth && lastHeight === content.clientHeight) {\n return;\n }\n lastWidth = content.clientWidth;\n lastHeight = content.clientHeight;\n elementToResize.style.width = `${content.clientWidth}px`;\n elementToResize.style.height = `${content.clientHeight}px`;\n if (onUpdate) {\n onUpdate();\n }\n });\n heightObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/misc/AttachShadowPolyfill.ts","/*! @license DOMPurify 2.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.0/LICENSE */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\n})(this, (function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var hasOwnProperty = Object.hasOwnProperty,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\n\n var _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\n\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n\n if (!construct) {\n construct = function construct(Func, args) {\n return _construct(Func, _toConsumableArray(args));\n };\n }\n\n var arrayForEach = unapply(Array.prototype.forEach);\n var arrayPop = unapply(Array.prototype.pop);\n var arrayPush = unapply(Array.prototype.push);\n var stringToLowerCase = unapply(String.prototype.toLowerCase);\n var stringMatch = unapply(String.prototype.match);\n var stringReplace = unapply(String.prototype.replace);\n var stringIndexOf = unapply(String.prototype.indexOf);\n var stringTrim = unapply(String.prototype.trim);\n var regExpTest = unapply(RegExp.prototype.test);\n var typeErrorCreate = unconstruct(TypeError);\n function unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return apply(func, thisArg, args);\n };\n }\n function unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return construct(func, args);\n };\n }\n /* Add properties to a lookup table */\n\n function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;\n\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n var l = array.length;\n\n while (l--) {\n var element = array[l];\n\n if (typeof element === 'string') {\n var lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n }\n /* Shallow clone an object */\n\n function clone(object) {\n var newObject = create(null);\n var property;\n\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n }\n /* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\n\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n }\n\n var html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); // SVG\n\n var svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n\n var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n var mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']); // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n\n var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n var text = freeze(['#text']);\n\n var html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\n var svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n var mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n\n var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\n var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n );\n var DOCTYPE_NAME = seal(/^html$/i);\n\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\n\n\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n } // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n\n\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html) {\n return html;\n },\n createScriptURL: function createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n\n\n DOMPurify.version = '2.4.0';\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n\n var originalDocument = window.document;\n var document = window.document;\n var DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n HTMLFormElement = window.HTMLFormElement,\n DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\n var ElementPrototype = Element.prototype;\n var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n var getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n\n var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n var _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n var hooks = {};\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n var MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n\n var ALLOWED_TAGS = null;\n var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text)));\n /* Allowed attribute names */\n\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n\n var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n\n var FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n\n var FORBID_ATTR = null;\n /* Decide if ARIA attributes are okay */\n\n var ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n\n var ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n\n var SAFE_FOR_TEMPLATES = false;\n /* Decide if document with <html>... should be returned */\n\n var WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n\n var SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n\n var FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n\n var RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n\n var RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n\n var RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n\n var SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n\n var SANITIZE_NAMED_PROPS = false;\n var SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n\n var KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n\n var IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n\n var USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n /* Parsing of strict XHTML documents */\n\n var PARSER_MEDIA_TYPE;\n var SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n var transformCaseFunc;\n /* Keep a reference to config to pass to hooks */\n\n var CONFIG = null;\n /* Ideally, do not touch anything below this line */\n\n /* ______________________________________________ */\n\n var formElement = document.createElement('form');\n\n var isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n\n\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n\n\n if (!cfg || _typeof(cfg) !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n\n\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n return x;\n } : stringToLowerCase;\n /* Set configuration parameters */\n\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n\n\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n ALLOWED_ATTR = [];\n\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n\n\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n\n\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n\n\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n\n\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n } // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n\n\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n\n var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n\n var ALL_SVG_TAGS = addToSet({}, svg$1);\n addToSet(ALL_SVG_TAGS, svgFilters);\n addToSet(ALL_SVG_TAGS, svgDisallowed);\n var ALL_MATHML_TAGS = addToSet({}, mathMl$1);\n addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n } // The only way to switch from MathML to SVG is via\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n\n\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n } // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n\n\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n } // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n\n\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n } // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n\n\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n } // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n\n\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n } // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n\n\n return false;\n };\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n\n\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n\n\n var _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n\n node.removeAttribute(name); // We void attribute values for unremovable \"is\"\" attributes\n\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n\n\n var _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n var doc;\n var leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n\n\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n } catch (_) {// Syntax error if dirtyPayload is invalid xml\n }\n }\n\n var body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n\n\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n\n\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n\n\n var _isClobbered = function _isClobbered(elm) {\n return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');\n };\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n\n\n var _isNode = function _isNode(object) {\n return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n };\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n\n\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n\n\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeElements', currentNode, null);\n /* Check if element is clobbered or can clobber */\n\n\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check if tagname contains Unicode */\n\n\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Now let's check the element's type and name */\n\n\n var tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n\n\n if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Mitigate a problem with templates inside select */\n\n\n if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Remove element if anything forbids its presence */\n\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;\n }\n /* Keep content except for bad-listed elements */\n\n\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n\n if (childNodes && parentNode) {\n var childCount = childNodes.length;\n\n for (var i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n }\n }\n }\n\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check whether element has a valid namespace */\n\n\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n\n if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Sanitize element content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n content = stringReplace(content, ERB_EXPR$1, ' ');\n\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n\n\n var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n\n\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (!value) ; else {\n return false;\n }\n\n return true;\n };\n /**\n * _basicCustomElementCheck\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n * @param {string} tagName name of the tag of the node to sanitize\n */\n\n\n var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n return tagName.indexOf('-') > 0;\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n\n\n var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n var attr;\n var value;\n var lcName;\n var l;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n var attributes = currentNode.attributes;\n /* Check if we have attributes; if not we might have a text node */\n\n if (!attributes) {\n return;\n }\n\n var hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n\n while (l--) {\n attr = attributes[l];\n var _attr = attr,\n name = _attr.name,\n namespaceURI = _attr.namespaceURI;\n value = name === 'value' ? attr.value : stringTrim(attr.value);\n lcName = transformCaseFunc(name);\n /* Execute a hook if present */\n\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Remove attribute */\n\n\n _removeAttribute(name, currentNode);\n /* Did the hooks approve of the attribute? */\n\n\n if (!hookEvent.keepAttr) {\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n\n\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n value = stringReplace(value, ERB_EXPR$1, ' ');\n }\n /* Is `value` valid for this attribute? */\n\n\n var lcTag = transformCaseFunc(currentNode.nodeName);\n\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n\n\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value\n\n\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Handle attributes that require Trusted Types */\n\n\n if (trustedTypesPolicy && _typeof(trustedTypes) === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n value = trustedTypesPolicy.createHTML(value);\n break;\n\n case 'TrustedScriptURL':\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n\n\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n\n\n var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n var shadowNode;\n\n var shadowIterator = _createIterator(fragment);\n /* Execute a hook if present */\n\n\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n /* Deep shadow DOM detected */\n\n\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(shadowNode);\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n\n\n DOMPurify.sanitize = function (dirty) {\n var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var body;\n var importedNode;\n var currentNode;\n var oldNode;\n var returnNode;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n\n IS_EMPTY_INPUT = !dirty;\n\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n\n\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n /* Check we can run. Otherwise fall back or ignore */\n\n\n if (!DOMPurify.isSupported) {\n if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n /* Assign config vars */\n\n\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n\n\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n var tagName = transformCaseFunc(dirty.nodeName);\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n\n\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n\n\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n\n\n var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n\n\n while (currentNode = nodeIterator.nextNode()) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n /* Shadow DOM detected, sanitize it */\n\n\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n /* If we sanitized `dirty` in-place, return it. */\n\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n\n\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (ALLOWED_ATTR.shadowroot) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n\n\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n\n SET_CONFIG = true;\n };\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n\n\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n\n\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n var lcTag = transformCaseFunc(tag);\n var lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n\n\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n\n\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n\n\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n\n\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n }\n\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dompurify/dist/purify.js\n// module id = 588\n// module chunks = 18 21 88","import { Component } from '../Base/Component';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { ComponentOptionsModel } from '../../models/ComponentOptionsModel';\nimport { IResultsComponentBindings } from '../Base/ResultsComponentBindings';\nimport { analyticsActionCauseList } from '../Analytics/AnalyticsActionListMeta';\nimport { IResultLinkOptions } from './ResultLinkOptions';\nimport { ResultListEvents } from '../../events/ResultListEvents';\nimport { HighlightUtils } from '../../utils/HighlightUtils';\nimport { IQueryResult } from '../../rest/QueryResult';\nimport { DeviceUtils } from '../../utils/DeviceUtils';\nimport { OS_NAME, OSUtils } from '../../utils/OSUtils';\nimport { Initialization } from '../Base/Initialization';\nimport { QueryUtils } from '../../utils/QueryUtils';\nimport { Assert } from '../../misc/Assert';\nimport { Utils } from '../../utils/Utils';\nimport { Defer } from '../../misc/Defer';\nimport { $$ } from '../../utils/Dom';\nimport { StreamHighlightUtils } from '../../utils/StreamHighlightUtils';\nimport { StringUtils } from '../../utils/StringUtils';\nimport { debounce, extend, escape } from 'underscore';\nimport { exportGlobally } from '../../GlobalExports';\n\nimport 'styling/_ResultLink';\nimport { AccessibleButton } from '../../utils/AccessibleButton';\nimport { bindAnalyticsToLink } from './ResultLinkCommon';\n\n/**\n * The `ResultLink` component automatically transform a search result title into a clickable link pointing to the\n * original item.\n *\n * This component is a result template component (see [Result Templates](https://docs.coveo.com/en/413/)).\n */\nexport class ResultLink extends Component {\n static ID = 'ResultLink';\n\n static doExport = () => {\n exportGlobally({\n ResultLink: ResultLink\n });\n };\n\n /**\n * The options for the ResultLink\n * @componentOptions\n */\n static options: IResultLinkOptions = {\n /**\n * Specifies the field to use to output the component `href` attribute value.\n *\n * **Tip:**\n * > Instead of specifying a value for the `field` option, you can directly add an `href` attribute to the\n * > `ResultLink` HTML element. Then, you can use a custom script to generate the `href` value.\n *\n * **Examples:**\n * - With the following markup, the `ResultLink` outputs its `href` value using the `@uri` field (rather than the\n * default field):\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-field=\"@uri\"></a>\n * ```\n *\n * - In the following result template, the custom `getMyKBUri()` function provides the `href` value:\n *\n * ```html\n * <script id=\"KnowledgeArticle\" type=\"text/underscore\" class=\"result-template\">\n * <div class='CoveoIcon>'></div>\n * <a class=\"CoveoResultLink\" href=\"<%= getMyKBUri(raw) %>\"></a>\n * <div class=\"CoveoExcerpt\"></div>\n * </script>\n * ```\n *\n * See also [`hrefTemplate`]{@link ResultLink.options.hrefTemplate}, which can override this option.\n *\n * By default, the component uses the `@clickUri` field of the item to output the value of its `href` attribute.\n */\n field: ComponentOptions.buildFieldOption(),\n\n /**\n * Specifies whether the component should try to open its link in Microsoft Outlook.\n *\n * Setting this option to `true` is normally useful for `ResultLink` instances related to Microsoft Exchange emails.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInOutlook`]{@link ResultLink.openLinkInOutlook} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * Default value is `false`.\n */\n openInOutlook: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies whether the component should open its link in the [`Quickview`]{@link Quickview} component rather than\n * loading through the original URL.\n *\n * Default value is `false`.\n */\n openQuickview: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies whether the component should open its link in a new window instead of opening it in the current\n * context.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInNewWindow`]{@link ResultLink.openLinkInNewWindow} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * **Note:**\n * > If a search page contains a [`ResultPreferences`]{@link ResultsPreferences} component whose\n * > [`enableOpenInNewWindow`]{@link ResultsPreferences.options.enableOpenInNewWindow} option is `true`, and the end\n * > user checks the <b>Always open results in new window</b> box, `ResultLink` components in this page will always\n * > open their links in a new window when the end user clicks them, no matter what the value of their\n * > `alwaysOpenInNewWindow` option is.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies a template literal from which to generate the `ResultLink` `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link ResultLink.options.field} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies a template literal from which to generate the `ResultLink` display title (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the default `ResultLink` display title behavior.\n *\n * The template literal can reference any number of fields from the parent result. However, if the template literal\n * references a key whose value is undefined in the parent result fields, the `ResultLink` title displays the\n * name of this key instead.\n *\n * This option is ignored if the `ResultLink` innerHTML contains any value.\n *\n * **Examples:**\n *\n * - The following markup generates a `ResultLink` display title such as `Case number: 123456` if both the\n * `raw.objecttype` and `raw.objectnumber` keys are defined in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${raw.objecttype} number: ${raw.objectnumber}\"></a>\n * ```\n *\n * - The following markup generates `${myField}` as a `ResultLink` display title if the `myField` key is undefined\n * in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${myField}\"></a>\n * ```\n *\n * - The following markup generates `Foobar` as a `ResultLink` display title, because the `ResultLink` innterHTML is\n * not empty:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${will} ${be} ${ignored}\">Foobar</a>\n * ```\n *\n * Default value is `undefined`.\n *\n * @availablesince [January 2017 Release (v1.1865.9)](https://docs.coveo.com/en/396/#january-2017-release-v118659)\n */\n titleTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies an event handler function to execute when the user clicks the `ResultLink` component.\n *\n * The handler function takes a JavaScript [`Event`](https://developer.mozilla.org/en/docs/Web/API/Event) object and\n * an [`IQueryResult`]{@link IQueryResult} as its parameters.\n *\n * Overriding the default behavior of the `onClick` event can allow you to execute specific code instead.\n *\n * **Note:**\n * > You cannot set this option directly in the component markup as an HTML attribute. You must either set it in the\n * > [`init`]{@link init} call of your search interface (see\n * > [Passing Component Options in the init Call](https://docs.coveo.com/en/346/#passing-component-options-in-the-init-call)),\n * > or before the `init` call, using the `options` top-level function (see\n * > [Passing Component Options Before the init Call](https://docs.coveo.com/en/346/#passing-component-options-before-the-init-call)).\n *\n * **Example:**\n * ```javascript\n * // You can set the option in the 'init' call:\n * Coveo.init(document.querySelector(\"#search\"), {\n * ResultLink : {\n * onClick : function(e, result) {\n * e.preventDefault();\n * // Custom code to execute with the item URI and title.\n * openUriInASpecialTab(result.clickUri, result.title);\n * }\n * }\n * });\n *\n * // Or before the 'init' call, using the 'options' top-level function:\n * // Coveo.options(document.querySelector('#search'), {\n * // ResultLink : {\n * // onClick : function(e, result) {\n * // e.preventDefault();\n * // // Custom code to execute with the item URI and title.\n * // openUriInASpecialTab(result.clickUri, result.title);\n * // }\n * // }\n * // });\n * ```\n */\n onClick: ComponentOptions.buildCustomOption<(e: Event, result: IQueryResult) => any>(() => {\n return null;\n }),\n\n /**\n * Specify this option to log additional analytics when this result link is pressed.\n *\n * **Example:**\n * ```javascript\n * const resultLink = new Coveo.ResultLink(\n * linkElement,\n * {\n * logAnalytics: (href) => Coveo.logCustomEvent(\n * Coveo.analyticsActionCauseList.openSmartSnippetSource,\n * {\n * searchQueryUid: searchInterface.queryController.lastSearchUid,\n * documentTitle: result.title,\n * author: Utils.getFieldValue(result, 'author'),\n * documentURL: href\n * },\n * element\n * )\n * },\n * searchInterface.getBindings(),\n * result\n * )\n * ```\n */\n logAnalytics: ComponentOptions.buildCustomOption<(href: string) => void>(() => null)\n };\n\n private toExecuteOnOpen: (e?: Event) => void;\n\n /**\n * Creates a new `ResultLink` component.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the `ResultLink` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n * @param result The result to associate the component with.\n * @param os\n */\n constructor(\n public element: HTMLElement,\n public options: IResultLinkOptions,\n public bindings?: IResultsComponentBindings,\n public result?: IQueryResult,\n public os?: OS_NAME\n ) {\n super(element, ResultLink.ID, bindings);\n\n const globalOptions = this.searchInterface.options.originalOptionsObject[ResultLink.ID] || {};\n const initialOptions = ComponentOptions.initComponentOptions(element, ResultLink, { ...globalOptions, ...options });\n const resultLinkOptions = this.componentOptionsModel.get(ComponentOptionsModel.attributesEnum.resultLink);\n this.options = extend({}, initialOptions, resultLinkOptions);\n\n this.result = result || this.resolveResult();\n\n if (this.options.openQuickview == null) {\n this.options.openQuickview = result.raw['connectortype'] == 'ExchangeCrawler' && DeviceUtils.isMobileDevice();\n }\n if (!this.element.hasAttribute('tabindex')) {\n this.element.setAttribute('tabindex', '0');\n }\n\n Assert.exists(this.componentOptionsModel);\n Assert.exists(this.result);\n\n if (!this.quickviewShouldBeOpened()) {\n // Bind on multiple \"click\" or \"mouse\" events.\n // Create a function that will be executed only once, so as not to log multiple events\n // Once a result link has been opened, and that we log at least one analytics event,\n // it should not matter if the end user open the same link multiple times with different methods.\n // It's still only one \"click\" event as far as UA is concerned.\n // Also need to handle \"longpress\" on mobile (the contextual menu), which we assume to be 1 s long.\n\n bindAnalyticsToLink(element, () => this.logAnalytics());\n }\n this.renderUri(element, result);\n this.bindEventToOpen();\n }\n public renderUri(element: HTMLElement, result?: IQueryResult) {\n if (/^\\s*$/.test(this.element.innerHTML)) {\n const title = this.getDisplayedTitle();\n this.element.innerHTML = title;\n\n const titleAsText = this.getDisplayedTitleAsText();\n if (!this.element.hasAttribute('aria-label')) {\n this.element.setAttribute('aria-label', titleAsText);\n }\n\n if (!this.element.title) {\n this.element.title = titleAsText;\n }\n }\n }\n /**\n * Opens the result in the same window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLink(logAnalytics = true) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.location.href = this.getResultUri();\n }\n\n /**\n * Opens the result in a new window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkInNewWindow(logAnalytics = true) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.open(this.getResultUri(), '_blank');\n }\n\n /**\n * Tries to open the result in Microsoft Outlook if the result has an `outlookformacuri` or `outlookuri` field.\n *\n * Normally, this implies the result should be a link to an email.\n *\n * If the needed fields are not present, this method does nothing.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkInOutlook(logAnalytics = true) {\n if (this.hasOutlookField()) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.openLink();\n }\n }\n\n /**\n * Opens the link in the same manner the end user would.\n *\n * This essentially simulates a click on the result link.\n *\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkAsConfigured(logAnalytics = true) {\n if (this.toExecuteOnOpen) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.toExecuteOnOpen();\n }\n }\n\n protected bindEventToOpen(): boolean {\n return (\n this.bindOnClickIfNotUndefined() ||\n this.bindOpenQuickviewIfNotUndefined() ||\n this.setHrefIfNotAlready() ||\n this.openLinkThatIsNotAnAnchor()\n );\n }\n\n private getDisplayedTitle() {\n if (!this.options.titleTemplate) {\n return this.result.title\n ? HighlightUtils.highlightString(this.result.title, this.result.titleHighlights, null, 'coveo-highlight')\n : this.escapedClickUri;\n } else {\n let newTitle = StringUtils.buildStringTemplateFromResult(this.options.titleTemplate, this.result);\n return newTitle\n ? StreamHighlightUtils.highlightStreamText(newTitle, this.result.termsToHighlight, this.result.phrasesToHighlight)\n : this.escapedClickUri;\n }\n }\n\n private getDisplayedTitleAsText() {\n const container = $$('div');\n container.setHtml(this.getDisplayedTitle());\n return container.text();\n }\n\n private get escapedClickUri() {\n return escape(this.result.clickUri);\n }\n\n private bindOnClickIfNotUndefined() {\n if (this.options.onClick != undefined) {\n this.toExecuteOnOpen = (e: MouseEvent) => {\n this.options.onClick.call(this, e, this.result);\n };\n\n new AccessibleButton()\n .withElement(this.element)\n .withLabel(this.result.title)\n .withSelectAction((e: Event) => this.toExecuteOnOpen(e))\n .build();\n\n return true;\n } else {\n return false;\n }\n }\n\n private bindOpenQuickviewIfNotUndefined() {\n if (this.quickviewShouldBeOpened()) {\n this.toExecuteOnOpen = () => {\n $$(this.bindings.resultElement).trigger(ResultListEvents.openQuickview);\n };\n\n $$(this.element).on('click', (e: Event) => {\n e.preventDefault();\n this.toExecuteOnOpen();\n });\n\n return true;\n } else {\n return false;\n }\n }\n\n private openLinkThatIsNotAnAnchor() {\n if (!this.elementIsAnAnchor()) {\n this.toExecuteOnOpen = () => {\n if (this.options.alwaysOpenInNewWindow) {\n if (this.options.openInOutlook) {\n this.openLinkInOutlook();\n } else {\n this.openLinkInNewWindow();\n }\n } else {\n this.openLink();\n }\n };\n\n $$(this.element).on('click', () => {\n this.toExecuteOnOpen();\n });\n\n return true;\n }\n return false;\n }\n\n private setHrefIfNotAlready() {\n // Do not erase any value put in href by the template, etc. Allows\n // using custom click urls while still keeping analytics recording\n // and other behavior brought by the component.\n if (this.elementIsAnAnchor() && !Utils.isNonEmptyString($$(this.element).getAttribute('href'))) {\n $$(this.element).setAttribute('href', this.getResultUri());\n if (this.options.alwaysOpenInNewWindow && !(this.options.openInOutlook && this.hasOutlookField())) {\n $$(this.element).setAttribute('target', '_blank');\n }\n return true;\n } else {\n return false;\n }\n }\n\n private logDocumentOpen(href: string) {\n this.usageAnalytics.logClickEvent(\n analyticsActionCauseList.documentOpen,\n {\n documentURL: href,\n documentTitle: this.result.title,\n author: Utils.getFieldValue(this.result, 'author')\n },\n this.result,\n this.root\n );\n }\n\n private logAnalytics = debounce(\n () => {\n this.queryController.saveLastQuery();\n let documentURL = $$(this.element).getAttribute('href');\n if (documentURL == undefined || documentURL == '') {\n documentURL = this.escapedClickUri;\n }\n if (this.options.logAnalytics) {\n this.options.logAnalytics(documentURL);\n } else {\n this.logDocumentOpen(documentURL);\n }\n Defer.flush();\n },\n 1500,\n true\n );\n\n private filterProtocol(uri: string) {\n const isAbsolute = /^(https?|ftp|file|mailto|tel|sip):/i.test(uri);\n const isRelative = /^(\\/|\\.\\/|\\.\\.\\/)/.test(uri);\n\n return isAbsolute || isRelative ? uri : '';\n }\n\n private getResultUri(): string {\n if (this.options.hrefTemplate) {\n const uri = StringUtils.buildStringTemplateFromResult(this.options.hrefTemplate, this.result);\n return this.filterProtocol(uri);\n }\n\n if (this.options.field == undefined && this.options.openInOutlook) {\n this.setField();\n }\n\n if (this.options.field != undefined) {\n return this.filterProtocol(Utils.getFieldValue(this.result, <string>this.options.field));\n }\n\n return this.filterProtocol(this.result.clickUri);\n }\n\n private elementIsAnAnchor() {\n return this.element.tagName == 'A';\n }\n\n private setField() {\n let os = Utils.exists(this.os) ? this.os : OSUtils.get();\n if (os == OS_NAME.MACOSX && this.hasOutlookField()) {\n this.options.field = '@outlookformacuri';\n } else if (os == OS_NAME.WINDOWS && this.hasOutlookField()) {\n this.options.field = '@outlookuri';\n }\n }\n\n private hasOutlookField() {\n let os = Utils.exists(this.os) ? this.os : OSUtils.get();\n if (os == OS_NAME.MACOSX && this.result.raw['outlookformacuri'] != undefined) {\n return true;\n } else if (os == OS_NAME.WINDOWS && this.result.raw['outlookuri'] != undefined) {\n return true;\n }\n return false;\n }\n\n private isUriThatMustBeOpenedInQuickview(): boolean {\n return this.escapedClickUri.toLowerCase().indexOf('ldap://') == 0;\n }\n\n private quickviewShouldBeOpened() {\n return (this.options.openQuickview || this.isUriThatMustBeOpenedInQuickview()) && QueryUtils.hasHTMLVersion(this.result);\n }\n}\n\nInitialization.registerAutoCreateComponent(ResultLink);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/ResultLink/ResultLink.ts","import { $$ } from '../../utils/Dom';\nimport { l } from '../../strings/Strings';\nimport { SVGIcons } from '../../utils/SVGIcons';\nimport { uniqueId } from 'underscore';\n\nconst ROOT_CLASSNAME = 'coveo-user-feedback-banner';\nconst CONTAINER_CLASSNAME = `${ROOT_CLASSNAME}-container`;\nconst LABEL_CLASSNAME = `${ROOT_CLASSNAME}-label`;\nconst BUTTONS_CONTAINER_CLASSNAME = `${ROOT_CLASSNAME}-buttons`;\nconst YES_BUTTON_CLASSNAME = `${ROOT_CLASSNAME}-yes-button`;\nconst NO_BUTTON_CLASSNAME = `${ROOT_CLASSNAME}-no-button`;\nconst BUTTON_ACTIVE_CLASSNAME = `${ROOT_CLASSNAME}-button-active`;\nconst THANK_YOU_BANNER_CLASSNAME = `${ROOT_CLASSNAME}-thanks`;\nconst THANK_YOU_BANNER_ACTIVE_CLASSNAME = `${THANK_YOU_BANNER_CLASSNAME}-active`;\nconst ICON_CLASSNAME = `${THANK_YOU_BANNER_CLASSNAME}-icon`;\nconst EXPLAIN_WHY_CLASSNAME = `${ROOT_CLASSNAME}-explain-why`;\nconst EXPLAIN_WHY_ACTIVE_CLASSNAME = `${EXPLAIN_WHY_CLASSNAME}-active`;\n\nenum UsefulState {\n Unknown,\n Yes,\n No\n}\n\ninterface IButtonOptions {\n text: string;\n className: string;\n action: Function;\n icon?: {\n content: string;\n className: string;\n };\n attributes?: any;\n}\n\nexport const UserFeedbackBannerClassNames = {\n ROOT_CLASSNAME,\n CONTAINER_CLASSNAME,\n LABEL_CLASSNAME,\n BUTTONS_CONTAINER_CLASSNAME,\n YES_BUTTON_CLASSNAME,\n NO_BUTTON_CLASSNAME,\n BUTTON_ACTIVE_CLASSNAME,\n THANK_YOU_BANNER_CLASSNAME,\n THANK_YOU_BANNER_ACTIVE_CLASSNAME,\n ICON_CLASSNAME,\n EXPLAIN_WHY_CLASSNAME,\n EXPLAIN_WHY_ACTIVE_CLASSNAME\n};\n\nexport class UserFeedbackBanner {\n public explainWhy: HTMLElement;\n private isUseful = UsefulState.Unknown;\n private yesButton: HTMLElement;\n private noButton: HTMLElement;\n private thankYouBanner: HTMLElement;\n private labelId: string;\n\n constructor(private readonly sendUsefulnessAnalytics: (isUseful: boolean) => void, private readonly onExplainWhyPressed: () => void) {\n this.labelId = uniqueId(LABEL_CLASSNAME);\n }\n\n public build() {\n return $$(\n 'div',\n {\n className: ROOT_CLASSNAME,\n ariaLive: 'polite'\n },\n this.buildContainer(),\n this.buildThankYouBanner()\n ).el;\n }\n\n public reset() {\n this.isUseful = UsefulState.Unknown;\n $$(this.yesButton).removeClass(BUTTON_ACTIVE_CLASSNAME);\n $$(this.yesButton).setAttribute('aria-pressed', 'false');\n $$(this.noButton).removeClass(BUTTON_ACTIVE_CLASSNAME);\n $$(this.noButton).setAttribute('aria-pressed', 'false');\n $$(this.thankYouBanner).removeClass(THANK_YOU_BANNER_ACTIVE_CLASSNAME);\n $$(this.explainWhy).removeClass(EXPLAIN_WHY_ACTIVE_CLASSNAME);\n }\n\n private buildContainer() {\n return $$(\n 'div',\n {\n className: CONTAINER_CLASSNAME,\n ariaLabelledby: this.labelId\n },\n this.buildLabel(),\n this.buildButtons()\n ).el;\n }\n\n private buildLabel() {\n return $$('span', { className: LABEL_CLASSNAME, id: this.labelId }, l('UsefulnessFeedbackRequest')).el;\n }\n\n private buildThankYouBanner() {\n this.thankYouBanner = $$('div', { className: THANK_YOU_BANNER_CLASSNAME }).el;\n\n const text = $$('span', {}, l('UsefulnessFeedbackThankYou')).el;\n this.thankYouBanner.appendChild(text);\n\n this.explainWhy = this.buildButton({\n text: l('UsefulnessFeedbackExplainWhy'),\n className: EXPLAIN_WHY_CLASSNAME,\n action: () => this.requestExplaination()\n });\n this.thankYouBanner.appendChild(this.explainWhy);\n\n return this.thankYouBanner;\n }\n\n private buildButtons() {\n const buttonsContainer = $$('div', { className: BUTTONS_CONTAINER_CLASSNAME }).el;\n\n this.yesButton = this.buildButton({\n text: l('Yes'),\n className: YES_BUTTON_CLASSNAME,\n action: () => this.showThankYouBanner(true),\n icon: {\n className: ICON_CLASSNAME,\n content: SVGIcons.icons.checkYes\n },\n attributes: {\n ariaPressed: false,\n ariaDescribedby: this.labelId\n }\n });\n this.yesButton.setAttribute('aria-pressed', 'false');\n buttonsContainer.appendChild(this.yesButton);\n\n this.noButton = this.buildButton({\n text: l('No'),\n className: NO_BUTTON_CLASSNAME,\n action: () => this.showThankYouBanner(false),\n icon: {\n className: ICON_CLASSNAME,\n content: SVGIcons.icons.clearSmall\n },\n attributes: {\n ariaPressed: false,\n ariaDescribedby: this.labelId\n }\n });\n buttonsContainer.appendChild(this.noButton);\n\n return buttonsContainer;\n }\n\n private buildButton(options: IButtonOptions) {\n const button = $$('button', { ...(options.attributes || {}), className: options.className, type: 'button' }).el;\n\n if (options.icon) {\n const icon = $$('span', { className: options.icon.className }, options.icon.content).el;\n button.appendChild(icon);\n const text = $$('span', {}, options.text).el;\n button.appendChild(text);\n } else {\n button.innerText = options.text;\n }\n\n button.addEventListener('click', () => options.action());\n\n return button;\n }\n\n private showThankYouBanner(isUseful: boolean) {\n if (this.isUseful !== UsefulState.Unknown && isUseful === (this.isUseful === UsefulState.Yes)) {\n return;\n }\n this.isUseful = isUseful ? UsefulState.Yes : UsefulState.No;\n $$(this.yesButton).toggleClass(BUTTON_ACTIVE_CLASSNAME, isUseful);\n $$(this.yesButton).setAttribute('aria-pressed', `${isUseful}`);\n $$(this.noButton).toggleClass(BUTTON_ACTIVE_CLASSNAME, !isUseful);\n $$(this.noButton).setAttribute('aria-pressed', `${!isUseful}`);\n $$(this.thankYouBanner).addClass(THANK_YOU_BANNER_ACTIVE_CLASSNAME);\n $$(this.explainWhy).toggleClass(EXPLAIN_WHY_ACTIVE_CLASSNAME, !isUseful);\n this.sendUsefulnessAnalytics(isUseful);\n }\n\n private requestExplaination() {\n this.onExplainWhyPressed();\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/UserFeedbackBanner.ts","import { $$ } from '../../utils/Dom';\nimport { SVGIcons } from '../../utils/SVGIcons';\nimport { l } from '../../strings/Strings';\n\nconst BASE_CLASSNAME = 'coveo-height-limiter';\nconst CONTAINER_ACTIVE_CLASSNAME = `${BASE_CLASSNAME}-container-active`;\nconst CONTAINER_EXPANDED_CLASSNAME = `${BASE_CLASSNAME}-container-expanded`;\nconst BUTTON_CLASSNAME = `${BASE_CLASSNAME}-button`;\nconst BUTTON_LABEL_CLASSNAME = `${BUTTON_CLASSNAME}-label`;\nconst BUTTON_ICON_CLASSNAME = `${BUTTON_CLASSNAME}-icon`;\nconst BUTTON_ACTIVE_CLASSNAME = `${BUTTON_CLASSNAME}-active`;\n\nexport const HeightLimiterClassNames = {\n CONTAINER_ACTIVE_CLASSNAME,\n CONTAINER_EXPANDED_CLASSNAME,\n BUTTON_CLASSNAME,\n BUTTON_LABEL_CLASSNAME,\n BUTTON_ICON_CLASSNAME,\n BUTTON_ACTIVE_CLASSNAME\n};\n\nexport class HeightLimiter {\n private isExpanded = false;\n private button: HTMLElement;\n private buttonLabel: HTMLElement;\n private buttonIcon: HTMLElement;\n\n public get toggleButton() {\n return this.button;\n }\n\n private set height(height: number) {\n this.containerElement.style.height = `${height}px`;\n }\n\n private get contentHeight() {\n return this.contentElement.clientHeight;\n }\n\n constructor(\n private containerElement: HTMLElement,\n private contentElement: HTMLElement,\n private heightLimit: number,\n private onToggle?: (isExpanded: boolean) => void\n ) {\n this.buildButton();\n this.updateActiveAppearance();\n }\n\n public onContentHeightChanged() {\n this.updateActiveAppearance();\n }\n\n private buildButton() {\n this.button = $$(\n 'button',\n { className: BUTTON_CLASSNAME, type: 'button', ariaLabel: l('ShowMore'), ariaPressed: 'false', ariaHidden: 'true' },\n (this.buttonLabel = $$('span', { className: BUTTON_LABEL_CLASSNAME }).el),\n (this.buttonIcon = $$('span', { className: BUTTON_ICON_CLASSNAME }).el)\n ).el;\n this.button.addEventListener('click', () => this.toggle());\n this.updateButton();\n return this.button;\n }\n\n private updateActiveAppearance() {\n const shouldBeActive = this.contentHeight > this.heightLimit;\n $$(this.containerElement).toggleClass(CONTAINER_ACTIVE_CLASSNAME, shouldBeActive);\n $$(this.button).toggleClass(BUTTON_ACTIVE_CLASSNAME, shouldBeActive);\n if (shouldBeActive) {\n this.updateExpandedAppearance();\n } else {\n this.isExpanded = false;\n this.updateExpandedAppearance();\n this.containerElement.style.height = '';\n }\n }\n\n private updateButton() {\n this.buttonLabel.innerText = this.isExpanded ? l('ShowLess') : l('ShowMore');\n this.button.setAttribute('aria-pressed', `${this.isExpanded}`);\n this.buttonIcon.innerHTML = this.isExpanded ? SVGIcons.icons.arrowUp : SVGIcons.icons.arrowDown;\n }\n\n private updateExpandedAppearance() {\n this.updateButton();\n $$(this.containerElement).toggleClass(CONTAINER_EXPANDED_CLASSNAME, this.isExpanded);\n this.height = this.isExpanded ? this.contentHeight : this.heightLimit;\n }\n\n private toggle() {\n this.isExpanded = !this.isExpanded;\n this.updateExpandedAppearance();\n if (this.onToggle) {\n this.onToggle(this.isExpanded);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/HeightLimiter.ts","import { AccessibleModal } from '../../utils/AccessibleModal';\nimport { l } from '../../strings/Strings';\nimport { $$, Dom } from '../../utils/Dom';\nimport { RadioButton } from '../FormWidgets/RadioButton';\nimport 'styling/_ExplanationModal';\n\nexport interface IReason {\n label: string;\n id: string;\n onSelect: () => void;\n hasDetails?: boolean;\n}\n\nexport interface IExplanationModalOptions {\n ownerElement: HTMLElement;\n reasons: IReason[];\n onClosed: () => void;\n modalBoxModule?: Coveo.ModalBox.ModalBox;\n}\n\nconst ROOT_CLASSNAME = 'coveo-user-explanation-modal';\nconst CONTENT_CLASSNAME = `${ROOT_CLASSNAME}-content`;\nconst EXPLANATION_SECTION_CLASSNAME = `${ROOT_CLASSNAME}-explanation-section`;\nconst REASONS_CLASSNAME = `${ROOT_CLASSNAME}-explanations`;\nconst REASONS_LABEL_CLASSNAME = `${REASONS_CLASSNAME}-label`;\nconst DETAILS_SECTION_CLASSNAME = `${ROOT_CLASSNAME}-details`;\nconst DETAILS_TEXTAREA_CLASSNAME = `${DETAILS_SECTION_CLASSNAME}-textarea`;\nconst DETAILS_LABEL_CLASSNAME = `${DETAILS_SECTION_CLASSNAME}-label`;\nconst BUTTONS_SECTION_CLASSNAME = `${ROOT_CLASSNAME}-buttons-section`;\nconst SEND_BUTTON_CLASSNAME = `${ROOT_CLASSNAME}-send-button`;\nconst CANCEL_BUTTON_CLASSNAME = `${ROOT_CLASSNAME}-cancel-button`;\nconst DETAILS_ID = DETAILS_SECTION_CLASSNAME;\n\nexport const ExplanationModalClassNames = {\n ROOT_CLASSNAME,\n CONTENT_CLASSNAME,\n EXPLANATION_SECTION_CLASSNAME,\n REASONS_CLASSNAME,\n REASONS_LABEL_CLASSNAME,\n DETAILS_SECTION_CLASSNAME,\n DETAILS_TEXTAREA_CLASSNAME,\n DETAILS_LABEL_CLASSNAME,\n BUTTONS_SECTION_CLASSNAME,\n SEND_BUTTON_CLASSNAME,\n CANCEL_BUTTON_CLASSNAME\n};\n\nexport class ExplanationModal {\n private modal: AccessibleModal;\n private reasons: RadioButton[];\n private selectedReason: IReason;\n private detailsSection: Dom;\n private detailsTextArea: HTMLTextAreaElement;\n private shouldCallCloseEvent = false;\n\n constructor(public options: IExplanationModalOptions) {\n this.modal = new AccessibleModal(ROOT_CLASSNAME, this.options.ownerElement, this.options.modalBoxModule, {\n focusOnOpen: () => this.sendButton()\n });\n }\n\n private sendButton(): HTMLElement {\n return this.modal.element.querySelector(`.${REASONS_CLASSNAME} input`);\n }\n\n public get details() {\n if (!this.selectedReason || !this.selectedReason.hasDetails) {\n return null;\n }\n return this.detailsTextArea.value;\n }\n\n public open(origin: HTMLElement) {\n this.modal.open({\n origin,\n title: $$('span', {}, l('UsefulnessFeedbackExplainWhyImperative')).el,\n content: this.buildContent(),\n validation: () => {\n if (this.shouldCallCloseEvent) {\n this.options.onClosed();\n this.shouldCallCloseEvent = false;\n }\n return true;\n }\n });\n this.shouldCallCloseEvent = true;\n }\n\n private buildContent() {\n return $$(\n 'div',\n {\n className: CONTENT_CLASSNAME\n },\n this.buildExplanationSection(),\n this.buildButtonsSection()\n ).el;\n }\n\n private buildExplanationSection() {\n const detailsSection = this.buildDetailsSection();\n return $$(\n 'div',\n {\n className: EXPLANATION_SECTION_CLASSNAME\n },\n this.buildReasons(),\n detailsSection\n ).el;\n }\n\n private buildButtonsSection() {\n return $$(\n 'div',\n {\n className: BUTTONS_SECTION_CLASSNAME\n },\n this.buildSendButton(),\n this.buildCancelButton()\n );\n }\n\n private buildReasons() {\n const reasonsContainer = $$('fieldset', { className: REASONS_CLASSNAME }, this.buildReasonsLabel()).el;\n this.reasons = this.options.reasons.map(reason => this.buildReasonRadioButton(reason));\n this.reasons[0].select();\n this.reasons.forEach(radioButton => reasonsContainer.appendChild(radioButton.getElement()));\n return reasonsContainer;\n }\n\n private buildReasonsLabel() {\n return $$('legend', { className: REASONS_LABEL_CLASSNAME }, l('UsefulnessFeedbackReason')).el;\n }\n\n private buildDetailsSection() {\n return (this.detailsSection = $$(\n 'div',\n { className: `coveo-hidden ${DETAILS_SECTION_CLASSNAME}` },\n $$('label', { className: DETAILS_LABEL_CLASSNAME, for: DETAILS_ID }, l('Details')).el,\n (this.detailsTextArea = $$('textarea', { className: DETAILS_TEXTAREA_CLASSNAME, id: DETAILS_ID, disabled: true })\n .el as HTMLTextAreaElement)\n ));\n }\n\n private buildSendButton() {\n const button = $$('button', { className: SEND_BUTTON_CLASSNAME, type: 'button' }, l('Send'));\n button.on('click', () => {\n this.selectedReason.onSelect();\n this.shouldCallCloseEvent = false;\n this.modal.close();\n });\n return button.el;\n }\n\n private buildCancelButton() {\n const button = $$('button', { className: CANCEL_BUTTON_CLASSNAME, type: 'button' }, l('Cancel'));\n button.on('click', () => this.modal.close());\n return button.el;\n }\n\n private buildReasonRadioButton(reason: IReason) {\n return new RadioButton(\n radioButton => {\n if (!radioButton.isSelected()) {\n return;\n }\n this.detailsSection.toggleClass('coveo-hidden', !reason.hasDetails);\n this.detailsTextArea.disabled = !reason.hasDetails;\n this.selectedReason = reason;\n },\n reason.label,\n 'reason',\n `coveo-reason-${reason.id}`\n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/ExplanationModal.ts","import { $$ } from '../../utils/Dom';\nimport { IFormWidgetWithLabel, IFormWidgetSelectable } from './FormWidgets';\nimport 'styling/vapor/_Radio';\nimport { exportGlobally } from '../../GlobalExports';\n\n/**\n * A radio button widget with standard styling.\n */\nexport class RadioButton implements IFormWidgetWithLabel, IFormWidgetSelectable {\n protected element: HTMLElement;\n\n static doExport() {\n exportGlobally({\n RadioButton: RadioButton\n });\n }\n\n /**\n * Creates a new `RadioButton`.\n * @param onChange The function to call when the radio button value changes. This function takes the current\n * `RadioButton` instance as an argument.\n * @param label The label to display next to the radio button.\n * @param name The value to set the `input` HTMLElement `name` attribute to.\n */\n constructor(\n public onChange: (radioButton: RadioButton) => void = (radioButton: RadioButton) => {},\n public label: string,\n public name: string,\n private id: string = label\n ) {\n this.buildContent();\n }\n\n /**\n * Resets the radio button.\n */\n public reset() {\n const currentlySelected = this.isSelected();\n this.getRadio().checked = false;\n if (currentlySelected) {\n this.onChange(this);\n }\n }\n\n /**\n * Select the radio button\n * @param triggerChange will trigger change event if specified and the radio button is not already selected\n */\n public select(triggerChange = true) {\n const currentlySelected = this.isSelected();\n this.getRadio().checked = true;\n if (!currentlySelected && triggerChange) {\n this.onChange(this);\n }\n }\n\n /**\n * Gets the element on which the radio button is bound.\n * @returns {HTMLElement} The radio button element.\n */\n public build(): HTMLElement {\n return this.element;\n }\n\n /**\n * Gets the element on which the radio button is bound.\n * @returns {HTMLElement} The radio button element.\n */\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getValue(): string {\n return this.label;\n }\n\n /**\n * Indicates whether the radio button is selected.\n * @returns {boolean} `true` if the radio button is selected, `false` otherwise.\n */\n public isSelected(): boolean {\n return this.getRadio().checked;\n }\n\n /**\n * Gets the `input` element (the radio button itself).\n * @returns {HTMLInputElement} The `input` element.\n */\n public getRadio(): HTMLInputElement {\n return <HTMLInputElement>$$(this.element).find('input');\n }\n\n /**\n * Gets the radio button [`label`]{@link RadioButton.label} element.\n * @returns {HTMLLabelElement} The `label` element.\n */\n public getLabel(): HTMLLabelElement {\n return <HTMLLabelElement>$$(this.element).find('label');\n }\n\n private buildContent() {\n const radioOption = $$('div', { className: 'coveo-radio' });\n const radioInput = $$('input', { type: 'radio', name: this.name, id: this.id });\n const labelInput = $$('label', { className: 'coveo-radio-input-label', for: this.id });\n labelInput.text(this.label);\n radioInput.on('change', () => {\n this.onChange(this);\n });\n\n radioOption.append(radioInput.el);\n radioOption.append(labelInput.el);\n this.element = radioOption.el;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/FormWidgets/RadioButton.ts"],"sourceRoot":""}