{"status":"OK","geo":"US","deviceDetected":1,"fiViewerId":"65880eb27497b9a0a9bf30b54eb0cc44","pageViewUniqueId":1193140595392651,"datasource":"LIVE","options":{"cmp_enableintegration":true,"amp":{"initialMinSpacing":0.9,"initialMinSpacingUnits":"vp"},"hb_analytics":true,"has_blocked_urls":true,"has_blocked_urls_slashend":"both","has_blocked_urls_withparams":"onlyNoParams","notHotDog":{"enabled":false,"selectors":[]},"siteLang":"en","esc":true,"campaignLimitations":{},"eventTracking":{"trackingDomains":[{"host":"cdn.firstimpression.io","type":"full"}],"trackScroll":1,"trackTimeOnPage":1,"probability":12,"cookiename":"fitracking"},"prependScript":"if( (new Date() - new Date(FI.options.builtOn)) \/ (1000*60*60) > 24 ) {\n    if(!window.fi_reloaded) { window.fi_reloaded=true;\n    \tfetch(\"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\",  {cache: \"reload\"}).then(()=>{ \t\t\n    \t    clearTimeout(FI.g_clientManager.appendLoopTimeout);\n    \t\tvar body = document.getElementsByTagName(\"head\")[0];\n                newdiv = document.createElement(\"script\");\n    \t\t    newdiv.setAttribute(\"type\", \"text\/javascript\");\n    \t\t    newdiv.setAttribute(\"src\", \"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\");    \n    \t    delete FI; delete fipb; delete fiQuery;\n    \t    body.appendChild(newdiv);\n    \t\tthrow (\"Cache problem!\");\n    \t});\n    \treturn;\n    }\n}\n\/*{trackingcode|cookiename:fitracking}*\/\n\nfiQuery(window).on('SPCReturned', function() {\n     FI.state.utils = fiUtils = {\n            getPlacementsPerCond: function(...cond) {\n                var count = 0;\n                return fiQuery.map(FI.g_clientManager.placementQueue, function($placement) {\n                    count = 0;\n                    for (let i = 0; i < cond.length; i++) {\n                        if (fiUtils[cond[i].placement]($placement, cond[i].is)) count++;\n                    }\n                    if (count == cond.length) return [$placement];\n                });               \n            },\n            enabledExtraOption : function($placement, option) {\n                return (typeof $placement.options.extra != 'undefined' && typeof $placement.options.extra[option] != 'undefined' && (typeof $placement.options.extra[option].enabled != 'undefined' && $placement.options.extra[option].enabled || typeof $placement.options.extra[option].enabled == 'undefined')) \n                || (typeof $placement.options[option] != 'undefined' && (typeof $placement.options[option].enabled != 'undefined' && $placement.options[option].enabled || typeof $placement.options[option].enabled == 'undefined'));\n             },\n            enabledExtraValue : function($placement, optionPathAndValueArr) {\n                let optionVal = optionPathAndValueArr.length - 1,\n                \tplacementOption = typeof $placement.options.extra != 'undefined' ? $placement.options.extra : $placement.options,\n                \toptionNotFound = false;\n                for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                \tif (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\") \n                \t\tplacementOption = placementOption[optionPathAndValueArr[i]];\n                \telse {\n                \t\toptionNotFound = true;\n                \t\tbreak;\n                \t} \n                }\n                return ! optionNotFound && placementOption == optionVal;\n            },\n            enabledOptionValue : function($placement, optionPathAndValueArr) {\n                let optionVal = optionPathAndValueArr.length - 1,\n                \tplacementOption = $placement.options;\n                \toptionNotFound = false;\n                for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                \tif (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\") \n                \t\tplacementOption = placementOption[optionPathAndValueArr[i]];\n                \telse {\n                \t\toptionNotFound = true;\n                \t\tbreak;\n                \t} \n                }\n                return ! optionNotFound && placementOption == optionVal;\n            },\n            multiInstance: function($placement) {\n                return $placement.options.totalRenderedInstancesLimitation > 1;\n            },\n             type : function($placement, type) {\n                return $placement.type == type;\n             },\n            pageErrors: [],\n            showAllErrors: function(_module) {\n                for (var i = 0; i < this.pageErrors.length; i++) {\n                    if (typeof _module == \"undefined\" || this.pageErrors[i].module == _module)\n                        this.console(this.pageErrors[i].message, \"Error\", this.pageErrors[i].module);\n                }\n            },\n            console: function(message, type, _module, placementId, bannerId) {\n                FI.console.log(typeof message != \"undefined\" ? message : \"No message here.. This seems odd\", \n                               typeof placementId != \"undefined\" ? placementId : '',\n                               typeof bannerId != \"undefined\" ? bannerId : '',\n                               typeof type != \"undefined\" ? type : 'Misc',\n                               typeof _module != \"undefined\" ? _module : '')\n            },\n            pageError: function(message, _module, placement) {\n                this.pageErrors.push({\"message\": message, \"module\": _module, \"placement\": placement});\n                this.console(message, \"Error\", _module);\n            },\n            getExtra: function($placement) {\n                if (typeof $placement == \"object\" && typeof $placement.options != \"undefined\")\n                    return typeof $placement.options.extra != \"undefined\" ? $placement.options.extra : $placement.options;  \n                else if (typeof $placement == \"number\")\n                    return typeof FI.g_clientManager.getPlacement($placement).options.extra != \"undefined\" ? $placement.options.extra : $placement.options;  \n                else {\n                    fiUtils.pageError(\"Invoking getExtra but providing ${$placement} which is not a number or an object\");\n                    return { \"options\" : { \"extra\": {} } }\n                }\n            },\n            getWebsiteMacro: function(macro) {\n                return macro.indexOf(\"{\") == -1 ? macro : null;\n            },\n            isLastInstance : function($instance) {\n                return $instance.instanceId.split('_')[2] == $instance.placement.instances.length - 1;\n            },\n            isPlacementOptionEnabled: function($instance, option) {\n                return typeof $instance.placement.options[option] != \"undefined\" && $instance.placement.options[option][\"enabled\"];\n            },\n            appenndRecorderDiv: function(recorderClass) {\n                if (fiQuery(\"recorder\").length == 0) {\n                    fiQuery('body').append(`<div class=recorder ${recorderClass}><\/div>`);\n                } else {\n                    fiQuery(\"recorder\").addClass(`${recorderClass}`);\n                }\n            },\n            detectDeviceOrientation: function () {\n                return window.matchMedia(\"(orientation: portrait)\") ? \"portrait\" : \"landscape\";\n            },\n\t\t\tgetManupiliationStateByHighestValuePerPlacementType: function(arr, placementType) { \n\t\t\t\tarr = arr.map((state, index, array) => {\n\t\t\t\t\tif (typeof state != \"undefined\") return typeof fiUtils.fixed.manupiliateElementsPerPlacementType[placementType][state.name] != \"undefined\" ? state : '';\n\t\t\t\t}).filter(elem => elem != \"\");\n\n\t\t\t\treturn arr.reduce(function(prev, current) { \n\t\t\t\t\tif (typeof current != \"undefined\") return Math.abs(prev.value) > Math.abs(current.value) ? prev : current;\n\t\t\t\t\treturn Math.abs(prev.value);\n\t\t\t\t});\n\t\t\t},\n            setRecorder: function(update) {\n                if (fiQuery(\"div#fi_recorder\").length == 0) fiQuery('body').append('<div id=fi_recorder><\/div>');\n                if (typeof update != 'undefined' ) fiQuery(\"div#fi_recorder\").addClass(update);\n            },\n\t\t\tfixed: {\n\t\t\t\tManipulationState : function(name, CSSKeyValuePair, selector) { \n\t\t\t\t\tthis.name = name;\n\t\t\t\t\t\/\/ Selector not found, let's wait for it\n\t\t\t\t\tif (fiQuery(selector).length == 0) { \n\t\t\t\t\t\tthis.value = fiUtils.fixed.waitForSelector(selector, this, CSSKeyValuePair);\n\t\t\t\t\t\tthis.selector = null;\n\t\t\t\t\t\/\/ We need to pull the value dynamically from the DOM\n\t\t\t\t\t} else if (CSSKeyValuePair.property != null) {\n\t\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\t\tthis.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n\t\t\t\t\t\/\/ Seems selector is found and value is static so let's just move on \n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\t\tthis.value = CSSKeyValuePair.value;\n\t\t\t\t\t}\n\t\t\t\t\tthis.viewable = false;\n\t\t\t\t},\n\t\t\t\tplacementsToManupiliate : [],\n\t\t\t\tmanupiliateElementsPerPlacementType :  {\n\t\t\t\t\theaderKick: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclose : function(value) {\n\t\t\t\t\t\t    FI.console.log(`Resetting all manupiliations on other elements since placement was either closed or reached its end of the waterfall`, ``, ``, `fiUtils.fixed`);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush : function(valie) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)`});\n\t\t\t\t\t\t}\n\t\t\t\t\t},  \n\t\t\t\t\tbottomsticky: { \n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcookieNoticePush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbottomBarPush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t}\n\t\t\t\t\t}, \n\t\t\t\t\touterdocked: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex:`${value}`});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) { \n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t}\t\t\n\t\t\t\t\t}, \n\t\t\t\t\tdocked: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex:`${value}`});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t}\t\n\t\t\t\t\t}, \n\t\t\t\t\thybridDocked:  {\n\t\t\t\t\t\tinitStaticStateFailSafeStyle: function () {\n\t\t\t\t\t\t\tfiQuery('body').append('<style id=\"fi-translateY-control\"> .fi-detachable-hybriddocked[style*=\"static\"] { transform: translateY(0px) !important; } <\/style>');\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twaitForSelector: function(selector, state, CSSKeyValuePair) { \n\t\t\t\t\tFI.awaitFor(() => fiQuery(selector).length > 0)\n\t\t\t\t\t\t.then(() => { \n\t\t\t\t\t\t\tstate.selector = selector;\n\t\t\t\t\t\t\tif (CSSKeyValuePair.property != null ) state.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tstate.value = CSSKeyValuePair.value;\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tobservedManupilationArray : [],\n\t\t\t\ttrakcedManipulationStatesArray : [],\n\t\t\t\tpushObservedManupilationArray: function(name, value, selector) {\n\t\t\t\t\tif (fiUtils.getWebsiteMacro(selector) != null)\n\t\t\t\t\t\tfiUtils.fixed.observedManupilationArray.push(new fiUtils.fixed.ManipulationState(name, value, selector));\n\t\t\t\t},\n\t\t\t\tresetElementViewability: function(initManupilation) {\n\t\t\t\t\tfiUtils.fixed.observedManupilationArray.forEach((element, index, arr) => {\n\t\t\t\t\t\tif (element.viewable && fiQuery(element.selector).length == 0) element.viewable = false;\n\t\t\t\t\t});\n\t\t\t\t\tfor (var i = 0; i < fiUtils.fixed.trakcedManipulationStatesArray.length; i++) {\n\t\t\t\t\t\tif (! fiUtils.fixed.trakcedManipulationStatesArray[i].viewable) {\n\t\t\t\t\t\t\tfiUtils.fixed.trakcedManipulationStatesArray.splice(i,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (fiUtils.fixed.trakcedManipulationStatesArray.length > 0) { \n\t\t\t\t\t\tfiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tisFixedState: function() {\n\t\t\t\t\treturn fiQuery('div.apd_docked').length > 0 || fiQuery('div#FIHeaderKickInner').length > 0 || fiQuery('div#FIBottomStickyInner').length > 0 || fiQuery('div.FIOnDemandWrapper > div.fi-docked').length > 0;\n\t\t\t\t},\n\t\t\t\tshouldWeManupiliate : function(arr, initManupilation) { \n\t\t\t\t\tif (fiUtils.fixed.isFixedState()) { \n\t\t\t\t\t\tlet changedObservedManupilationArray = arr.filter((element, index, array) => fiQuery(element.selector).length > 0 && ! element.viewable ? element : '');\n\t\t\t\t\t\tif (changedObservedManupilationArray.length == 0 && fiUtils.fixed.trakcedManipulationStatesArray.length > 0) fiUtils.fixed.resetElementViewability(initManupilation);\n\t\t\t\t\t\tif (changedObservedManupilationArray.length > 0) { \n\t\t\t\t\t\t\tchangedObservedManupilationArray.forEach((manupliationState) =>  fiUtils.fixed.trakcedManipulationStatesArray.push(manupliationState));\n\t\t\t\t\t\t\tfor (var i = 0; i < changedObservedManupilationArray.length; i++) {\n\t\t\t\t\t\t\t\tfor (var j = 0; j < fiUtils.fixed.observedManupilationArray.length; j++) {\n\t\t\t\t\t\t\t\t\tif (changedObservedManupilationArray[i].name == fiUtils.fixed.observedManupilationArray[j].name) {\n\t\t\t\t\t\t\t\t\t\tfiUtils.fixed.observedManupilationArray[j].viewable = true;\n\t\t\t\t\t\t\t\t\t\tFI.console.log(`${fiUtils.fixed.observedManupilationArray[j].name} is in view!`, ``, ``, `fiUtils.fixed`);\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}, \n\t\t\t\tmanageManupiliations: function(arr, initManupilation) {\n\t\t\t\t\tif (typeof initManupilation != \"function\") {\n\t\t\t\t\t\tFI.console.log(`ERROR: You provided an init manupilate but its not a function. This won't work`, ``, ``, `fiUtils.fixed`)\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tFI.awaitFor(() => fiUtils.fixed.shouldWeManupiliate(arr, initManupilation))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tfiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n\t\t\t\t\t\t\t\/\/Re-init\n\t\t\t\t\t\t\tfiUtils.fixed.manageManupiliations(arr ,initManupilation);\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmanupilateThis(arr, initManupilation) {\n\t\t\t\t\tfiUtils.fixed.placementsToManupiliate.forEach(($placement) => initManupilation(fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).value, $placement.type, fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).name));\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n    };\n    if (localStorage.apdAdmin == 1) {\n        Object.keys(fiUtils).forEach((utilFunc) => {\n              if (typeof fiUtils[utilFunc] == \"function\" && utilFunc.indexOf(\"error\") == -1 && FI.options.prependScript.indexOf(`${utilFunc}(`) == -1)\n                  fiUtils.pageErrors.push({\"message\": `The fiUtils function ${utilFunc} seems not to be in use in the website prepend`, \"module\" : `fiUtils`});\n        });\n    }\n});\n\nfiQuery(window).on('SPCReturned', function () {\n    \/\/ Make sure selected placement will render on customVisible event\n    FI.state.customVisiblity = $customVisiblity = {\n        targetPlacements: fiUtils.getPlacementsPerCond({placement: \"enabledExtraOption\", is: \"customVisibilitySettings\"})\n    };\n    if ($customVisiblity.targetPlacements.length > 0) {\n        \/\/ meaning at least one custom visibility placement returned\n        if (fiQuery('div#fi-custom-visibility-recorder').length == 0)\n            fiQuery('body').append('<div id=\"fi-custom-visibility-recorder\"><\/div>');\n        Object.assign($customVisiblity, {\n            getTriggerScrollTop: function ($placement) {\n                if (fiQuery(fiUtils.getExtra($placement).customVisibilitySettings.visibilityAnchor).length == 0) {\n                    FI.console.log(`Visibility anchor for ${$placement.id} doesn't exist on page`, `Custom visibility`, $placement.id);\n                    return 0;\n                }\n                return fiQuery(fiUtils.getExtra($placement).customVisibilitySettings.visibilityAnchor).offset().top;\n            },\n            attachPlacmeentScrollEventhandler: function ($placement, visibilityAnchorOffset) {\n                window.$customVisiblity[$placement.id] = function () {\n                    if (fiQuery(window).scrollTop() > visibilityAnchorOffset) {\n                        if (fiQuery(`div.fi-element-visible-for_${$placement.id}`).length == 0) {\n                            fiQuery('div#fi-custom-visibility-recorder').addClass(`fi-element-visible-for_${$placement.id}`);\n                            FI.console.log(`fi-element-visible-for_${$placement.id} event fired`, `Custom visibility`, $placement.id);\n                            fiQuery(window).off(\"scroll\", window.$customVisiblity[$placement.id]);\n                        }\n                    }\n                }\n                fiQuery(window).on(\"scroll\", window.$customVisiblity[$placement.id]);\n            }\n        });\n        \/\/ init\n        fiQuery.each($customVisiblity.targetPlacements, function (index, $placement) {\n            $customVisiblity.attachPlacmeentScrollEventhandler($placement, $customVisiblity.getTriggerScrollTop($placement));\n        });\n    }\n});\n\nfiQuery(window).on('SPCReturned', function(){\n    \/\/ Wait on functionality - v 2.0.0 11\/17\/2021\n    FI.state.waitOnManager = $waitOn = {};\n    $waitOn.placementsWaitingOnOtherPlacementsResolutionArray = fiUtils.getPlacementsPerCond({placement: \"enabledExtraOption\", is: \"waitOn\"})\n\n    if ($waitOn.placementsWaitingOnOtherPlacementsResolutionArray.length > 0) {\n        \/\/ Expand the wait on object\n        Object.assign($waitOn, {\n            convertWaitOnObjectToType : function(waitOnObject) {\n               if (! isNaN(waitOnObject))\n                    if (waitOnObject.toString().split('').length == 4) return 'sequenceId';\n                    else return 'placementId';\n                if (waitOnObject.indexOf(\"{\") != -1 && waitOnObject.indexOf(\",\") == -1) {\n                    try {\n                        JSON.parse(waitOnObject);\n                        return 'placementCustomOption';\n                    } catch(e) {\n                        if (waitOnObject.indexOf(\"}\") == -1)\n                            FI.console.log(`Placement #${placementId} seems to be waiting to a custom placement option however it cannot be parsed to a JS object. Make sure to use \\\" and not \"\" or '', also validate that you use proper JSON syntax and both { and }.`, waitingPlacement.id, ``, `Wait on`);\n                        else {\n                            return 'placementCustomOptionKeyOnly';\n                        }\n                    }\n                }\n                let checkIfSize = waitOnObject.split('x');\n                if (! isNaN(checkIfSize[0]) && ! isNaN(checkIfSize[1])) return 'placementSize';\n                if (typeof waitOnObject == 'string') return 'placementType';\n                return 'error';\n            },\n            removeWaitOnPlacementIdFromWaitOnArray : function(placementId, waitOnArray, waitingPlacement) {\n                \/\/ Remove resolved placement from wait on array\n                if (waitOnArray.indexOf(placementId.toString()) != -1) {\n                    waitOnArray.splice(waitOnArray.indexOf(placementId.toString()), 1);\n                    FI.console.log(`Placement #${placementId} has been resolved and cleared from #${waitingPlacement.id} wait on array. ${ (waitOnArray.length == 0 ? `This was the last placement in the wait on array` : `It is now only waiting for the following placements: ${waitOnArray}`) }`, waitingPlacement.id, ``, `Wait on`);\n                }\n                \/\/ Remove all placement in sequence of removed placement\n                \/\/ Make sure resolution was placement rendered other wise another placement in the sequence may render\n                if (typeof FI.g_clientManager.placementQueue[placementId].sequence != 'undefined' && fiQuery(`div[id^=FIOnDemandWrapper_fiInstance_${placementId}]`).length) {\n                    let sequenceId = FI.g_clientManager.placementQueue[placementId].sequence.id;\n                    fiQuery.each(FI.g_clientManager.placementQueue, function(anotherPlacementId, anotherPalcement) {\n                        if (typeof FI.g_clientManager.placementQueue[anotherPlacementId].sequence != 'undefined' && FI.g_clientManager.placementQueue[anotherPlacementId].sequence.id == sequenceId && waitOnArray.indexOf(anotherPlacementId.toString()) != -1) {\n                                waitOnArray.splice(waitOnArray.indexOf(anotherPlacementId.toString()), 1);\n                                FI.console.log(`Placement #${anotherPlacementId} has been resolved since placement ${placementId} has rendered and is in it's sequence has rendered.  It was cleared from #${waitingPlacement.id} wait on array. ${ (waitOnArray.length == 0 ? `This was the last placement in the wait on array` : `It is now only waiting for the following placements: ${waitOnArray}`) }`, waitingPlacement.id, ``, `Wait on`);\n                            }\n                    });\n                }\n                   \/\/ Release the waiting placement if no placement remian to wait on\n                if (waitOnArray.length == 0) {\n                    if (fiQuery('div#fi-wait-on-recorder').length == 0) {\n                        FI.console.log(`Something seems to be wrong since I want to update div#fi-wait-on-recorder but it's missing. I'll add a new one...`, waitingPlacement.id, ``, `Wait on`);\n                        fiQuery('body').append('<div id=fi-wait-on-recorder><\/div>');\n                    }\n                    fiQuery('div#fi-wait-on-recorder').addClass('wo-resolved_' + waitingPlacement.id);\n                    FI.console.log(`Placement #${waitingPlacement.id} is no longer waiting for any placements to be resolved and should continue rendering.`, waitingPlacement.id, ``, `Wait on`);\n                }\n            },\n            getPlacementIdsPerWaitOnObject : function(waitOnObject, waitOnArray, waitingPlacement) {\n                \/\/ Check each entries type : placement id, placement type, placement size, custom option\n                switch (FI.state.waitOnManager.convertWaitOnObjectToType(waitOnObject)) {\n                    case 'placementId':\n                        if (typeof FI.g_clientManager.placementQueue[waitOnObject] != 'undefined' && waitOnArray.indexOf(waitOnObject) == -1) {\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementId\" and pointed to the following placement: ${waitOnObject.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                            return waitOnObject;\n                        }\n                        break;\n                    case 'sequenceId':\n                        var placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placement.sequence && placement.sequence.id == waitOnObject)\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"sequenceId\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementType':\n                        var placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placement.type == waitOnObject)\n                                placementIds.push(placementId.toString());\n                        });\n                        FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementType\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementSize':\n                        var placementSizeInXY = waitOnObject.split('x'),\n                            placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placementId.width == placementSizeInXY[0] && placementId.height == placementSizeInXY[1])\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementSize\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementCustomOptionKeyOnly':\n                        var placementIds = [],\n                            parsedWaitOnObj = waitOnObject.replace(\"{\",\"\").replace(\"}\",\"\");\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (typeof fiUtils.getExtra(placement)[parsedWaitOnObj] != 'undefined')\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementCustomOptionKeyOnly\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementCustomOption':\n                        var placementIds = [],\n                            waitOnObject = JSON.parse(waitOnObject);\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (typeof fiUtils.getExtra(placement)[Object.keys(waitOnObject)[0]] != 'undefined' && fiUtils.getExtra(placement)[Object.keys(waitOnObject)[0]] == waitOnObject[Object.keys(waitOnObject)[0]])\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"{ ${Object.keys(waitOnObject)[0]} : ${waitOnObject[Object.keys(waitOnObject)[0]]} }\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"{ ${Object.keys(waitOnObject)[0]} : ${waitOnObject[Object.keys(waitOnObject)[0]]} }\" has been identified as a \"placementCustomOption\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'error':\n                    default:\n                        FI.console.log(`You have specified a waitOn request on placement #${waitingPlacement.id} which cannot be evaluate to any type, i.e. it is not a placement id, type, size or custom option.`, waitingPlacement.id, ``, `Wait on`);\n                        break;\n                }\n            }\n        });\n\n        \/\/ Setup the div recorder to alert on wait on resolved\n        if (fiQuery('div#fi-wait-on-recorder').length == 0)\n            fiQuery('body').append('<div id=fi-wait-on-recorder><\/div>');\n\n        \/\/ Setup the event handlers\n        fiQuery.each($waitOn.placementsWaitingOnOtherPlacementsResolutionArray, function(placementId, waitingPlacement) {\n            var $waitOn = FI.state.waitOnManager;\n            \/\/ What if we are waiting for more then one placement...\n            let waitOnObjectsArray = fiUtils.getExtra(waitingPlacement).waitOn.toString().split(','),\n                waitOnArray = [];\n            \/\/ Populate the waitOnArray per placement\n            fiQuery.each(waitOnObjectsArray, function(i, waitOnObject) {\n                waitOnArray.push($waitOn.getPlacementIdsPerWaitOnObject(waitOnObject, waitOnArray, waitingPlacement));\n            });\n            \/\/ Remove all depth from array\n            waitOnArray = waitOnArray.flat();\n            \/\/ Remove all duplicate values\n            waitOnArray = waitOnArray.filter((value, index, self) => self.indexOf(value) === index && typeof value != 'undefined');\n            if (waitOnArray.length) {\n                fiUtils.getExtra(waitingPlacement).waitOn.compiledWaitOnPlacementsArray = waitOnArray;\n                FI.console.log(`Placement #${waitingPlacement.id} will be waiting for the following placements to be resolved: ${waitOnArray}`, waitingPlacement.id, ``, `Wait on`);\n            } else {\n                FI.console.log(`Placement #${waitingPlacement.id} seems to wait for no placements so here it goes...`, waitingPlacement.id, ``, `Wait on`);\n                fiQuery('div#fi-wait-on-recorder').addClass('wo-resolved_' + waitingPlacement.id);\n            }\n            \/\/ Set events on top of the wait on array\n            fiQuery.each(waitOnArray, function() {\n                   fiQuery(window).on('manualyRemovePlacementFromWaitOn', function(e, data) {\n                    if (waitOnArray.indexOf(data.placementId.toString()) != -1) {\n                        FI.console.log(`Placement #${data.placementId} will be manually removed from the wait on array of ${waitingPlacement.id}. It means it's not suppose to render but it's not hidden`, ``, ``, `Wait on`);\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray(data.placementId, waitOnArray, waitingPlacement);\n                    }\n                });\n                fiQuery(window).on('instanceSetVisibleComplete', function(e, $instance) {\n                    if (waitOnArray.indexOf($instance.placement.id.toString()) != -1) {\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray($instance.placement.id, waitOnArray, waitingPlacement);\n                    }\n                });\n                fiQuery(window).on('proceededToNextInSequence', function(e, $placement){\n                    if (waitOnArray.indexOf($placement.id.toString()) != -1) {\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray($placement.id, waitOnArray, waitingPlacement);\n                    }\n                });\n            });\n        });\n    }\n});\n\nif (window.location.href.indexOf(\"https:\/\/www.bleepingcomputer.com\/tutorials\/how-to-disable-bing-search-in-the-windows-10-start-menu\/?fi_reveal=preview\") != -1) {\n\tfiQuery('div#bleepingcomputer_300x250_300x600_160x600_Right_1,div#sticky-footer,section.cz-oa-wrapp,div#bleepingcomputer_300x250_300x600_160x600_Right_3').css('display','none');\nfiQuery('body').append('<style>div#bleepingcomputer_300x250_300x600_160x600_Right_1,div#sticky-footer,section.cz-oa-wrapp,div#bleepingcomputer_300x250_300x600_160x600_Right_3,body.hide-fi > div.bc_wrapper > header{display: none;}<\/style>');\nfiQuery('div.bc_tutorials > ul > li:last-child').append('<div id=\"fi-last-anchor\" style=\"height: 1px;width:1px;\"><div>');\n}\n\nfiQuery(window).on('instanceSetVisibleComplete', function(e, $instance) {\n    let isSafeFrameInstance = function() {\n        return fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId} iframe#safeFrame${$instance.instanceId}`).length > 0;\n    }(),\n    HTMLComment,\n    isGPT = function() {\n        if (!isSafeFrameInstance)\n            return fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId}:commentContains(GPT)`).length > 0;\n        if (fiQuery(fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId} iframe`)[0].contentDocument.getElementById(\"resizeWrapper\")).length)\n            HTMLComment = fiQuery(fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId} iframe`)[0].contentDocument.getElementById(\"resizeWrapper\")).contents().filter(function() { return this.nodeType == 8 });\n        return typeof HTMLComment[0] == 'undefined' ? false :  HTMLComment[0].nodeValue.indexOf('GPT') != -1;\n    }(),\n    gptAdSafeFrameContainer = isGPT && isSafeFrameInstance ? fiQuery(fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId} iframe`)[0].contentDocument.getElementById(\"resizeWrapper\")).length && fiQuery(fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId} iframe`)[0].contentDocument.getElementById(\"resizeWrapper\")).contents().filter(function() {\n        return this.id && this.id.indexOf('gpt')\n    }) : null\n      , expctedSafeFrameHeight = gptAdSafeFrameContainer != null ? gptAdSafeFrameContainer[0].clientHeight : null\n      , expctedSafeFrameWidth = gptAdSafeFrameContainer != null ? gptAdSafeFrameContainer[0].clientWidth : null;\n    if (isGPT)\n        fiQuery(`div#FIOnDemandWrapper_${$instance.instanceId}`).append(`<style class=\"gpt-flexible-size-adjustment_${$instance.instanceId}\">div#FIOnDemandWrapper_${$instance.instanceId} { overflow: hidden; display: flex !important; flex-direction:column; width: auto !important; height: auto !important; } div#FIOnDemandWrapper_${$instance.instanceId} div.apd_static_banner { width: auto !important; height: auto !important; margin: auto !important; } ${(gptAdSafeFrameContainer != null ? `iframe#safeFrame${$instance.instanceId} { height : ${expctedSafeFrameHeight}px !important; width : ${expctedSafeFrameWidth}px !important; }` : ``)} <\/style>`);\n    else {\n        fiQuery(`.gpt-flexible-size-adjustment_${$instance.instanceId}`).remove();\n    }\n});"},"sessionTracking":true,"GDPRApplies":false,"USnatApplies":true,"USstatesApplies":false,"cmp_enforce":null,"incognito":null,"placements":[],"messages":[{"type":"info","text":"Will serve you ALL LIVE placements (all enabled placements, that are not in QA and not hidden)"},{"type":"info","text":"Profiling: serving no placements that suit your profile (yet): 150"}],"utm":{"utm_source":"direct","utm_medium":"direct","utm_campaign":"","utm_content":"","utm_keyword":"","utm_ref":""}}