{"tags":[{"tagId":"724e29d7-66bb-4b13-87a1-6df83209cd8b","tagTypeId":"custom_tag_type","name":"<3> [MAO] Native disable reg","description":"<3> [MAO] Native disable reg","config":{"beforeEndHead":"<style>\n #disableRegPopup [class*=\"Popup__actionButtons\"] {\n display: none !important;\n }\n</style>\n\n<script>\n (function () {\n // HC-12963 start\n // const { DeepLinkManager } = Playtech.HollandAPI;\n\n // if (DeepLinkManager.isCustomTabContext()) {\n // return;\n // }\n // HC-12963 end\n var playerTags = [];\n\n // HC-12681 -start\n const WC_ID = {\n nativeRegDisabled: \"NATIVE_REG_DISABLED\",\n nativeRegEnabled: \"NATIVE_REG_ENABLED\",\n };\n\n const CLIENT_TYPE = {\n poker: \"poker\",\n casino: \"casino\",\n };\n\n const CLIENT_PLATFORM = {\n download: \"download\",\n mobile: \"mobile\",\n };\n\n const WC_CLIENT = {\n [CLIENT_TYPE.poker]: {\n [CLIENT_PLATFORM.download]: WC_ID.nativeRegDisabled,\n [CLIENT_PLATFORM.mobile]: WC_ID.nativeRegDisabled,\n },\n [CLIENT_TYPE.casino]: {\n [CLIENT_PLATFORM.mobile]: WC_ID.nativeRegEnabled,\n },\n };\n\n function getUrlParams() {\n return Object.fromEntries(new URLSearchParams(location.search));\n }\n\n function getWCFromUrlParams() {\n const { clientType, clientPlatform } = getUrlParams();\n if (clientType && clientPlatform) {\n return (\n WC_CLIENT?.[clientType]?.[clientPlatform] || WC_ID.nativeRegDisabled\n );\n }\n return WC_ID.nativeRegDisabled;\n }\n // HC-12681 -end\n function isRegInProgress() {\n try {\n return playerTags.some(function (tag) {\n return (\n tag.name === \"portal/registration/InProgress\" &&\n tag.value === \"true\"\n );\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n // HC-12899 - start\n function isOnRGLimitPage() {\n try {\n return playerTags.some(function (tag) {\n return tag.name === \"portal/registration/PageRGLimit\";\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n // HC-12899 - end\n\n function showDisableRegPopup() {\n Playtech.API.popup.showPopup({\n articleId: getWCFromUrlParams(),\n layer: \"VERY_HIGH_PRIORITY\",\n isModal: true,\n id: \"disableRegPopup\",\n });\n }\n\n // HC-12683 start. create a popup observer to handle cases when the native disable popup is closed\n let popupObserver = null;\n\n function destroyPopupObserver() {\n if (popupObserver) {\n popupObserver.disconnect();\n popupObserver = null;\n }\n }\n\n function createPopupObserver() {\n if (popupObserver) return;\n\n popupObserver = new MutationObserver(function () {\n if (!isRegInProgress()) {\n destroyPopupObserver();\n return;\n }\n if (!document.getElementById(\"disableRegPopup\")) {\n showDisableRegPopup();\n }\n });\n\n const observeTarget =\n document.querySelector('[class*=\"PopupManager__popups\"]') ||\n document.body;\n popupObserver.observe(observeTarget, { childList: true, subtree: true });\n }\n // HC-12683 end. popup observer\n\n function main() {\n try {\n // HC-12899 isOnRGLimitPage\n if (isRegInProgress() && !isOnRGLimitPage()) {\n showDisableRegPopup();\n createPopupObserver();\n } else {\n destroyPopupObserver();\n }\n } catch (err) {\n console.log(\"disable reg error >>>\", err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n destroyPopupObserver();\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n })();\n</script>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"4085fe87-09fe-428d-a2fa-157736e9bd8e","tagTypeId":"custom_tag_type","name":"<13> [MAO] New Checkin","description":"<13> [MAO] New Checkin","config":{"beforeEndHead":"<style>\n /* start HC-11301 */\n :root {\n --biggestPossibleInt: 2147483647;\n }\n\n :root:has(.checkinFlow) {\n --help-button-z-index: calc(var(--biggestPossibleInt)) !important;\n --chat-z-index: calc(var(--biggestPossibleInt)) !important;\n }\n\n :root:has(.checkinFlow) #ada-chat-frame {\n z-index: calc(var(--biggestPossibleInt)) !important;\n }\n /* end HC-11301 */\n\n .checkinError {\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n /* HC-12293 - start */\n body:has(.btnDeclineCheckinPopup)\n [class*=\"PopupManager__layout\"]\n [class*=\"FlexButtonsBlock__flexButtonsBlock\"] {\n display: none;\n }\n /* HC-12293 - end */\n</style>\n<script>\n var checkinLoaded = Promise.withResolvers();\n\n function onCheckinLoad(checkin) {\n console.log(\"[CHECKIN] Checkin loaded\", checkin);\n checkinLoaded.resolve(checkin);\n }\n\n (() => {\n // HC-12453\n const simulateIdinCheck = false;\n let isInitialized = false;\n\n const checkinCustomDataObject = {\n simulateIdinCheck: simulateIdinCheck,\n };\n\n // HC-11856 - start\n const pageDocUploadTagName = \"portal/registration/PageDocUpload\";\n const pageExternalServiceTagName =\n \"portal/registration/PageExternalService\";\n const bodyElement = document.querySelector(\"body\");\n const checkinFlowClassName = \"checkinFlow\";\n // HC-11856 - end\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[CHECKIN] \"].concat(Array.from(arguments)),\n );\n }\n }\n\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n log(\"Error getting translation\", err);\n return \"Something went wrong...\";\n }\n }\n\n function createError() {\n var errorElement = document.createElement(\"div\");\n errorElement.classList.add(\"checkinError\");\n errorElement.innerHTML = translate(\n \"playtech.mobile.system.error.default\",\n );\n\n return errorElement;\n }\n\n function getAwsRequestData() {\n var awsApiUrl = Playtech.Variables.dynamicTags.find(\n (tag) => tag.name === \"AWS_API_URL\",\n ).value;\n var regBsnXApiKey = Playtech.Variables.dynamicTags.find(\n (tag) => tag.name === \"REG_BSN_X_API_KEY\",\n ).value;\n\n if (!awsApiUrl) {\n log(\"No api url provided\");\n return;\n }\n\n if (!regBsnXApiKey) {\n log(\"BsnXApiKey not set\");\n return;\n }\n\n return {\n awsApiUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": regBsnXApiKey,\n },\n };\n }\n\n // HC-11102 - start\n async function sendErrorDataToAWS(error, checkinData) {\n try {\n var awsRequestData = getAwsRequestData();\n\n if (awsRequestData) {\n var { awsApiUrl, headers } = awsRequestData;\n var email = Playtech.fetchUserDetails().email;\n\n var options = {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n email,\n error,\n checkinData,\n }),\n };\n\n var response = await window.fetch(\n `${awsApiUrl}/BSNOnboarding/Public/Anonymous/Data`,\n options,\n );\n\n log(\"AWS response to error case\", response); // qa can check response status\n }\n } catch (err) {\n log(\"Could not submit error data to AWS\", err);\n }\n }\n // HC-11102 - end\n\n async function processCheckinData({ data, completeData }) {\n try {\n log(\"data, completeData\", data, completeData);\n await Playtech.API.server.send({\n ID: 33045,\n description: \"Update player info\",\n responses: [33006, 31008],\n changeTimestamp: new Date()\n .toISOString()\n .replace(/[TZ]/g, \" \")\n .trim(),\n // HC-11238 - send only custom11\n dataMap: {\n custom11: completeData.mapped.ocrData.userData.dataMap.custom11,\n },\n });\n\n await Playtech.API.server.checkInDotComListenerRequest({\n // HC-11269\n requestContent: btoa(\n JSON.stringify({\n ocrData: { signed: completeData.mapped.ocrData.signed },\n }),\n ),\n });\n } catch (error) {\n log(\"Error submitting checking data: \", error);\n var placeholderText = document.querySelector(\".docUploadPlaceholder\");\n if (placeholderText) {\n placeholderText.parentNode.append(createError());\n placeholderText.style.display = \"none\";\n }\n sendErrorDataToAWS(error, {\n data,\n completeData,\n });\n }\n }\n\n // HC-10924 - start\n async function sendBSN(bsn) {\n try {\n var awsRequestData = getAwsRequestData();\n var userId = Playtech.fetchUserDetails().userId;\n var temporaryToken =\n await Playtech.API.auth.getTemporaryAuthenticationToken();\n\n if (awsRequestData && temporaryToken && userId) {\n var { awsApiUrl, headers } = awsRequestData;\n var bsnEndpoint = `${awsApiUrl}/BSNOnboarding/Public/Authenticated/BSN?userId=${encodeURIComponent(\n userId,\n )}&source=checkin`;\n var options = {\n method: \"POST\",\n headers: {\n ...headers,\n sessiontoken: temporaryToken,\n },\n body: JSON.stringify({ BSN: bsn }),\n };\n\n var response = await window.fetch(bsnEndpoint, options);\n log(\"AWS BSN response\", response); // qa can check response status\n }\n } catch (e) {\n log(`Error sending BSN: ${e}`);\n }\n }\n\n function handleBSN(data, diff) {\n log(\">> onUpdate diff\", {\n diff,\n data,\n });\n if (diff.user && diff.user.bsn) {\n sendBSN(diff.user.bsn);\n }\n }\n\n // HC-10924 - end\n\n function initCheckin() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n checkin.settings.enableConsoleLog();\n }\n\n checkin.dataFlow.setOnComplete(processCheckinData); // checkin will send user data in this cb in the end of the flow\n checkin.dataFlow.setOnUpdate(handleBSN); // checkin will send user data in this cb when there's any new data\n isInitialized = true;\n }\n\n // HC-12453 - step 2: deeplink injection\n function deepLinkInjection() {\n const urlParams = new URLSearchParams(\n decodeURIComponent(window.location.search),\n );\n const nativeDeeplink =\n urlParams.get(\"native_deeplink\") ||\n urlParams.get(\"native_deeplink_RedirectURL\");\n\n log(\"Set idin_redirect_url value: \", nativeDeeplink);\n\n if (nativeDeeplink) {\n checkinCustomDataObject[\"idin_redirect_url\"] = nativeDeeplink;\n }\n }\n\n function startCheckinFlow(tags, checkin) {\n if (!isInitialized) {\n initCheckin(checkin);\n }\n // HC-11856 - start\n bodyElement.classList.add(checkinFlowClassName);\n // HC-11856 - end\n var playerData = Playtech.fetchUserDetails();\n\n checkin.settings.setLang(\n Playtech.API.language.getCurrentLanguage() === \"en_US\" ? \"en\" : \"nl\",\n );\n // HC-12160\n checkin.settings.setVariant(\"fullflow\");\n // HC-12453 - step 2: deeplink injection\n deepLinkInjection();\n checkin.settings.setCustomData(checkinCustomDataObject);\n // HC-12453 - end\n const recoveryAppId = getRecoveryAppId(tags);\n const user = { externalId: playerData.username };\n if (recoveryAppId != null) {\n user.recoveryAppId = recoveryAppId;\n }\n log(\"Pass user data to checkin\", user);\n checkin.dataFlow.setKnownData({\n idscan: {\n variants: [\"fullflow\"],\n user: user,\n },\n }); // HC-11268\n checkin.signUp.open(); // open Checkin popup\n }\n\n async function handlePageDocUpload() {\n const checkin = await checkinLoaded.promise;\n const response = await Playtech.API.user.getPlayerTags(\"\", true);\n log(\"Player tags response\", response);\n try {\n var tags = response.data.tags;\n var isCheckinFlow =\n tags.some(function (tag) {\n return tag.name === pageDocUploadTagName; // if it's a 2nd step of reg\n }) &&\n tags.some(function (tag) {\n return (\n tag.name === pageExternalServiceTagName &&\n tag.value &&\n tag.value.toLowerCase() === \"checkin\"\n );\n });\n\n if (isCheckinFlow) {\n startCheckinFlow(tags, checkin);\n }\n } catch (err) {\n throw {\n error: err,\n code: 1,\n };\n }\n }\n\n // HC-12160\n function getRecoveryAppId(tags) {\n const processidTagName = \"checkin/processid\";\n const processidTag = tags.filter(function (tag) {\n return tag.name === processidTagName;\n });\n\n return (processidTag[0] && processidTag[0].value) || null;\n }\n\n // HC-11856 - start\n function handleRemoveClass(isRemovedORModifiedTag) {\n if (isRemovedORModifiedTag) {\n log(\"Remove class\");\n bodyElement.classList.remove(checkinFlowClassName);\n }\n }\n\n function handleChangePlayerTag(e) {\n const { tag, value, removed } = e?.detail || {};\n\n if (tag === pageDocUploadTagName || tag === pageExternalServiceTagName) {\n const isRemovedORModifiedTag =\n removed ||\n (tag === pageExternalServiceTagName &&\n value?.toLowerCase() !== \"checkin\");\n handleRemoveClass(isRemovedORModifiedTag);\n }\n }\n\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handleChangePlayerTag,\n );\n\n // HC-11856 - end\n\n // entry point\n if (Playtech.API.auth.isLoggedIn) {\n handlePageDocUpload();\n }\n\n // entry point\n Playtech.on(Playtech.Events.LOGGED_IN, handlePageDocUpload);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n window.checkin?.signUp.close();\n });\n })();\n</script>\n<script\n src=\"https://hollandcasino-fullflow.regily.com/50fcba4f77b326fe0e1f4db038d206f9.js\"\n async\n></script>","beforeEndBody":""},"conditionIds":["2e8f68c0-2d83-4009-bf0e-9507529535dc","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"b0605dbe-150e-4b1e-9b27-3741c05818a1","tagTypeId":"custom_tag_type","name":"<2> [MAO] Overlay Handler","description":"<2> [MAO] Overlay Handler - HC-13221","config":{"beforeEndHead":"","beforeEndBody":"<style>\n /* ===== Overlay ===== */\n\n .loader-overlay {\n position: fixed;\n inset: 0;\n background-color: var(--hc-blue);\n\n align-items: center;\n justify-content: center;\n z-index: calc(var(--popup-z-index) - 1);\n display: none;\n }\n\n .loader-overlay.show {\n display: flex;\n }\n\n /* ===== Loader ===== */\n .loader,\n .loader:after {\n border-radius: 50%;\n width: 5rem;\n height: 5rem;\n }\n\n .loader {\n margin: 0 auto;\n font-size: 0.3rem;\n position: relative;\n text-indent: -9999em;\n border-top: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-right: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-bottom: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-left: 0.3rem solid var(--hc-pink);\n transform: translateZ(0);\n animation: load8 1.1s infinite linear;\n }\n\n @keyframes load8 {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n</style>\n<div id=\"loader-overlay\" class=\"loader-overlay\">\n <div class=\"loader\">Loading</div>\n</div>\n\n<script>\n const { Logger } = Playtech.HollandAPI;\n const logger = new Logger(\"[MAO] Overlay First Deposit Popup\");\n const overlay = document.getElementById(\"loader-overlay\");\n\n function toggleOverlayLoader(e) {\n if (e && e?.overlayName === \"nativeoverlay\") {\n overlay.classList.toggle(\"show\", e?.isOpen);\n }\n }\n\n Playtech.on(\"OVERLAY_STATUS_CHANGED\", toggleOverlayLoader);\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n overlay.classList.remove(\"show\");\n });\n</script>\n"},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"da96d50c-2c39-4d58-96c2-75540ea4efd3","tagTypeId":"custom_tag_type","name":"<1> [MAO] Registration overlay","description":"<1> [MAO] Registration overlay","config":{"beforeEndHead":"","beforeEndBody":"<style>\n/* ===== Overlay ===== */\n.loader-overlay {\n position: fixed;\n inset: 0;\n background-color: var(--hc-blue);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: calc(var(--popup-z-index) - 1);\n}\n\n/* ===== Loader ===== */\n.loader,\n.loader:after {\n border-radius: 50%;\n width: 5rem;\n height: 5rem;\n}\n\n.loader {\n margin: 0 auto;\n font-size: 0.3rem;\n position: relative;\n text-indent: -9999em;\n border-top: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-right: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-bottom: 0.3rem solid rgba(255, 97, 109, 0.2);\n border-left: 0.3rem solid var(--hc-pink);\n transform: translateZ(0);\n animation: load8 1.1s infinite linear;\n}\n\n\nbody:has(.portlet-registration__step--1) .hidden-loader {\n display: none;\n}\n\n@keyframes load8 {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n</style>\n<div id=\"loader-overlay\" class=\"loader-overlay\">\n <div class=\"loader\">Loading</div>\n</div>"},"conditionIds":["2eb31cd2-61ba-4ccd-8805-dfa92311e2ef","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"a3920c5d-1791-4225-9559-f282c7468772","tagTypeId":"custom_css","name":"<1> [MAO] Hide Close Button for noPageAsPopup","description":"<1> [MAO] Hide Close Button for noPageAsPopup","config":{"style":"/* ===== Hide close button for noPageAsPopup HC-12856 ===== */\n[class*=\"PopupManager\"] [class*=\"CloseButton\"] {\n display: none;\n}"},"conditionIds":["2ebf77a4-06da-4efa-b9c2-411d308c097c","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"c6639e9e-735b-4c5f-adbf-f89a046fd87c","tagTypeId":"custom_js","name":"<4> [MAO] Redirect native register url","description":"add redirection native register blocking popup","config":{"code":"(function () {\n \"use strict\";\n\n const { Logger, NativeRegistrationHandler, DeepLinkLogin, DeepLinkManager } =\n Playtech.HollandAPI;\n\n const RG_LIMIT_TAG_NAME = \"portal/registration/PageRGLimit\";\n const HASH_TAG = location.hash;\n const WHITE_LIST_SEARCH_PARAMS = [\n \"auth_redirect\",\n \"idin_request_uid\",\n \"code\",\n \"display\",\n \"scope\",\n \"state\",\n \"transaction_id\",\n ];\n\n const logger = new Logger(\"MAO Redirect native register url\");\n const registrationHandler = new NativeRegistrationHandler({\n hashTag: HASH_TAG,\n whiteListSearchParams: WHITE_LIST_SEARCH_PARAMS,\n });\n\n async function checkRegFlowStatus() {\n const TAG_NAME = \"portal/registration/InProgress\";\n\n try {\n const response = await Playtech.API.user.getPlayerTags(TAG_NAME, true);\n const tags = response?.data?.tags;\n return tags?.length > 0 && tags[0].value === \"true\";\n } catch (error) {\n logger.log(\"error\", `Error checking player tag: ${TAG_NAME}`, error);\n return false;\n }\n }\n\n // HC-12882 start\n async function checkRGLimitPage() {\n try {\n const response = await Playtech.API.user.getPlayerTags(\n RG_LIMIT_TAG_NAME,\n true,\n );\n const tags = response?.data?.tags;\n return tags?.length > 0;\n } catch (error) {\n logger.log(\n \"error\",\n `Error checking player tag: ${RG_LIMIT_TAG_NAME}`,\n error,\n );\n return false;\n }\n }\n\n // HC-13202\n const showBlockingPopup = async () => {\n await new DeepLinkLogin().openLogin();\n setTimeout(() => {\n Playtech.API.popup.showPopup({\n isModal: true,\n id: \"redirection-native-register-blocking-popup\",\n layer: \"VERY_HIGH_PRIORITY\",\n buttons: [\n {\n text: Playtech.API.translation.translate(\n \"playtech.mobile.system.popup.returnToApp\",\n ),\n onClick: async () => await new DeepLinkLogin().openLogin(),\n },\n ],\n });\n }, 200);\n }\n\n async function handleLoginCompletion() {\n // HC-13202\n const isOnRGLimitPage = await checkRGLimitPage();\n // HC-12963 start\n if (DeepLinkManager.isCustomTabContext()) {\n // HC-13202\n if(isOnRGLimitPage) {\n await showBlockingPopup();\n }\n\n return;\n }\n // HC-12963 end\n\n const isRegFlowInProgress = await checkRegFlowStatus();\n // HC-12882\n\n if (isRegFlowInProgress && !isOnRGLimitPage) {\n registrationHandler.open({ useIDIN: true });\n }\n }\n\n const handleChangePlayerTag = async (event) => {\n // HC-12963 start\n if (!DeepLinkManager.isCustomTabContext()) {\n return;\n }\n // HC-12963 end\n const { tag } = event?.detail || {};\n\n if (tag === RG_LIMIT_TAG_NAME) {\n await showBlockingPopup();\n // HC-13159\n }\n };\n\n Playtech.on(Playtech.Events.LOGGED_IN, handleLoginCompletion);\n if (Playtech.API.auth.isLoggedIn) {\n (async () => {\n // HC-13202\n await handleLoginCompletion();\n })();\n }\n /**\n * Subscribe on user tag changes, when registration PageRGLimit tag will be added\n */\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handleChangePlayerTag,\n );\n // HC-12882 end\n})();\n"},"conditionIds":["ffa107aa-bb77-47e8-86d3-caad97cbbf82"]},{"tagId":"6456a7fc-7ce7-48f4-845b-f745103b5bd7","tagTypeId":"custom_js","name":"<5> [MAO] Onboarding tracking","description":"HC-13200, HC-13240","config":{"code":"(function () {\r\n \"use strict\";\r\n\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const clientType =\r\n searchParams.get(\"clientType\") ||\r\n searchParams.get(\"clienttype\") ||\r\n Playtech.Variables.clientType;\r\n const inProgressUserTag = \"portal/registration/InProgress\";\r\n const isInWebView = Playtech.API.htcmd.isEnabled;\r\n const { Logger, DeepLinkPortalEvent, DeepLinkLogin, DeepLinkManager } =\r\n Playtech.HollandAPI;\r\n const logger = new Logger(\"MAO Onboarding tracking\");\r\n\r\n logger.log(\"log\", \"The following parameters are expected\", {\r\n clientType,\r\n isInWebView,\r\n isInCustomTab: DeepLinkManager.isCustomTabContext(),\r\n });\r\n\r\n const checkRegFlowStatus = async (status) => {\r\n try {\r\n const response = await Playtech.API.user.getPlayerTags(\r\n inProgressUserTag,\r\n true,\r\n );\r\n const tags = response?.data?.tags;\r\n return tags?.length > 0 && tags[0].value === status;\r\n } catch (error) {\r\n logger.log(\r\n \"error\",\r\n `Error checking player tag: ${inProgressUserTag}`,\r\n error,\r\n );\r\n return false;\r\n }\r\n };\r\n\r\n const fetchUserDetails = (detail = []) => {\r\n try {\r\n return detail?.[0] || Playtech.fetchUserDetails();\r\n } catch (error) {\r\n logger.log(\"error\", `Error getting user model: ${error}`);\r\n return {};\r\n }\r\n };\r\n\r\n const setOnboardingTags = async (params = {}) => {\r\n const { isLightRegistration, detail } = params;\r\n const tagName = `onboarding/${\r\n isLightRegistration\r\n ? \"MobileLightRegistration\"\r\n : \"MobileRegistrationCompleted\"\r\n }`;\r\n const tag = {\r\n name: tagName,\r\n type: \"text\",\r\n value: clientType,\r\n };\r\n\r\n try {\r\n if (isLightRegistration) {\r\n return await Playtech.API.server.send({\r\n ID: 35508,\r\n responses: [35516, 35517],\r\n description: \"Batch: Set player tags\",\r\n errorLevel: 1,\r\n authParameters: {\r\n casinoName: Playtech.Variables.casinoName,\r\n playerName: fetchUserDetails(detail).userId,\r\n },\r\n requests: [\r\n {\r\n ID: 35544,\r\n responses: [35545, 35546],\r\n description: \"Set player tags\",\r\n errorLevel: 1,\r\n tags: [tag],\r\n },\r\n ],\r\n });\r\n }\r\n\r\n return await Playtech.API.user.setPlayerTags([tag]);\r\n } catch (error) {\r\n logger.log(\r\n \"error\",\r\n `Ups, the onboarding tag hasn't set: ${tagName}`,\r\n error,\r\n );\r\n }\r\n };\r\n\r\n const triggerOnboardingEvents = async (params = {}) => {\r\n const { isLightRegistration, detail } = params;\r\n\r\n if (isLightRegistration) {\r\n await new DeepLinkPortalEvent().triggerLightRegistration({\r\n customerID: fetchUserDetails(detail).userId,\r\n });\r\n return;\r\n }\r\n\r\n await new DeepLinkPortalEvent().triggerRegistrationCompleted();\r\n };\r\n\r\n const sendRegistrationEvent = async (params = {}) => {\r\n const { isLightRegistration, detail } = params;\r\n\r\n if (!Playtech.API.htcmd.isEnabled) return; // HC-13184\r\n\r\n await setOnboardingTags({ isLightRegistration, detail });\r\n await triggerOnboardingEvents({ isLightRegistration, detail });\r\n\r\n if (!isLightRegistration) {\r\n await new DeepLinkLogin().openLogin();\r\n }\r\n };\r\n\r\n /**\r\n * Subscribe on LightRegistration completion\r\n */\r\n Playtech.on(\"REGISTRATION_COMPLETED\", async function (detail) {\r\n await sendRegistrationEvent({ isLightRegistration: true, detail });\r\n });\r\n\r\n /**\r\n * Subscribe on user tag changes, when registration inProgress tag will become false\r\n */\r\n Playtech.API.events.addEventListener(\"player-tag-change\", async (event) => {\r\n const { tag, value } = event?.detail || {};\r\n\r\n if (tag === inProgressUserTag && value === \"false\") {\r\n await sendRegistrationEvent({ isLightRegistration: false });\r\n }\r\n });\r\n\r\n if (Playtech.API.auth.isLoggedIn) {\r\n (async () => {\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n\r\n if (await checkRegFlowStatus(\"false\")) {\r\n await sendRegistrationEvent({ isLightRegistration: false });\r\n }\r\n })();\r\n }\r\n})();\r\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1179894d-de42-406d-bf9e-f056fac76eb8","tagTypeId":"custom_js","name":"<2> [MAO] Session expired in native app","description":"<2> [MAO] Session expired in native app","config":{"code":"(function () {\n \"use strict\";\n\n const LOGIN_ROUTE = \"/inloggen\";\n const { Logger, DeepLinkLogin, DeepLinkManager } = Playtech.HollandAPI;\n const logger = new Logger(\"MAO Session expired in native app\");\n\n async function navigateToLoginForm() {\n // HC-12963 start added class DeepLinkManager to check if we are in CustomTab context\n if (DeepLinkManager.isCustomTabContext()) {\n // HC-12963 end\n logger.log(\"log\", \"Session expired, navigate to Deep Link Login\");\n await new DeepLinkLogin().openLogin();\n setTimeout(() => {\n Playtech.API.popup.showPopup({\n isModal: true,\n id: \"redirection-native-register-blocking-popup\",\n layer: \"VERY_HIGH_PRIORITY\",\n buttons: [\n {\n text: Playtech.API.translation.translate(\n \"playtech.mobile.system.popup.returnToApp\",\n ),\n onClick: async () => await new DeepLinkLogin().openLogin(),\n },\n ],\n });\n }, 500);\n return;\n }\n\n if (Playtech.API.htcmd.isEnabled) {\n logger.log(\"log\", \"Session expired, navigate to webview login form\");\n\n Playtech.API.common.navigate(LOGIN_ROUTE);\n }\n }\n\n Playtech.on(Playtech.Events.LOGGED_OUT, navigateToLoginForm);\n})();"},"conditionIds":["ffa107aa-bb77-47e8-86d3-caad97cbbf82"]},{"tagId":"bf66122b-e5ec-46ff-bbfc-fc5b886e7a64","tagTypeId":"hc_player_tag_conditional_popup","name":"City of Birth request popup (Universal player tag)","description":"HC-13161 Universal player tag popup","config":{"tagsPresent":"operation/city_of_birth_recheck","webContentId":"2_MANDATORY_CITY_OF_BIRTH_FIELD_TAG_WC","isHideBtn":true,"isModal":true,"tagsNotPresent":"operation/city_of_birth_submit"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"ef983eba-5694-4228-9f73-dd15bd053acf","tagTypeId":"custom_js","name":"<2> Game launch","description":"game launch","config":{"code":"(function() {\n if (\n Playtech.API.common.getCleanUrl() !== '/gamelaunch' ||\n Playtech.Variables.isAdminLoggedIn\n ) {\n return;\n }\n\n var searchParams = new URLSearchParams(window.location.search);\n var gameCodeValue = searchParams.get('gameCode');\n\n function waitForGamesConfiguration() {\n var delay = 1000;\n var times = 0;\n\n function attempt(resolve, reject) {\n Playtech.API.game.getGamesConfiguration()\n .then(function(config) {\n if (config && config.games) {\n resolve(config);\n return;\n }\n\n retry(resolve, reject);\n })\n .catch(function() {\n retry(resolve, reject);\n });\n }\n\n function retry(resolve, reject) {\n if (times >= 30) {\n reject({ times: times });\n return;\n }\n\n times += 1;\n setTimeout(function() {\n attempt(resolve, reject);\n }, delay);\n }\n\n return new Promise(function(resolve, reject) {\n setTimeout(function() {\n attempt(resolve, reject);\n }, delay);\n });\n }\n\n function launchGame(code) {\n if (Playtech.API.auth.isLoggedIn) {\n Playtech.API.popup.showPopup({\n content: 'playtech.mobile.system.games.popup-blocker-with-confirm',\n buttons: [\n {\n text: 'playtech.mobile.system.button.realPlay',\n onClick() {\n Playtech.API.game.open({ code: code });\n }\n }\n ],\n layer: 'HIGH_PRIORITY'\n });\n } else {\n Playtech.API.game.open({ code: code });\n }\n }\n\n if (gameCodeValue) {\n waitForGamesConfiguration().then(function() {\n Playtech?.API.common.navigate(\n '/',\n { replace: true },\n { removeParams: ['gameCode'] }\n );\n\n launchGame(gameCodeValue);\n });\n } else {\n Playtech.API.common.navigate('/error-page');\n }\n})();"},"conditionIds":["f47bb07f-0e1a-4901-b766-673d8728d2dd","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"8a53381f-a88c-4a88-9771-75c669194f2f","tagTypeId":"custom_js","name":"<4> Push User Data to DataLayer","description":"HC-13069","config":{"code":"(function () {\r\n const LOGIN_EVENT = \"login\";\r\n const REGISTRATION_COMPLETED_EVENT = \"Registration:online:first_login\";\r\n\r\n async function sha256Hash(email) {\r\n const encoder = new TextEncoder();\r\n const emailBuffer = encoder.encode(email);\r\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", emailBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n const hashHex = hashArray\r\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n return hashHex;\r\n }\r\n\r\n function calculateUserAge(date) {\r\n if (!date) return 0;\r\n\r\n return Math.abs(new Date(new Date() - new Date(date)).getFullYear() - 1970);\r\n }\r\n\r\n function getAgeGroup(age) {\r\n const ageGroups = [\r\n { min: 18, max: 23, group: 1 },\r\n { min: 24, max: 29, group: 2 },\r\n { min: 30, max: 34, group: 3 },\r\n { min: 35, max: 39, group: 4 },\r\n { min: 40, max: 44, group: 5 },\r\n { min: 45, max: 49, group: 6 },\r\n { min: 50, max: 54, group: 7 },\r\n { min: 55, max: 60, group: 8 },\r\n { min: 61, max: Infinity, group: 9 },\r\n ];\r\n\r\n for (const ageGroup of ageGroups) {\r\n if (age >= ageGroup.min && age <= ageGroup.max) {\r\n return ageGroup.group;\r\n }\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n const setUserData = (event, detail) => {\r\n let userDetails = {};\r\n const user = {};\r\n\r\n if (event === REGISTRATION_COMPLETED_EVENT && detail && detail.length > 0) {\r\n userDetails = detail[0];\r\n }\r\n\r\n const { userId, email, birthDate } =\r\n event === LOGIN_EVENT ? Playtech.fetchUserDetails() : userDetails; // HC-13069\r\n\r\n const userAge = calculateUserAge(birthDate);\r\n const ageGroup = getAgeGroup(userAge);\r\n\r\n user.userId = userId;\r\n if (ageGroup) {\r\n user.ageGroup = ageGroup;\r\n }\r\n\r\n sha256Hash(email)\r\n .then((hash) => {\r\n user.hash = hash;\r\n })\r\n .catch((err) => {\r\n console.error(\"HC-11898 Error hashing email:\", err);\r\n })\r\n .finally((err) => {\r\n window.dataLayer = window.dataLayer || [];\r\n\r\n const dataLayerObject = {\r\n event: event,\r\n user: user,\r\n };\r\n\r\n if (event === REGISTRATION_COMPLETED_EVENT) {\r\n dataLayerObject.new_customer = true;\r\n }\r\n window.dataLayer.push(dataLayerObject);\r\n });\r\n };\r\n\r\n if (Playtech.API.auth.isLoggedIn) {\r\n setUserData(LOGIN_EVENT);\r\n }\r\n\r\n Playtech.on(Playtech.Events.LOGGED_IN, () => {\r\n setUserData(LOGIN_EVENT);\r\n });\r\n\r\n Playtech.on(Playtech.Events.REGISTRATION_COMPLETED, (detail) => {\r\n setUserData(REGISTRATION_COMPLETED_EVENT, detail);\r\n });\r\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"32abf988-02c7-453a-941c-1c09793a91b7","tagTypeId":"custom_tag_type","name":"<4> - NEW ADA AI Integration","description":"NEW ADA AI Integration","config":{"beforeEndHead":"<style type=\"text/css\">\r\n iframe#ada-button-frame {\r\n display: none !important;\r\n }\r\n</style>\r\n<script>\r\n (function () {\r\n let isAdaReady = false;\r\n let isStarted = false;\r\n\r\n let isToggled = false;\r\n let isProactive = false;\r\n let playerTags = [];\r\n let proactiveMessageKey = null;\r\n let isTriggeredProactiveMessage = false;\r\n\r\n const PROACTIVE_NEW_USER_TAG_NAME = \"adachatbot/proactive_new\";\r\n\r\n function log() {\r\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\r\n console.log.apply(console, [\"[AI ADA] \"].concat(Array.from(arguments)));\r\n }\r\n }\r\n\r\n function getJWTToken() {\r\n log(\"get JWT\");\r\n\r\n return Playtech.API.server.getJWTToken().then(function ({ data }) {\r\n return data.jwtToken;\r\n });\r\n }\r\n\r\n function toggleCallback(isDrawerOpen) {\r\n isToggled = isDrawerOpen;\r\n\r\n log(\"toggleCallback received\", isToggled);\r\n\r\n Playtech.API.events.dispatchEvent(\r\n new CustomEvent(Playtech.Events.CHAT_WINDOW_STATUS, {\r\n detail: {\r\n chat: \"ada\",\r\n isOpened: isDrawerOpen,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n function onAdaEmbedLoaded() {\r\n log(\"onAdaEmbedLoaded received\");\r\n }\r\n\r\n function adaReadyCallback({ isRolledOut }) {\r\n isAdaReady = isRolledOut;\r\n log(\"adaReadyCallback received\", isAdaReady);\r\n\r\n if (hasProactiveNewUserTagName(playerTags) && !isTriggeredProactiveMessage) {\r\n isTriggeredProactiveMessage = true;\r\n triggerProactiveMessage(proactiveMessageKey);\r\n }\r\n\r\n if (isProactive && !isToggled) {\r\n toggleBot([{ chat: \"ada\" }]);\r\n }\r\n }\r\n\r\n function getSensitiveMetaFields(token) {\r\n return token\r\n ? {\r\n jwt_token: token,\r\n }\r\n : {};\r\n }\r\n\r\n function getMetaFields(extraFields) {\r\n return {\r\n // list of predefined vars here,\r\n // which must be specified with empty value,\r\n // even if they are not ready right now\r\n userId: Playtech.fetchUserDetails().userId,\r\n ...extraFields,\r\n };\r\n }\r\n\r\n function getAdaSettings({ token, messageKey }) {\r\n const dataSettings = {\r\n cluster: \"eu\",\r\n toggleCallback,\r\n // hideMask: false,\r\n // language: \"NL\",\r\n adaReadyCallback,\r\n onAdaEmbedLoaded,\r\n mobileOverlay: true,\r\n handle: \"hollandcasinoai\",\r\n metaFields: getMetaFields(messageKey),\r\n sensitiveMetaFields: getSensitiveMetaFields(token),\r\n // greeting: \"6372813824417240bce71f1a\", // greeting we do not use.\r\n };\r\n log(\"Ada settings\", dataSettings);\r\n\r\n return dataSettings;\r\n }\r\n\r\n // TODO: I don't know if we need it.\r\n // for further usage\r\n // function openAnswer(answerId) {\r\n // if (!isAdaReady) {\r\n // return;\r\n // }\r\n\r\n // if (isToggled) {\r\n // log(\"triggering specific answer\", answerId);\r\n // window.adaEmbed.triggerAnswer(answerId);\r\n // } else {\r\n // log(\"toggling\");\r\n // window.adaEmbed.toggle();\r\n // }\r\n // }\r\n // TODO: end.\r\n\r\n function triggerProactiveMessage(messageKey) {\r\n log(\"triggering proactive message\", { messageKey });\r\n window.adaEmbed?.triggerProactive(messageKey);\r\n }\r\n\r\n async function startBot() {\r\n if (isStarted) {\r\n return;\r\n }\r\n\r\n const token = await getJWTToken();\r\n log(\"starting\");\r\n\r\n proactiveMessageKey = await getProactiveMessageKey();\r\n\r\n window.adaEmbed.start(\r\n getAdaSettings({ token, messageKey: proactiveMessageKey }),\r\n );\r\n isStarted = true;\r\n log(\"message Key\", { messageKey: proactiveMessageKey });\r\n\r\n if (!hasProactiveNewUserTagName(playerTags)) {\r\n isProactive = Boolean(proactiveMessageKey);\r\n }\r\n }\r\n\r\n // TODO: I don't know if we need it.\r\n // for further usage\r\n // async function resetBot(metaFields) {\r\n // if (!isAdaReady) {\r\n // return;\r\n // }\r\n\r\n // const token = await getJWTToken();\r\n // log(\"reset\", { metaFields });\r\n // window.adaEmbed.reset(getAdaSettings({ token, metaFields }));\r\n // isStarted = true;\r\n // }\r\n // TODO: end.\r\n\r\n function stopBot() {\r\n if (!isStarted) {\r\n return;\r\n }\r\n\r\n log(\"stopping\");\r\n window.adaEmbed.stop();\r\n isStarted = false;\r\n isProactive = false;\r\n }\r\n\r\n function toggleBot(e) {\r\n if (!isAdaReady || !isStarted) {\r\n return;\r\n }\r\n\r\n if (e && e.length > 0 && e[0].chat === \"ada\") {\r\n log(\"toggling\");\r\n window.adaEmbed.toggle();\r\n }\r\n }\r\n\r\n // TODO: I think we don't need this function.\r\n // HC-10930\r\n // async function adaChatBotProactive(e) {\r\n // const metaFields = await getNextAnswerToRun(e);\r\n\r\n // if (metaFields) {\r\n // await resetBot(metaFields);\r\n\r\n // if (!isToggled) {\r\n // toggleBot([{ chat: \"ada\" }]);\r\n // }\r\n // }\r\n // }\r\n // TODO: end.\r\n\r\n async function openAdaChatBotProactiveTag(e) {\r\n proactiveMessageKey = await getProactiveMessageKey(e);\r\n\r\n if (proactiveMessageKey) {\r\n triggerProactiveMessage(proactiveMessageKey);\r\n }\r\n }\r\n\r\n function hasProactiveNewUserTagName(tags) {\r\n if (Array.isArray(tags)) {\r\n return tags.some(({ name }) => name === PROACTIVE_NEW_USER_TAG_NAME);\r\n }\r\n return false;\r\n }\r\n\r\n function handlePlayerTagChange(e) {\r\n if (hasProactiveNewUserTagName([{ name: e.detail?.tag }])) {\r\n return openAdaChatBotProactiveTag(e);\r\n }\r\n }\r\n\r\n function fetchUserDetails() {\r\n try {\r\n return Playtech.fetchUserDetails();\r\n } catch (e) {\r\n return {};\r\n }\r\n }\r\n\r\n async function getProactiveMessageKey(e) {\r\n const { authType } = fetchUserDetails();\r\n\r\n if (e) {\r\n const { tag, value, removed } = e.detail;\r\n\r\n if (PROACTIVE_NEW_USER_TAG_NAME === tag && !removed) {\r\n return {\r\n messageKey: value,\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // HC-11020 - task to add authType to sessionStorage\r\n if (authType === \"credentials\") {\r\n ({\r\n data: { tags: playerTags },\r\n } = await Playtech.API.user.getPlayerTags(PROACTIVE_NEW_USER_TAG_NAME));\r\n\r\n log(\"Player tags response\", playerTags);\r\n\r\n if (Array.isArray(playerTags)) {\r\n if (playerTags.length === 1) {\r\n return {\r\n messageKey: playerTags[0].value,\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function onLoadBot() {\r\n if (Playtech.API.auth.isLoggedIn) {\r\n startBot();\r\n }\r\n Playtech.on(Playtech.Events.LOGGED_IN, startBot);\r\n Playtech.on(Playtech.Events.LOGGED_OUT, stopBot);\r\n Playtech.on(Playtech.Events.CHAT_TOGGLE, toggleBot);\r\n Playtech.API.events.addEventListener(\r\n \"player-tag-change\",\r\n handlePlayerTagChange,\r\n );\r\n }\r\n\r\n window.onLoadBot = onLoadBot;\r\n })();\r\n</script>\r\n<script\r\n async\r\n id=\"__ada\"\r\n data-lazy\r\n onload=\"onLoadBot()\"\r\n src=\"https://static.ada.support/embed2.js\"\r\n></script>","beforeEndBody":""},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"d98a0792-c211-4ba7-b1e9-eb2abacddabe","tagTypeId":"custom_js","name":"PGG2 Feedback","description":"PGG2 CMS Feedback Clicks & Reporting","config":{"code":"(async () => {\n Playtech.on('GAME_LAUNCH', ([\n {\n gameCode,\n gameFeed,\n launchType,\n container,\n gamePositionInCategory,\n categoryPosition,\n categoryName,\n pggCategoryName\n }\n ]) => {\n if (!Playtech.API.auth.isLoggedIn || launchType !== 'Real') {\n return;\n }\n\n const params = new URLSearchParams({\n launch_ctx: container,\n user_id: Playtech.fetchUserDetails().userId,\n launch_code: gameCode,\n brand: Playtech.Variables.casinoName,\n cplat: Playtech.API.device.formFactor,\n cat_name: categoryName,\n feed_name: gameFeed || 'Dynamic',\n game_pos: gamePositionInCategory,\n cat_pos: categoryPosition,\n pgg_cat_name: pggCategoryName\n });\n\n fetch(`https://pgg.bit.ptecha.io/feedback?${params.toString()}`);\n });\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"d6838a7c-7ce4-4a18-aa05-c7b8c31a3a89","tagTypeId":"hc_aws_message","name":"New AWS message","description":"test for HC-12871 [HC-12996]","config":{"apiUrl":"https://cache.production.api.hollandcasino.nl/v1/maintenance/message/","apiKey":"FARJ9ybYar8WL1binV6115LFBVkCKAgJ9pafQDfk"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"34672df7-7a22-4ff3-b45d-4fae1090acc3","tagTypeId":"custom_tag_type","name":"<8> Onboarding - TN custom START Button","description":"HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"","beforeEndBody":"<style>\n [class*=\"StepsCounter__stepCounter\"] + [class*=\"Iframe__\"],\n .docUploadContainer + [class*=\"Iframe__\"] {\n display: none;\n }\n\n .docUploadContainer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .docUploadContainer > * {\n margin: 1rem 0;\n }\n\n .docUploadButton.inactive {\n pointer-events: none;\n }\n\n .docUploadError {\n font-size: 80%;\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n</style>\n<script>\n (function () {\n var playerTags = [];\n var tKeys = {\n captureTooltip:\n \"playtech.mobile.system.step2.onboarding.docs.capture.tooltip\",\n startBtnText: \"system.step2.onboarding.docs.start\",\n startTooltip: \"system.step2.onboarding.docs.start.tooltip\",\n };\n const customDocUploadProvider = Playtech.Variables.dynamicTags.find(\n ({ name }) => name === \"CUSTOM_DOC_UPLOAD_PROVIDER\",\n )?.value;\n // console.log('>>> customDocUploadProvider', customDocUploadProvider)\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n throw { error: err, code: 3 };\n }\n }\n\n // start HC-11285\n function isTruNarrativeFlow() {\n try {\n return (\n playerTags.some(function (tag) {\n return tag.name === \"portal/registration/PageDocUpload\";\n }) &&\n !playerTags.some(function (tag) {\n return (\n tag.name === \"portal/registration/PageExternalService\" &&\n tag.value &&\n tag.value.toLowerCase() === customDocUploadProvider\n );\n })\n );\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n // end HC-11285\n\n function observeIframe() {\n return new Promise(function (resolve, reject) {\n try {\n var wrapper = document.querySelector(\n \"[class*=Iframe__iframeWrapper]\",\n );\n\n if (\n wrapper &&\n wrapper.querySelector(\"iframe\") &&\n wrapper.querySelector(\"iframe\").src\n ) {\n resolve(wrapper.querySelector(\"iframe\"));\n return;\n }\n\n var popupEl = getPopupContentContainer();\n\n new MutationObserver(function (mutationList, observer) {\n try {\n for (var mutation of mutationList) {\n if (\n mutation.target.querySelector(\"iframe\") &&\n mutation.target.querySelector(\"iframe\").src\n ) {\n resolve(mutation.target.querySelector(\"iframe\"));\n observer.disconnect();\n break;\n }\n }\n } catch (err) {\n reject(err);\n }\n }).observe(popupEl, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n\n function getRedirectURL() {\n return observeIframe()\n .then(function (iframe) {\n var src = iframe.src;\n iframe.src = \"about:blank\";\n\n return src;\n })\n .catch(function (err) {\n return Promise.reject({ error: err, code: 4 });\n });\n }\n\n function getPopupContentContainer() {\n try {\n return document.querySelector(\"[class*=StepsCounter__stepCounter]\")\n .parentNode;\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function createDocUploadContainer() {\n var div = document.createElement(\"div\");\n div.classList.add(\"docUploadContainer\");\n\n return div;\n }\n\n function createDocUploadCaptureTooltip() {\n var div = document.createElement(\"div\");\n div.innerHTML = translate(tKeys.captureTooltip);\n\n return div;\n }\n\n function createDocUploadLink(src) {\n var link = document.createElement(\"a\");\n link.href = src;\n link.target = \"_blank\";\n link.classList.add(\"docUploadButton\");\n link.classList.add(\"inactive\");\n\n var btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.classList.add(\"btn\");\n btn.innerHTML = translate(tKeys.startBtnText);\n btn.disabled = true;\n\n var disable = function (isDisabled) {\n if (isDisabled) {\n btn.setAttribute(\"disabled\", \"disabled\");\n link.classList.add(\"inactive\");\n } else {\n btn.removeAttribute(\"disabled\");\n link.classList.remove(\"inactive\");\n }\n };\n\n btn.addEventListener(\"click\", function () {\n disable(true);\n });\n\n link.append(btn);\n\n return [link, disable];\n }\n\n function createError(err) {\n var div = document.createElement(\"div\");\n var error = err.error || err;\n var prefix = \"Error \" + (err.code || -1) + \": \";\n\n div.classList.add(\"docUploadError\");\n div.innerHTML =\n prefix +\n ((error.response && (error.response.data.errorMessage || err.reason)) ||\n error.message);\n\n return div;\n }\n\n function createDocUploadLinkTooltip() {\n var text = document.createElement(\"p\");\n text.innerHTML = translate(tKeys.startTooltip);\n\n return text;\n }\n\n function main() {\n try {\n if (isTruNarrativeFlow()) {\n var docUploadContainer = createDocUploadContainer();\n var capture = createDocUploadCaptureTooltip();\n var [uploadLink, disable] = createDocUploadLink();\n var uploadLinkTooltip = createDocUploadLinkTooltip();\n\n docUploadContainer.append(capture);\n docUploadContainer.append(uploadLink);\n docUploadContainer.append(uploadLinkTooltip);\n getPopupContentContainer().append(docUploadContainer);\n\n getRedirectURL()\n .then(function (url) {\n uploadLink.href = url;\n disable(false);\n })\n .catch(function (err) {\n docUploadContainer.append(createError(err));\n });\n }\n } catch (err) {\n getPopupContentContainer().append(createError(err));\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n })();\n</script>"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"a887fda8-544d-4fc7-8ec8-3fab7d512f49","tagTypeId":"custom_tag_type","name":"<5> - BlockingModalPopup","description":"popup that blocks the entire site (HC-11939). HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"","beforeEndBody":"<style>\n :root {\n --biggestPossibleInt: 2147483647;\n }\n #blockingModalPopup .hideBtn {\n display: none;\n }\n [class*=\"PopupManager__popups\"]:has(#blockingModalPopup) {\n z-index: calc(var(--biggestPossibleInt) - 1);\n position: relative; /* HC-11379 */\n }\n :root:has(#blockingModalPopup) {\n --help-button-z-index: calc(var(--biggestPossibleInt)) !important;\n --chat-z-index: calc(var(--biggestPossibleInt)) !important;\n }\n body:has(#blockingModalPopup) #ada-chat-frame {\n z-index: calc(var(--biggestPossibleInt)) !important;\n }\n\n /* start HC-11939 */\n .regily-module {\n z-index: calc(var(--biggestPossibleInt) - 2);\n }\n /* end HC-11939 */\n</style>\n\n<script>\n (function () {\n let isPopupOpened = false;\n const popupID = \"blockingModalPopup\";\n const pageHoldTagName = \"portal/registration/pageHold\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Blocking Modal Popup] \"].concat(Array.from(arguments)),\n );\n }\n }\n\n function showPopup(webContent) {\n if (isPopupOpened) {\n return;\n }\n\n Playtech.API.popup.showPopup({\n id: popupID,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: \"hideBtn\" },\n articleId: webContent,\n isModal: true,\n });\n log(\"Show Popup\");\n isPopupOpened = true;\n }\n\n function closePopup() {\n if (!isPopupOpened) {\n return;\n }\n\n log(\"Close Popup\");\n Playtech.API.popup.closePopups(popupID);\n isPopupOpened = false;\n }\n\n function handleLoggedIn({ value } = {}) {\n log(\"Web Content ID\", value);\n\n if (value) {\n showPopup(value);\n }\n }\n\n function handleChangePlayerTag(e) {\n const { tag, value, removed } = e?.detail || {};\n\n if (tag === pageHoldTagName) {\n log(\"Player tag change\");\n // HC-12296 - start\n closePopup();\n // HC-12296 - end\n if (removed) {\n log(\"Close Popup\");\n return;\n }\n\n if (value) {\n log(\"Open Popup with new WC\");\n showPopup(value);\n }\n }\n }\n\n function getPageHoldTagValue() {\n return Playtech.API.user.getPlayerTags(pageHoldTagName).then(function ({\n data,\n }) {\n log(\"Get page hold tag value\", data);\n if (data.tags[0]) {\n return {\n value: data.tags[0].value,\n };\n }\n return {};\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPageHoldTagValue().then(handleLoggedIn);\n });\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n closePopup();\n });\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handleChangePlayerTag,\n );\n if (Playtech.API.auth.isLoggedIn) {\n getPageHoldTagValue().then(handleLoggedIn);\n }\n })();\n</script>\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"322c5fc7-b67f-4c98-9558-06597561344e","tagTypeId":"custom_tag_type","name":"<4> [Regulation] - MessagePopupWithTimer","description":"HC-11601 [STC] 30s popup should be shown every time until user has confirmed deposit limits. HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"<!-- Tag start -->\n<style>\n #regulationMessagePopupWithTimer .regulationBtnContainer {\n display: none;\n }\n</style>\n\n<script>\n (function () {\n let playerTags = [];\n const POPUP_ID = \"regulationMessagePopupWithTimer\";\n const WEB_CONTENT = \"REGULATIONS_MESSAGE_WITH_TIMER\";\n const REQUIRE_CONFIRMATION_PLAYER_TAG_NAME =\n \"portal/regulation/requireConfirmation\";\n const BTN_CONTAINER_CLASS_NAME = \"regulationBtnContainer\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Regulation Message Popup With Timer] \"].concat(\n Array.from(arguments),\n ),\n );\n }\n }\n\n function shouldShowBlockingPopup() {\n try {\n return playerTags.some(function (tag) {\n return (\n tag.name === REQUIRE_CONFIRMATION_PLAYER_TAG_NAME &&\n tag.value === \"true\"\n );\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function showRegulationPopup() {\n try {\n if (shouldShowBlockingPopup()) {\n log(\"Show Popup\");\n Playtech.API.popup.showPopup({\n articleId: WEB_CONTENT,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: BTN_CONTAINER_CLASS_NAME },\n id: POPUP_ID,\n onClose: function () {\n Playtech.API.auth.logout();\n log(\"Logout user\");\n },\n });\n }\n } catch (err) {\n log(\"Error\", err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(showRegulationPopup);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(showRegulationPopup);\n }\n })();\n</script>\n<!-- Tag end -->","beforeEndBody":""},"conditionIds":["2e8f68c0-2d83-4009-bf0e-9507529535dc","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1e696d4c-ba61-483d-ae59-e74a7b8b3aa0","tagTypeId":"custom_js","name":"<3> - Pre-cache IDIN url","description":"Pre-cache IDIN url. HC-12276 - temporary fix for LOGGED_IN","config":{"code":"(function () {\n let wasCached = false;\n\n async function initiateDocumentUpload(docType) {\n await Playtech.API.server.initiateDocumentUpload({\n documentType: docType,\n service: \"trunarrative\",\n });\n\n wasCached = true;\n }\n\n async function fetchDocumentType() {\n const {\n data: { tags },\n } = await Playtech.API.user.getPlayerTags(\n \"portal/registration/PageExternalService\",\n );\n console.log(\">>> fetchDocumentType tags:\", tags);\n return tags[0]?.value;\n }\n\n async function initiateDocumentUploadIfIDIN() {\n if (wasCached) {\n return;\n }\n\n const docType = await fetchDocumentType();\n\n if (docType === \"IDIN\") {\n initiateDocumentUpload(docType);\n }\n }\n\n function playerTagChangeListener(e) {\n const { tag, value, removed } = e.detail;\n\n if (\n !wasCached &&\n tag === \"portal/registration/PageExternalService\" &&\n !removed &&\n value === \"IDIN\"\n ) {\n initiateDocumentUpload(value);\n }\n }\n\n function subscribeOnTagChange() {\n initiateDocumentUploadIfIDIN();\n\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n playerTagChangeListener,\n );\n }\n\n function unsubscribeOnTagChange() {\n Playtech.API.events.removeEventListener(\n \"player-tag-change\",\n playerTagChangeListener,\n );\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, subscribeOnTagChange);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, unsubscribeOnTagChange);\n\n if (Playtech.API.auth.isLoggedIn) {\n subscribeOnTagChange();\n }\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1c96b0ea-3174-4ffd-9811-16ca64c17fe7","tagTypeId":"custom_tag_type","name":"<3> - IDIN Native","description":"Custom onClick handler for LaunchIDIN btn in native (PageIDINAddress). HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"<style>\n button[class*=\"IDINAddress__btnLaunch\"] {\n display: none !important;\n }\n\n .idinError {\n font-size: 80%;\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n\n .btn {\n display: block;\n margin: 5rem auto 3rem;\n }\n</style>\n<script>\n (function () {\n var playerTags = [];\n\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function isPageIDINAddress() {\n try {\n return playerTags.some(function (tag) {\n return tag.name === \"portal/registration/PageIDINAddress\";\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function getPopupContentContainer() {\n try {\n return document.querySelector(\"[class*=StepsCounter__stepCounter]\")\n .parentNode;\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function createContainer() {\n var div = document.createElement(\"div\");\n div.classList.add(\"idinContainer\");\n\n return div;\n }\n\n function createError(err) {\n var div = document.createElement(\"div\");\n var error = err.error || err;\n var prefix = \"Error \" + (err.code || -1) + \": \";\n\n div.classList.add(\"idinError\");\n div.innerHTML =\n prefix +\n ((error.response && (error.response.data.errorMessage || err.reason)) ||\n error.message);\n\n return div;\n }\n\n function appendError(err) {\n var containerEl =\n document.querySelector(\".idinContainer\") || getPopupContentContainer();\n if (containerEl) {\n containerEl.append(createError(err));\n }\n }\n\n function createNewLaunchBtn() {\n var btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.classList.add(\"btn\");\n btn.innerHTML = translate(\n \"playtech.mobile.system.hc-registration.IDINAddress.button.launchIDIN\",\n );\n\n btn.addEventListener(\"click\", function () {\n btn.setAttribute(\"disabled\", \"disabled\");\n\n var docType =\n playerTags &&\n playerTags.find(\n (tag) => tag.name === \"portal/registration/PageExternalService\",\n )?.value;\n if (docType) {\n Playtech.API.server\n .initiateDocumentUpload({\n documentType: docType,\n service: \"trunarrative\",\n })\n .then((response) => {\n var redirectURL = response.data && response.data.redirectURL;\n btn.removeAttribute(\"disabled\");\n\n Playtech.API.htcmd.sendMessage(\"openCustomTab\", {\n path: redirectURL,\n });\n })\n .catch((err) => {\n btn.removeAttribute(\"disabled\");\n appendError({ error: err, code: 2 });\n });\n } else {\n btn.removeAttribute(\"disabled\");\n appendError({ error: \"Cannot find document type\", code: 3 });\n }\n });\n\n return btn;\n }\n\n function main() {\n try {\n if (isPageIDINAddress()) {\n var containerEl = createContainer();\n var newLaunchBtn = createNewLaunchBtn();\n\n containerEl.append(newLaunchBtn);\n getPopupContentContainer().append(containerEl);\n }\n } catch (err) {\n getPopupContentContainer().append(createError(err));\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n })();\n</script>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"027718b9-8d8c-403b-a6d5-e4ed9b02e8e8","tagTypeId":"custom_js","name":"TPI Events","description":"TPI Events","config":{"code":"(() => {\n function getSid() {\n try {\n return JSON.parse(localStorage.getItem('tpi_sid'))?.id ?? 'unknown';\n } catch (error) {\n window.TPI?.track?.('error', 'error', {\n message: 'tpi_sid not found'\n });\n\n return 'error';\n }\n }\n\n function getUid() {\n try {\n return localStorage.getItem('tpi_uid') ?? 'unknown';\n } catch (error) {\n window.TPI?.track?.('error', 'error', {\n message: 'tpi_uid not found'\n });\n\n return 'error';\n }\n }\n\n async function updatePlayerTags() {\n await Playtech.API.user.setPlayerTags([\n {\n name: 'portal/tpi_sid',\n type: 'text',\n value: getSid()\n\n }, {\n name: 'portal/tpi_uid',\n type: 'text',\n value: getUid()\n }\n ]);\n }\n\n\n Playtech.on('auth:generic_login:success', () => {\n updatePlayerTags();\n });\n\n // Playtech.on('socket-response', ({\n // requestId,\n // responseId,\n // time\n // }) => {\n // window.TPI?.track?.('socket-response', 'socket', {\n // requestId,\n // responseId,\n // time\n // });\n // });\n\n // Playtech.on('pas-response', ({\n // actionName,\n // time\n // }) => {\n // window.TPI?.track?.('pas-response', 'pas', {\n // pasActionName: actionName,\n // time\n // });\n // });\n\n Playtech.on('pas-error', ({\n actionName,\n error\n }) => {\n window.TPI?.track?.('pas-error', 'pas', {\n pasActionName: actionName,\n errorCode: error?.errorCode,\n requestId: error?.requestId,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('socket-error', ({\n requestId,\n responseId,\n errorCode,\n error\n }) => {\n window.TPI?.track?.('socket-error', 'socket', {\n requestId,\n responseId,\n errorCode,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('bia-error', ({\n event,\n error\n }) => {\n window.TPI?.track?.('bia-error', 'bia', {\n event,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('socket-breakdown', ({\n reason,\n requestId,\n responseId\n }) => {\n window.TPI?.track?.('socket-breakdown', 'socket', {\n reason,\n requestId,\n responseId\n });\n });\n\n\n Playtech.on('socket-notice', ({ requestId }) => {\n window.TPI?.track?.('socket-notice', 'socket', {\n requestId\n });\n });\n\n\n Playtech.on('geofencing-init', ({ geolocationType }) => {\n window.TPI?.track?.('geofencing-init', 'geofencing', {\n geolocationType\n });\n });\n\n Playtech.on('geofencing-trigger', ({ reason }) => {\n window.TPI?.track?.('geofencing-trigger', 'geofencing', {\n reason\n });\n });\n\n Playtech.on('geofencing-response', ({\n transactionID,\n time\n }) => {\n window.TPI?.track?.('geofencing-response', 'geofencing', {\n transactionID,\n time\n });\n });\n\n Playtech.on('geofencing-error', ({\n error,\n errorCode,\n message,\n response\n }) => {\n window.TPI?.track?.('geofencing-error', 'geofencing', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n errorCode,\n message,\n response\n });\n });\n\n Playtech.on('auth:generic_login:success', () => {\n window.TPI?.track?.('sso-login-success', 'login');\n });\n\n Playtech.on('auth:credentials:login', () => {\n window.TPI?.track?.('login-success', 'login');\n });\n\n Playtech.on('LOGGED_OUT', () => {\n window.TPI?.track?.('logout-success', 'login');\n });\n\n Playtech.on('LOGGED_IN_FAIL', ([error]) => {\n window.TPI?.track?.('login-error', 'login', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n });\n });\n\n Playtech.on('REGISTRATION_SUBMITTED', () => {\n window.TPI?.track?.('registration-submitted', 'registration');\n });\n\n Playtech.on('REGISTRATION_COMPLETED', () => {\n window.TPI?.track?.('registration-success', 'registration');\n });\n\n Playtech.on('REGISTRATION_FAIL', ([error]) => {\n window.TPI?.track?.('registration-error', 'registration', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n });\n });\n\n Playtech.on('DEPOSIT_FAIL', ({\n error,\n errorCode,\n errorDescription,\n errorMessage\n }) => {\n window.TPI?.track?.('deposit-error', 'deposit', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n errorCode,\n errorDescription,\n errorMessage\n });\n });\n\n (async () => {\n const { games = {} } = await Playtech.API.game.getGamesConfiguration();\n const { formFactor = 'mobile' } = Playtech.API.device ?? {};\n\n let latest_tpi_lid = null;\n\n Playtech.API.game.addBeforeGameLaunchHook?.((launchGameUrl) => {\n const url = new URL(launchGameUrl, document.baseURI);\n\n latest_tpi_lid = crypto.randomUUID();\n\n url.searchParams.set('tpi_lid', latest_tpi_lid);\n url.searchParams.set('tpi_sid', getSid());\n url.searchParams.set('tpi_uid', getUid());\n\n return url.toString();\n });\n\n Playtech.on('GAME_LAUNCH', ([{\n gameCode,\n container,\n gameName,\n game_pos\n }]) => {\n const {\n desktopGameType = '',\n mobileGameType = ''\n } = games[gameCode] ?? {};\n const gameType = formFactor === 'desktop' ? desktopGameType : mobileGameType;\n\n const product = gameCode.includes('gpas') ? 'GPAS' : gameCode.includes('pop') ? 'POP' : gameType.includes('LIVE') ? 'LIVE' : 'OTHER';\n\n window.TPI?.track?.('portal:game:launch', 'game', {\n product,\n gameCode,\n tpi_lid: latest_tpi_lid,\n });\n });\n })();\n\n // sportsbook\n Playtech.on('sportsbook-analytics', ({\n eventName,\n currency,\n raw\n }) => {\n const data = typeof raw === 'string' ? { data: raw } : raw;\n\n window.TPI?.track?.(`sports-${eventName}`, 'sports', {\n ...data,\n currency\n });\n });\n\n Playtech.on('player-tag-change', ({\n tag,\n value,\n removed\n }) => {\n if (removed) {\n return;\n }\n\n window.TPI?.track?.(`tag-${tag.replaceAll('/', ':')}`, 'tag', {\n value\n });\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n if (event.reason?.reason && event.reason?.request) {\n // is oapi, so safe to skip\n event.preventDefault();\n }\n });\n\n window.addEventListener('online', () => {\n window.TPI?.track?.('online', 'browser', {\n effectiveType: navigator?.connection?.effectiveType ?? 'unknown'\n });\n });\n\n window.addEventListener('offline', () => {\n window.TPI?.track?.('offline', 'browser');\n });\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"9efcb0e5-d71d-4c22-945b-92bb6260a95d","tagTypeId":"custom_js","name":" EzPush","description":" EzPush integration","config":{"code":"(function() {\n var startEzPush = function() {\n if (window.EzPush) {\n return;\n }\n\n Playtech.API.common.getScript('https://ezpush.techonlinecorp.com/SDK/v2/ezpush-client.js').then(function() {\n EzPush.init({\n applicationId: '610154bd5853fced6dad05e2', // ID of application from ezpush admin\n subscribeOnInit: true, // true by default\n language: 'en', // taken from from window.navigator.language by default\n logEnabled: true, // false by default\n serviceWorkerUrl: window.SPORTS_SW_LIBRARY // optional, 'ezpush-sw.js' by default, Service-Worker-Allowed HTTP\n // header required\n }).then(function() {\n console.log('[EzPush] You are subscribed to push notifications.');\n\n if (window.EzPush && window.EzPush.pushToken) {\n var pushId = window.EzPush.pushToken;\n var deviceType = Playtech.API.device.browserName;\n var correlationId = String(Math.random()).slice(2);\n\n Playtech.API.server.send({\n ID: 35613,\n application: 'hollandcasino',\n deviceId: EzPush.hwid,\n pushId: pushId,\n deviceType: deviceType,\n correlationId: correlationId\n });\n }\n\n }).catch(function(error) {\n console.log('[EzPush] Failed to subscribe to push notifications: ', error);\n });\n });\n };\n\n Playtech.on(Playtech.Events.LOGGED_IN, startEzPush);\n\n if (Playtech.API.user.isLoggedIn()) {\n startEzPush();\n }\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"2bf293bd-336d-4de2-8d33-57fa1df1c317","tagTypeId":"custom_tag_type","name":"SportsSlideGamesStyle","description":"Sports side games config","config":{"beforeEndHead":"<style>\n :root {\n --card-control-height: 2.5rem;\n --sport-footer-height: 3rem;\n --card-popup-minimized-margin: calc(\n 100dvh -\n (\n var(--header-height) + var(--sport-footer-height) +\n var(--card-control-height)\n )\n );\n /* 152px is the height sport-footer-height + card-control-height + header-height. card-popup-minimized-margin: calc(100dvh - 140px) - it is default core value */\n } #sportsbook-side-games {\n padding: 0;\n margin: 0 auto;\n } .mobile-layout #sportsbook-side-games {\n bottom: auto;\n top: var(--header-height);\n max-height: calc(\n 100dvh - var(--header-height) - var(--sport-footer-height)\n );\n }\n #sportsbook-side-games [class*=\"CardPopup__category\"],\n #sportsbook-side-games [class*=\"contentContainer\"] {\n margin: 0 0 0.1rem 0;\n padding: 0;\n } #sportsbook-side-games [class*=\"CardPopup__buttons\"] {\n width: 100%;\n text-align: right;\n background: var(--light-theme-bg-color);\n height: var(--card-control-height);\n } #sportsbook-side-games .game-iframe {\n height: calc(\n 100dvh - var(--header-height) - var(--card-control-height) -\n var(--sport-footer-height)\n );\n } .mobile-layout\n #sportsbook-side-games\n [class*=\"GamesView__grid\"]\n [class*=\"GamesView__slide\"]:first-child,\n .tablet\n #sportsbook-side-games\n [class*=\"GamesView__grid\"]\n [class*=\"GamesView__slide\"]:first-child {\n padding: 0;\n }\n /* I use class \"tablet\" because the \"desktop-layout\" class is used for the iPad Pro*/ #sportsbook-side-games [class*=\"CloseButton__close\"] {\n display: none;\n } @media (max-width: 400px) {\n .mobile-layout #sportsbook-side-games .col-mob-4 {\n width: calc(100vw - 0.5rem);\n }\n }\n</style>","beforeEndBody":""},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","10c6a1bf-bd4b-4c65-9256-45b166858b9d"]},{"tagId":"e7115f33-a80f-4310-a46c-8672d8e57293","tagTypeId":"custom_js","name":"Advanced Dialog Game and Non-Game","description":"HC-12646 Advanced player messages with different Window types (Game / Non-Game)","config":{"code":"(function () {\r\n function getButtons({ buttons, actionId, windowSessionId }) {\r\n const { buttons: popupButtons, onClose } = Playtech.API.popup.getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n return { popupButtons, onClose };\r\n }\r\n\r\n function showPopup({ buttons, content, onClose }) {\r\n Playtech.API.popup.showPopup(\"common\", {\r\n buttons,\r\n content,\r\n onClose,\r\n });\r\n }\r\n\r\n Playtech.on(\r\n \"advanced-dialog-nongame\",\r\n ({ actionId, actionInfo: { buttons, message }, windowSessionId }) => {\r\n const { popupButtons, onClose } = getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n showPopup({\r\n buttons: popupButtons,\r\n content: message,\r\n onClose,\r\n });\r\n },\r\n );\r\n\r\n Playtech.on(\r\n \"advanced-dialog\",\r\n ({ actionId, actionInfo: { buttons, message }, windowSessionId }) => {\r\n const { popupButtons, onClose } = getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n showPopup({\r\n buttons: popupButtons,\r\n content: message,\r\n onClose,\r\n });\r\n },\r\n );\r\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"487101b8-7f6f-4927-b5d2-0d9a13468748","tagTypeId":"custom_tag_type","name":"LEADERBOARD_GAMETILE_CSS","description":"Updating the CSS because of leaderboard game tile issue","config":{"beforeEndHead":"<style>\n.GameLabels__label--2e4:last-of-type {\n display: none !important;\n}\n</style>","beforeEndBody":""},"conditionIds":["20d65c93-a18d-40f0-bb20-6c2053c29822","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"8809bde3-5ee0-434e-a84b-256bff07f6cb","tagTypeId":"custom_tag_type","name":"HIDE_SHADOW_LEADERBOARD_TILE","description":"Hides the Hero Banner top Shadow Gradient","config":{"beforeEndHead":"<style>\n [class*=RaceListCard__mediaContent--1Xv] [class*=RaceListCard__mediaContent--1Xv]::before {\n background: none!important;\n }\n </style>","beforeEndBody":""},"conditionIds":["4c81598f-2592-452e-b680-3c1eed17cba1","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"ad22010b-b5a9-44d0-bd4b-fb5133e12864","tagTypeId":"custom_tag_type","name":"<3> GTM and CookieBot","description":"HC-12311 Reconfigure GTM and Cookiebot on STG2","config":{"beforeEndHead":"<!-- Google Tag Manager -->\n<script data-cookieconsent=\"ignore\">\n(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https://sgtm.hollandcasino.nl/hctm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','GTM-KGF9BMX');\n</script>\n\n<!-- Cookiebot CMP -->\n<!--<script id=\"Cookiebot\" src=\"https://consent.cookiebot.com/uc.js\" data-cbid=\"74529192-6709-483c-a1c9-c9b9c22221b3\" type=\"text/javascript\" async></script>-->","beforeEndBody":""},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"3772972c-9037-4fbf-aeeb-6d8073d6470b","tagTypeId":"page_styling","name":"Premium Style","description":"Premium Style","config":{"displayStyle":"premium"},"conditionIds":["b8cd6255-5275-430e-b4b3-34917ce3e157","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"ad5d2463-92a7-41aa-bb67-9d0f75a3c0a7","tagTypeId":"custom_tag_type","name":"ADVERTISING_PREFERENCES_FORM_EXTENSION","description":"HC-12332","config":{"beforeEndHead":"<style>\n input:-webkit-autofill,\n input:-webkit-autofill:hover, \n input:-webkit-autofill:focus, \n input:-webkit-autofill:active{\n -webkit-text-fill-color: var(--input-font-color) !important;\n }\n</style>\n<script>\n // HC-12332\n(function () {\n const API_BASE_URL = Playtech.Variables.dynamicTags.find(tag => tag.name === 'ACQ_API_BASE_URL')?.value;\n const API_KEY = Playtech.Variables.dynamicTags.find(tag => tag.name === 'ACQ_API_KEY')?.value;\n const TOKEN_ENDPOINT = '/v1/acqoptout/tokens';\n const CONFIRM_ENDPOINT = '/v1/acqoptout/tokens/confirm'; function waitForElement(selector, callback, interval = 300, timeout = 10000) {\n const start = Date.now();\n const check = () => {\n const element = document.querySelector(selector);\n if (element && element.querySelectorAll('button[type=\"button\"]')?.length >= 2) {\n callback(element);\n } else if (Date.now() - start < timeout) {\n setTimeout(check, interval);\n }\n };\n check();\n } waitForElement('form[data-form-name=\"Advertising Preferences\"]', function (form) {\n const buttons = form.querySelectorAll('button[type=\"button\"]'); const send2FAMailButton = buttons[0];\n const confirm2FAButton = buttons[1]; const twoFAInput = form.querySelector('input[name=\"promoExclusion2FAField\"]');\n const phoneInput = form.querySelector('input[name=\"promoExclusionPhoneField\"]');\n const emailInput = form.querySelector('input[name=\"promoExclusionEmailField\"]'); const twoFAInputContainer = twoFAInput?.closest('[class*=Control__control]');\n const phoneInputContainer = phoneInput?.closest('[class*=Control__control]');\n const confirm2FAButtonContainer = confirm2FAButton.closest('.cms-form-field-name-promoExclusionConfirm2FACodeButton'); const phoneLabel = form.querySelector('label[for^=\"promoExclusionPhoneField\"]');\n if (phoneLabel) phoneLabel.style.display = 'none'; const explanationText = form.querySelector('[class*=PlainText__text]');\n if (explanationText) {\n explanationText.style.display = 'none';\n } if (twoFAInputContainer) twoFAInputContainer.style.display = 'none';\n if (phoneInputContainer) phoneInputContainer.style.display = 'none';\n if (confirm2FAButtonContainer) confirm2FAButtonContainer.style.display = 'none'; let isSubmitting = false;\n let storedEmail = ''; send2FAMailButton.addEventListener('click', function () {\n document.getElementById('form-output')?.remove();\n document.getElementById('form-error')?.remove(); const email = emailInput?.value.trim() || '';\n const selectedRadio = form.querySelector('input[name=\"formType\"]:checked');\n const selectedOption = selectedRadio?.value || ''; const hasEmail = email.length > 0;\n const hasRadio = !!selectedOption;\n const errorFields = form.querySelectorAll('[class*=\"Control__invalid\"], [class*=\"ErrorMessage\"]');\n const hasVisualErrors = errorFields.length > 0; if (!hasEmail || !hasRadio || hasVisualErrors) {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.required'); // 'Vul alle vereiste velden in';\n form.parentNode.insertBefore(error, form.nextSibling);\n return;\n } if (isSubmitting) return;\n isSubmitting = true;\n send2FAMailButton.disabled = true;\n const currentLang = Playtech.API.language.getCurrentLanguage()?.substring(0, 2); const queryParams = new URLSearchParams({\n type: selectedOption,\n email: email,\n language_code: currentLang\n }).toString(); fetch(`${API_BASE_URL}${TOKEN_ENDPOINT}?${queryParams}`, {\n method: 'POST',\n headers: { 'x-api-key': API_KEY }\n })\n .then(response => {\n isSubmitting = false;\n send2FAMailButton.disabled = false; if (!response.ok) {\n return response.json().then(data => {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = data.message || Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.response.error'); // 'Kon het formulier niet verzenden. Controleer jouw code en probeer opnieuw';\n form.parentNode.insertBefore(error, form.nextSibling);\n throw new Error(data.message || 'Submission error');\n });\n } storedEmail = email; send2FAMailButton.style.display = 'none';\n if (twoFAInputContainer) twoFAInputContainer.style.display = '';\n if (phoneInputContainer) phoneInputContainer.style.display = '';\n if (confirm2FAButtonContainer) confirm2FAButtonContainer.style.display = ''; if (explanationText) explanationText.style.display = '';\n })\n .catch(err => {\n isSubmitting = false;\n send2FAMailButton.disabled = false;\n console.error(err);\n });\n }); confirm2FAButton.addEventListener('click', function () {\n document.getElementById('form-output')?.remove();\n document.getElementById('form-error')?.remove(); const phone = phoneInput?.value.trim() || '';\n const token = twoFAInput?.value.trim() || '';\n const email = storedEmail; if (!phone || !token || !email) {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.required'); //'Vul alle vereiste velden in'\n form.parentNode.insertBefore(error, form.nextSibling);\n return;\n } confirm2FAButton.disabled = true; const queryParams = new URLSearchParams({\n phone: phone,\n token: token,\n email: email\n }).toString(); fetch(`${API_BASE_URL}${CONFIRM_ENDPOINT}?${queryParams}`, {\n method: 'POST',\n headers: { 'x-api-key': API_KEY }\n })\n .then(response => {\n confirm2FAButton.disabled = false; if (!response.ok) {\n return response.json().then(data => {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = data.message || Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.code.error'); // 'Fout bij versturen. Controleer de ingevoerde code';\n form.parentNode.insertBefore(error, form.nextSibling);\n throw new Error(data.message || 'Confirmation error');\n });\n } // form.style.display = 'none';\n //\n // const successDiv = document.createElement('div');\n // successDiv.id = 'form-output';\n // successDiv.style.paddingTop = '20vh';\n // successDiv.style.paddingBottom = '20vh';\n // successDiv.style.textAlign = 'center';\n //\n // const header = document.createElement('h2');\n // header.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successTitle'); // 'Het is gelukt!';\n // header.style.marginBottom = '1rem';\n //\n // const paragraph = document.createElement('p');\n // paragraph.innerHTML = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successMessage'); // 'We hebben je voorkeur opgeslagen en zorgen ervoor dat je er geen omkijken meer naar hebt. Toch iets wijzigen? Vul dan het formulier opnieuw in.<br><br>Let op: het kan een paar dagen duren voordat je aan- of afmelding volledig verwerkt is. In de tussentijd kun je nog advertenties van ons tegenkomen. Bedankt voor je geduld!';\n // paragraph.style.margin = '0 auto';\n // paragraph.style.maxWidth = '100%';\n // paragraph.style.lineHeight = '1.6';\n // paragraph.style.padding = '0 1rem';\n //\n //\n // successDiv.appendChild(header);\n // successDiv.appendChild(paragraph);\n //\n // form.parentNode.insertBefore(successDiv, form.nextSibling); Playtech.API.common.navigate('/');\n Playtech.API.popup.showPopup({\n title: Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successTitle'),\n content: Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successMessage')\n });\n })\n .catch(err => {\n confirm2FAButton.disabled = false;\n console.error(err);\n });\n });\n });\n})();\n</script>","beforeEndBody":""},"conditionIds":["5dfa5ec7-2f60-4ec3-a4b2-2a26294bd859","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"2f8c08e0-cfd1-4da9-8ae1-9e2d86701048","tagTypeId":"custom_js","name":"Page time counter for specific RG pages","description":"HC-11165","config":{"code":"// HC-11165\n(function() {\n if (!Playtech.API.user.isLoggedIn()) {\n return;\n }\n\n var FIFTEEN_SECONDS = 15000;\n var ONE_MINUTE = 60000;\n var clearUrl = Playtech.API.common.getCleanUrl();\n var notificationSession = Date.now();\n\n setPlayerTag(clearUrl, notificationSession, 0);\n\n var timeout = setTimeout(() => {\n setPlayerTag(clearUrl, notificationSession, 1);\n }, FIFTEEN_SECONDS);\n\n let i = 2;\n var interval = setInterval(() => {\n if (i === 11) {\n clearInterval(interval);\n }\n\n setPlayerTag(clearUrl, notificationSession, i++);\n\n }, ONE_MINUTE);\n\n function setPlayerTag(pageName, sessionId, increment) {\n var currentPage = Playtech.API.common.getCleanUrl();\n if (currentPage !== pageName) {\n clearInterval(interval);\n clearTimeout(timeout);\n return;\n }\n\n var tagValue = { pageName, notificationSession: sessionId, timestampCount: increment };\n\n Playtech.API.user.setPlayerTags([\n {\n name: 'Portal/SafeBet/ResponsibleGamingPage',\n value: JSON.stringify(tagValue),\n type: 'text'\n }\n ]);\n }\n})();"},"conditionIds":["10c6a1bf-bd4b-4c65-9256-45b166858b9d"]},{"tagId":"2f9347a2-7cc0-4494-b31b-a07c5ea3b13b","tagTypeId":"custom_tag_type","name":"Sportsbook Styles","description":"HC-11970 Sportsbook max page width","config":{"beforeEndHead":"<style>\n /* HC-11970 */\n :root {\n --layout-max-width: 1440px;\n }\n</style>","beforeEndBody":""},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"590a37aa-25d0-42ac-93ec-1f21f5804a7b","tagTypeId":"custom_tag_type","name":"[Regulation] - BlockAccessOnNativeApps","description":"HC-11575 - Block access on Native Apps","config":{"beforeEndHead":"<style>\n #blockAccessOnNativeAppsPopup .hideBtn {\n display: none;\n }\n</style>\n<script>\n (function () {\n const WEB_CONTENT = \"BLOCK_ACCESS_ON_NATIVE_APPS\";\n const POPUP_ID = \"blockAccessOnNativeAppsPopup\";\n const REQUIRE_CONFIRMATION_PLAYER_TAG_NAME =\n \"portal/regulation/requireConfirmation\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Block Access On Native Apps] \"].concat(Array.from(arguments))\n );\n }\n }\n\n function shouldShowBlockingPopup(tags) {\n try {\n return Boolean(\n tags[0]?.name === REQUIRE_CONFIRMATION_PLAYER_TAG_NAME &&\n tags[0]?.value === \"true\"\n );\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function showBlockingPopup(tags) {\n try {\n if (shouldShowBlockingPopup(tags)) {\n log(\"show Popup\");\n Playtech.API.popup.showPopup({\n articleId: WEB_CONTENT,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: \"hideBtn\" },\n isModal: true,\n id: POPUP_ID,\n });\n }\n } catch (err) {\n log(\"error\", err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user\n .getPlayerTags(REQUIRE_CONFIRMATION_PLAYER_TAG_NAME)\n .then(function (response) {\n return response?.data?.tags || [];\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(showBlockingPopup);\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(showBlockingPopup);\n }\n })();\n</script>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"44fb0671-95f8-4991-b22c-8a14227c68c6","tagTypeId":"custom_js","name":"Hide games for sportsbook native app","description":"Hide games for sportsbook native app","config":{"code":"(function() {\n var params = new URLSearchParams(location.search);\n if (params.has('additionalContext') && params.has('isNative')) {\n var games = document.querySelectorAll('[data-portlet-type=\"responsivegames\"]');\n if (games.length > 0) {\n Array.from(games).forEach(function(el) {\n el.classList.add('hidden');\n })\n }\n }\n\n})();"},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"8d3e1d2d-058d-4aba-8717-75317d98ac9a","tagTypeId":"hc_ticket_counter","name":"TicketCounterTest","description":"Ticket Counter Test","config":{"playerTagName":"Player Journey/Raffleticketcount","webContentId":"TICKETCOUNTERTEST_BRIAN","vipLevelEqual":"3-20","vipLevelNotEqual":"1, 24"},"conditionIds":["01e72e94-c3b4-4182-ba14-bf084569e3b4","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"11d2bc52-84c6-443e-926f-6a71b3c13c4c","tagTypeId":"custom_js","name":"Add VIP Level as class","description":"Add VIP Level as class","config":{"code":"(() => {\r\n // html tag to attach CSS classes to\r\n // needs to be #applicaion, because otherwise classes will get overwritten by Portal\r\n const root = document.querySelector('#application');\r\n const handler = () => {\r\n if (!Playtech.API.auth.isLoggedIn) {\r\n // if player is not logged in, do nothing\r\n return;\r\n }\r\n\r\n const getPlayersLevel = Playtech.fetchUserDetails();\r\n const vipLevel = getPlayersLevel.vipLevel; //get vip status\r\n // add viplevel1\r\n root.classList.add(`viplevel${vipLevel}`);\r\n };\r\n // subscribe to login event\r\n Playtech.on(Playtech.Events.LOGGED_IN, handler);\r\n // subscribe to logout event\r\n Playtech.on(Playtech.Events.LOGGED_OUT, () => {\r\n Array.from(root.classList)\r\n .filter((name) => name.startsWith('vipl'))\r\n .forEach((name) => root.classList.remove(name));\r\n });\r\n // check on app init\r\n handler();\r\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"eee46cd0-5594-4ac6-a4bd-72feb3ea09d6","tagTypeId":"custom_tag_type","name":"HideBtnInIDINOption","description":"Hide the \"Verify my account with IDIN\" button in IDINOption registration","config":{"beforeEndHead":"<style>\r\n button[class*=IDINOption__btn] {\r\n display: none !important;\r\n }\r\n a[class*=IDINOption__btn] [class*=PlainText__text] {\r\n font-size: 1.2rem;\r\n }\r\n</style>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","ffa107aa-bb77-47e8-86d3-caad97cbbf82"]},{"tagId":"372aa339-83a2-4102-aa11-e4f4e9de8759","tagTypeId":"custom_tag_type","name":"AVENT_CALENDAR_STYLES_DEC23","description":"Advent calendar styles","config":{"beforeEndHead":"<style>\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 63.875rem;\r\n margin: 0 auto;\r\n background-size: contain;\r\n width: 100%;\r\n background-repeat: no-repeat;\r\n aspect-ratio: 2.2 / 1;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n width: 100% !important;\r\n min-width: auto !important;\r\n padding: 0;\r\n display: grid;\r\n grid-template: repeat(5, 1fr) / repeat(7, 1fr);\r\n grid-gap: 0.5rem;\r\n margin: 5% 9.5%;\r\n }\r\n\r\n [class*=\"AdventItem__adventItemWrapper\"] {\r\n width: 100% !important;\r\n display: block;\r\n }\r\n\r\n [class*=\"AdventItem__adventItemWrapper\"] [class*=\"Overlay__overlay\"] {\r\n height: 200vh;\r\n top: -50vh;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n margin: 0;\r\n width: 100%;\r\n height: 100%;\r\n text-shadow: none;\r\n box-shadow: none;\r\n border: 0 !important;\r\n transform: none !important;\r\n font-size: 3rem;\r\n font-weight: 800;\r\n line-height: 0.2rem;\r\n background-color: #18042c !important;\r\n color: #524361;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__future\"] {\r\n background-color: var(--hc-white) !important;\r\n color: #fb258d;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__active\"] {\r\n background-color: #fb258d !important;\r\n color: var(--hc-white);\r\n background-image: none;\r\n }\r\n\r\n .mobile-layout .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n width: 74vw;\r\n }\r\n\r\n .mobile-layout\r\n [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n grid-gap: 0.188rem;\r\n margin: 0;\r\n }\r\n\r\n .mobile-layout\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n font-size: 1.7rem;\r\n line-height: 0.2rem;\r\n }\r\n\r\n @media (min-width: 1183px) {\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n height: 51vh;\r\n background-position: center;\r\n max-height: 462px;\r\n width: auto;\r\n }\r\n }\r\n\r\n @media (max-width: 1182px) and (min-width: 1000px) {\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 100%;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n margin: 8% 16%;\r\n }\r\n }\r\n\r\n @media (max-width: 500px) {\r\n .mobile-layout\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n font-size: 1.2rem;\r\n }\r\n }\r\n\r\n @media screen and (orientation: landscape) {\r\n .mobile-layout .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 65vh;\r\n }\r\n }\r\n\r\n /* hero banner */\r\n .bannerAdventCalendar [class*=\"withHollandLayouts__wrapper\"] {\r\n --content-height: 60vh;\r\n }\r\n .bannerAdventCalendar [class*=\"Banner__sliderContainer\"],\r\n .bannerAdventCalendar [class*=\"Banner__slider\"] {\r\n flex: 1 0 100%;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"Slide__wc\"][class*=\"withHollandLayouts__wc\"] {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /* popup */\r\n .application-root [class*=\"AdventItemPopup__popup\"] {\r\n overflow: hidden;\r\n }\r\n\r\n [class*=\"AdventItemPopup__popup\"] .popup-modal__inner-content {\r\n overflow-y: auto;\r\n height: 100%;\r\n padding: 0 1rem;\r\n white-space: initial;\r\n }\r\n\r\n .mobile-layout .bannerAdventCalendar [class*=\"Popup__close\"] {\r\n top: 1.5rem !important;\r\n right: 1rem !important;\r\n }\r\n\r\n @media (max-width: 1000px) {\r\n .bannerAdventCalendar [class*=\"Popup__container\"] {\r\n top: -20vh;\r\n }\r\n\r\n .mobile.landscape\r\n .application-root\r\n .bannerAdventCalendar\r\n [class*=\"AdventItemPopup__popup\"] {\r\n height: calc(71vh - 2rem);\r\n }\r\n\r\n [class*=\"AdventItemPopup__popup\"] .popup-modal__inner-content {\r\n padding: 0 1rem 3rem;\r\n }\r\n }\r\n</style>\r\n","beforeEndBody":""},"conditionIds":["2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"217da009-6c1b-467b-9ed0-2b3c716a4eaa","tagTypeId":"custom_tag_type","name":"Promotions Main Page - Remove Shadow Gradient on image","description":"Promotions Main Page - Remove Shadow Gradient on image","config":{"beforeEndHead":"<style>\n [class*=Promo__mediaWrapper--]:after {\n content: none !important;\n }\n</style>\n<style>\n [class*=Promo__mediaWrapper--]:before {\n content: none !important;\n }\n</style>","beforeEndBody":""},"conditionIds":["4c81598f-2592-452e-b680-3c1eed17cba1","345f5466-1ecb-41f0-a758-0aa6b96e7697","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"3579f170-18b0-4c6b-8c79-73371d5d1041","tagTypeId":"custom_js","name":"Refresh page by player tag","description":"Refresh page by player tag","config":{"code":"(function () {\n function removePlayerTags(tags) {\n Playtech.API.server.send({\n ID: 35553,\n tags: [...tags],\n responses: [35554, 35555],\n description: 'Remove Player Tags Request'\n })\n }\n\n function playerTagChangeListener(e) {\n const { tag, removed } = e.detail;\n\n if (tag === 'CRM/refresh' && !removed) {\n removePlayerTags([{name: tag}])\n window.location.reload();\n }\n }\n\n function subscribeOnTagChange() {\n Playtech.API.events.addEventListener(\n 'player-tag-change',\n playerTagChangeListener\n );\n }\n\n function unsubscribeOnTagChange() {\n Playtech.API.events.removeEventListener(\n 'player-tag-change',\n playerTagChangeListener\n );\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, subscribeOnTagChange);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, unsubscribeOnTagChange);\n\n if (Playtech.API.auth.isLoggedIn) {\n subscribeOnTagChange();\n }\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"5df800d8-4757-4c99-8f7e-4fc034847b88","tagTypeId":"vip_icons","name":"VIP Icons","description":"Configuration of avatar images by vip levels","config":{"vipIconsConfig":[{"vipLevel":"30","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"29","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"28","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"27","icon":"/library/VIP/icons/vip-gold-icon.png"},{"vipLevel":"26","icon":"/library/VIP/icons/vip-silver-icon.png"},{"vipLevel":"20","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"19","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"18","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"17","icon":"/library/VIP/icons/vip-gold-icon.png"},{"vipLevel":"16","icon":"/library/VIP/icons/vip-silver-icon.png"}]},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"974b3a3f-5b73-4edc-b702-ab6ddaa1df0a","tagTypeId":"custom_js","name":"PJ Initial Offer Tag Setter","description":"Impl for tag setter","config":{"code":"document.body.addEventListener('click', (event) => {\n if (event.target.id === 'sports-offer') {\n Playtech.API.user.setPlayerTags([{ name: 'sports-tag' }]);\n } else if (event.target.id === 'casino-offer') {\n Playtech.API.user.setPlayerTags([{ name: 'casino-tag' }]);\n }\n});"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]}],"conditions":[{"conditionId":"2eb31cd2-61ba-4ccd-8805-dfa92311e2ef","conditionTypeId":"url_param_condition","name":"nativeoverlay","description":"nativeoverlay","config":{"launchRule":"1","urlParameters":[{"name":"nativeoverlay","value":"1"}]}},{"conditionId":"2ebf77a4-06da-4efa-b9c2-411d308c097c","conditionTypeId":"url_param_condition","name":"noPageAsPopup","description":"noPageAsPopup","config":{"launchRule":"1","urlParameters":[{"name":"noPageAsPopup","value":"1"}]}},{"conditionId":"b8cd6255-5275-430e-b4b3-34917ce3e157","conditionTypeId":"page_condition","name":"Premium pages","description":"list of premium pages","config":{"onPageLaunch":"/test/test-premium-components, /test-premium-components2, /test-premium-components/test-home, /premium-lounge, /premium-lounge/home, /premium-lounge/promoties, /premium-lounge/events, /test-premium-components-code","onPageNotLaunch":""}},{"conditionId":"9772dc61-ab34-460f-9759-be2edb11cd51","conditionTypeId":"page_condition","name":"aws page ","description":"run aws tag","config":{"onPageLaunch":"/online/casino/slotmachines,/casino","onPageNotLaunch":""}},{"conditionId":"dfe6bbcd-e4c0-4a93-bf8e-b3ad13646c71","conditionTypeId":"page_condition","name":"/awsmessagetest2","description":"/awsmessagetest2","config":{"onPageLaunch":"/awsmessagetest2","onPageNotLaunch":""}},{"conditionId":"20d65c93-a18d-40f0-bb20-6c2053c29822","conditionTypeId":"page_condition","name":"Leaderboard-page","description":"Leaderboard-pages","config":{"onPageLaunch":"/leaderboard-page","onPageNotLaunch":""}},{"conditionId":"60352a4d-5190-4f6f-8ddd-22780680eed3","conditionTypeId":"page_condition","name":"/live-casino","description":"live-casino","config":{"onPageLaunch":"/live-casino","onPageNotLaunch":""}},{"conditionId":"5dfa5ec7-2f60-4ec3-a4b2-2a26294bd859","conditionTypeId":"page_condition","name":"afmelden-advertenties/formulier","description":"afmelden-advertenties/formulier","config":{"onPageLaunch":"/afmelden-advertenties/formulier","onPageNotLaunch":""}},{"conditionId":"3a3b7ebd-924c-4201-9b64-c60367a4f411","conditionTypeId":"page_condition","name":"on poker page","description":"on poker page","config":{"onPageLaunch":"/poker","onPageNotLaunch":""}},{"conditionId":"9f733509-bbb6-4048-8901-85533034314c","conditionTypeId":"page_condition","name":"structured-data-test","description":"structured-data-test","config":{"onPageLaunch":"/structured-data-test","onPageNotLaunch":""}},{"conditionId":"2e8f68c0-2d83-4009-bf0e-9507529535dc","conditionTypeId":"native_app_condition","name":"excludeFromNative","description":"will not run in native apps","config":{"nativeAppRule":"0"}},{"conditionId":"01e72e94-c3b4-4182-ba14-bf084569e3b4","conditionTypeId":"page_condition","name":"WhiteBlackListTCount","description":"WhiteBlackListTCount","config":{"onPageLaunch":"","onPageNotLaunch":"/sportsbook"}},{"conditionId":"4c81598f-2592-452e-b680-3c1eed17cba1","conditionTypeId":"page_condition","name":"General pages","description":"Main URLs for use with custom CSS changes","config":{"onPageLaunch":"/home , /casino , /live-casino , /promoties ,/bingo , /sportsbook , /poker , /online/casino/premium , /online/casino/exclusief , /online/casino/tablegames , /online/casino/slotmachines , /online/casino/jackpots , /en/online/casino/all-games-casino , /online/veilig-en-verantwoord-spelen , /promoties/poker-welcome-2022 , /promoties/poker-welcome-offer , /live/exclusive , /live/tafelspelen , /live/roulette , /live/gameshows , /live/highroller , /live/ander, /promoties/casino/niet-normaal-novemberprijs, /promoties/poker-mcop-2022, /promoties/sports/HCSPBGSRV-nov22, /promoties/sports/HCSPBGSR-nov22, /promoties/sports/HCSPXmasSpecial-dec22, /TEst-Xenia-Engagement_NORMAL, /promoties/poker-irish-open, /promoties/sports/football-combo-boost, /promoties/sports/tennis-combo-boost, /promoties/sports/basketball-combi-boost, /promoties/sports/darts-combo-boost, /promoties/sports/bet-watch, /promoties/sports/cash-out, /promoties/sports/Chineesnieuwjaar, /promoties/sports/ChineesnieuwjaarV, /promoties/wpt-prime-qualifiers, /promoties/poker-leaderboard, /promoties/sports/FEBRUARIFREEBET, /promoties/sports/FebruariCombi, /promoties/sports/FebruariCombiV, /leaderboards, /inloggen, /registreren, /promoties/vip, /promoties/, /promoties/casino, /promoties/sportsbook, /promoties/poker, /promoties/bingo","onPageNotLaunch":""}},{"conditionId":"345f5466-1ecb-41f0-a758-0aa6b96e7697","conditionTypeId":"page_condition","name":"Main promo page only","description":"Main promo page only","config":{"onPageLaunch":"/promoties,/Promogrid-test-final,/promoties/casino,/promoties/sportsbook,/promoties/poker,/promoties/bingo,/promoties/vip,/prev.hollandcasino.nl/en/promoties, /prev.hollandcasino.nl/promoties","onPageNotLaunch":""}},{"conditionId":"109b8f48-da23-4e5d-8f62-b1371cf41a08","conditionTypeId":"native_app_condition","name":"inNative","description":"the tag will run only if url has param ?isNative=1","config":{"nativeAppRule":"1"}},{"conditionId":"eff80154-dd28-44c2-8dcd-9d0bc83ef6b3","conditionTypeId":"page_condition","name":"/cookie-settings","description":"/cookie-settings","config":{"onPageLaunch":"/cookie-settings","onPageNotLaunch":""}},{"conditionId":"ffa107aa-bb77-47e8-86d3-caad97cbbf82","conditionTypeId":"basic_condition","name":"OnPreloader","description":"OnPreloader","config":{"launch":"onPreloader"}},{"conditionId":"8059f1cb-fd6e-4142-8071-26a5376abe4c","conditionTypeId":"page_condition","name":"PenaltyShootout page","description":"/promoties/sports/PenaltySpel","config":{"onPageLaunch":"/promoties/sports/PenaltySpel","onPageNotLaunch":""}},{"conditionId":"00496ce8-f9cc-44f7-95cc-11d9faef1d0c","conditionTypeId":"page_condition","name":"TN docs upload page","description":"TN docs upload page","config":{"onPageLaunch":"/mijnhc/account-verificatie","onPageNotLaunch":""}},{"conditionId":"f47bb07f-0e1a-4901-b766-673d8728d2dd","conditionTypeId":"page_condition","name":"/gamelaunch","description":"/gamelaunch","config":{"onPageLaunch":"/gamelaunch","onPageNotLaunch":""}},{"conditionId":"5a613a7e-8cb1-4ad7-b227-581f8b0a392d","conditionTypeId":"page_condition","name":"Test - Brian test","description":"test page ","config":{"onPageLaunch":"/briantest","onPageNotLaunch":""}},{"conditionId":"bc0b6529-9f7a-4f6b-8c4d-15194d057ee8","conditionTypeId":"basic_condition","name":"onAppInit","description":"Application initialisation","config":{"launch":"onAppInit"}},{"conditionId":"5d6c9f1d-245e-415b-a164-2a5752005ef1","conditionTypeId":"page_condition","name":"/ada","description":"/ada","config":{"onPageLaunch":"/ada","onPageNotLaunch":""}},{"conditionId":"a7c25c7b-c02c-4d63-bd9a-4cb9c6993006","conditionTypeId":"page_condition","name":"/bingo","description":"/bingo","config":{"onPageLaunch":"/bingo","onPageNotLaunch":""}},{"conditionId":"54ecef8c-410a-4aae-935a-ae7b66a2be91","conditionTypeId":"page_condition","name":"/home_page_trigger","description":"when user visits the /home page","config":{"onPageLaunch":"/home","onPageNotLaunch":""}},{"conditionId":"3b190ea9-16dc-4436-aa2e-4e2ba3cbb820","conditionTypeId":"page_condition","name":"/casino","description":"/casino","config":{"onPageLaunch":"/casino","onPageNotLaunch":""}},{"conditionId":"1a66cab4-39b1-4092-a5cb-81887c12ee83","conditionTypeId":"page_condition","name":"/sportsbook","description":"/sportsbook","config":{"onPageLaunch":"/sportsbook","onPageNotLaunch":""}},{"conditionId":"f74d4594-d23a-483d-8da4-916549a7fe7f","conditionTypeId":"page_condition","name":"/inloggen","description":"/inloggen","config":{"onPageLaunch":"/inloggen","onPageNotLaunch":""}},{"conditionId":"2069bef2-303b-40f0-82c4-5b0178ce78ea","conditionTypeId":"basic_condition","name":"Before page rendered","description":"Before page rendered","config":{"launch":"beforePageRendered"}},{"conditionId":"d37e588d-0329-4469-8cfa-4159ff363d48","conditionTypeId":"page_condition","name":"Game results","description":"Game results","config":{"onPageLaunch":"/mijnhc/game-resultaten-hidden","onPageNotLaunch":""}},{"conditionId":"07120f96-4ad3-430d-a64c-231bd2dda580","conditionTypeId":"page_condition","name":"/registreren","description":"/registreren","config":{"onPageLaunch":"/registreren","onPageNotLaunch":""}},{"conditionId":"10c6a1bf-bd4b-4c65-9256-45b166858b9d","conditionTypeId":"basic_condition","name":"afterPageRendered","description":"afterPageRendered","config":{"launch":"afterPageRendered"}}]}