CINXE.COM
The 42
<!doctype html> <html lang="en" class="theme--the42"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <script> document.cookie = "__adblocker=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; var setNptTechAdblockerCookie = function(adblocker) { var d = new Date(); d.setTime(d.getTime() + 60 * 5 * 1000); document.cookie = "__adblocker=" + (adblocker ? "true" : "false") + "; expires=" + d.toUTCString() + "; path=/"; }; var script = document.createElement("script"); script.setAttribute("async", true); script.setAttribute("src", "//www.npttech.com/advertising.js"); script.setAttribute("onerror", "setNptTechAdblockerCookie(true);"); document.getElementsByTagName("head")[0].appendChild(script); </script> <script type="application/json" id="piano-consent-mode">{"requireConsent":false}</script> <script> const consentMode = JSON.parse(document.getElementById("piano-consent-mode").innerHTML); window.pdl = window.pdl || {}; window.pdl.requireConsent = consentMode.requireConsent; </script> <script src="//d2wy8f7a9ursnm.cloudfront.net/v7/bugsnag.min.js"></script> <script type="text/javascript" src="//b0.thejournal.ie/bugsnag/js/bugsnag-fallback-dummy-object.js"></script> <script type="application/json" id="bugsnagConfig">{"apiKey":"d8ea1607a1890612140d557a3e0159b8","releaseStage":"production","appVersion":"20241121151412"}</script> <script> let bugsnagConfig = JSON.parse(document.getElementById("bugsnagConfig").innerHTML); Bugsnag.start(bugsnagConfig) </script> <!-- OneTrust Cookies Consent Notice start --> <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="00023fda-6a2f-4679-ab09-7eec70245165" ></script> <script type="text/javascript"> if (!String.prototype.startsWith) { try { Object.defineProperty(String.prototype, 'startsWith', { value: function (search, rawPos) { var pos = rawPos > 0 ? rawPos | 0 : 0; return this.substring(pos, pos + search.length) === search; } }); } catch (e) { String.prototype.startsWith = function (search, rawPos) { var pos = rawPos > 0 ? rawPos | 0 : 0; return this.substring(pos, pos + search.length) === search; }; } } var CookieConsentListener = {}; var CookieConsentRepository = {}; var CookieConsentBanner = {}; (function() { function CookieConsent(functional, performance, targeting) { this.functional = functional; this.performance = performance; this.targeting = targeting; } /** * @returns {CookieConsent} */ CookieConsent.makeDefaultNoConsent = function() { var functional = false, performance = false, targeting = false; return new CookieConsent(functional, performance, targeting); }; /** * @returns {CookieConsent} */ CookieConsentRepository.fetch = function() { var rawConsentCookie = document.cookie .split('; ') .filter(function (row) { return row.startsWith('OptanonConsent'); })[0]; if (rawConsentCookie === undefined) { return CookieConsent.makeDefaultNoConsent(); } var consentCookie = new QueryString(rawConsentCookie.substring(15)); var consentGroups = consentCookie.get('groups'); if (!consentCookie.has('groups')) { return CookieConsent.makeDefaultNoConsent(); } var consentByCategory = {}; consentGroups.split(",").forEach(function (category) { var parts = category.split(":"); consentByCategory[parts[0]] = parts[1] === "1"; }); var functional = consentByCategory.C0003 === true; var performance = consentByCategory.C0002 === true; var targeting = consentByCategory.C0004 === true; return new CookieConsent(functional, performance, targeting); }; CookieConsentRepository.hasUserDecided = function () { var alertBoxCookie = document.cookie .split('; ') .filter(function (row) { return row.startsWith('OptanonAlertBoxClosed'); })[0]; return alertBoxCookie !== undefined; }; function QueryString(stringValue) { this.valuesByKey = {}; var keyValuePairs = stringValue.split("&"); for (var i = 0; i < keyValuePairs.length; i++) { var keyValuePair = keyValuePairs[i].split("="); var key = decodeURIComponent(keyValuePair[0]); var value = decodeURIComponent(keyValuePair[1]); this.valuesByKey[key] = value; } } QueryString.prototype.get = function (key) { return this.valuesByKey[key]; } QueryString.prototype.has = function (key) { return this.valuesByKey.hasOwnProperty(key); } CookieConsentListener = { functional: [], performance: [], targeting: [], }; CookieConsentListener.onFunctionalConsentChange = function(callback) { CookieConsentListener.functional.push(callback); }; CookieConsentListener.onPerformanceConsentChange = function(callback) { CookieConsentListener.performance.push(callback); }; CookieConsentListener.onTargetingConsentChange = function(callback) { CookieConsentListener.targeting.push(callback); }; var previousConsent = CookieConsentRepository.fetch(); CookieConsentListener.triggerChange = function() { var consent = CookieConsentRepository.fetch(); var key; if (previousConsent.functional !== consent.functional) { for (key in CookieConsentListener.functional) { CookieConsentListener.functional[key](consent.functional); } } if (previousConsent.performance !== consent.performance) { for (key in CookieConsentListener.performance) { CookieConsentListener.performance[key](consent.performance); } } if (previousConsent.targeting !== consent.targeting) { for (key in CookieConsentListener.targeting) { CookieConsentListener.targeting[key](consent.targeting); } } previousConsent = consent; }; CookieConsentBanner.pagesWhereBannerIsHidden = [ "/cookies-privacy-policy/", ]; CookieConsentBanner.hide = function () { document.getElementById("onetrust-consent-sdk").style.display = "none"; }; CookieConsentBanner.show = function () { document.getElementById("onetrust-consent-sdk").style.display = "block"; }; CookieConsentBanner.onCookiePreferencesClick = function (callback) { if (document.getElementById("ot-sdk-btn") !== null) { document.getElementById("ot-sdk-btn").addEventListener("click", callback); } } CookieConsentBanner.whenReady = function () { var waitedForMs = 0; var intervalDelayInMs = 10; return new Promise(function (resolve, reject) { var waitForOneTrust = setInterval(function () { if (document.readyState === "loading") { return; } waitedForMs += intervalDelayInMs; if (!window.OneTrust) { if (waitedForMs <= 2000) { return; } else { clearInterval(waitForOneTrust); reject("After " + waitedForMs + "ms, OneTrust is not available"); } } clearInterval(waitForOneTrust); resolve(); }, intervalDelayInMs) }); } CookieConsentBanner.onClose = function () { var intervalDelayInMs = 10; return new Promise(function (resolve, reject) { var waitForClosed = setInterval(function () { if ( !window.OneTrust || typeof window.OneTrust.IsAlertBoxClosed !== "function" || !window.OneTrust.IsAlertBoxClosed() ) { return; } clearInterval(waitForClosed); resolve(); }, intervalDelayInMs) }); } }()); function bootYoutubeIframes() { function consentYes() { var iframes = document.getElementsByClassName('youtube-player'); for (var i = 0; i < iframes.length; i++) { var src = iframes[i].getAttribute('data-src'); iframes[i].setAttribute('src', src); } } function consentNo() { var iframes = document.getElementsByClassName('youtube-player'); for (var i = 0; i < iframes.length; i++) { iframes[i].setAttribute('src', ''); } } var consent = CookieConsentRepository.fetch(); if (consent.targeting) { consentYes(); } CookieConsentListener.onTargetingConsentChange(function(hasTargetingConsent) { if (hasTargetingConsent) { consentYes(); return; } consentNo(); }); } function bootVimeoIframes() { function consentYes() { var iframes = document.getElementsByClassName('vimeo-player'); for (var i = 0; i < iframes.length; i++) { var src = iframes[i].getAttribute('data-src'); iframes[i].setAttribute('src', src); } } function consentNo() { var iframes = document.getElementsByClassName('vimeo-player'); for (var i = 0; i < iframes.length; i++) { iframes[i].setAttribute('src', ''); } } var consent = CookieConsentRepository.fetch(); if (consent.functional) { consentYes(); } CookieConsentListener.onFunctionalConsentChange(function(hasFunctionalConsent) { if (hasFunctionalConsent) { consentYes(); return; } consentNo(); }); } document.addEventListener("DOMContentLoaded", function(){ bootYoutubeIframes(); bootVimeoIframes(); }); window.addEventListener("message", function (event) { if (event.data === "openCookieConsentDialog") { OneTrust.ToggleInfoDisplay(); } }, false); function OptanonWrapper() { const pageUrlPath = (new URL(window.location.href)).pathname; if (CookieConsentBanner.pagesWhereBannerIsHidden.includes(pageUrlPath)) { CookieConsentBanner.hide(); } CookieConsentBanner.onCookiePreferencesClick(function () { CookieConsentBanner.show(); }); OneTrust.OnConsentChanged(function (e) { CookieConsentListener.triggerChange(); }); } </script> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script> window.jQuery || document.write('<script src="https://b0.thejournal.ie/desktop/js/jquery-1.7.2.min.js"><\/script>') </script> <script> function supports_html5_storage(){ try{ return 'localStorage' in window && window['localStorage'] !== null; }catch(e){ return false; } } </script> <script defer src="https://www.gstatic.com/firebasejs/9.13.0/firebase-app-compat.js"></script> <script defer src="https://www.gstatic.com/firebasejs/9.13.0/firebase-auth-compat.js"></script> <script defer src="https://www.gstatic.com/firebasejs/ui/6.0.2/firebase-ui-auth.js"></script> <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/6.0.2/firebase-ui-auth.css" /> <script type="application/json" id="firebaseConfig">{"apiKey":"AIzaSyCcJAgLkiMNJjIWXkk8-FiSGARpZvoEYfg","authDomain":"www.the42.ie","databaseURL":"https:\/\/account-membership-prototype.firebaseio.com","projectId":"account-membership-prototype","storageBucket":"account-membership-prototype.appspot.com","messagingSenderId":"488317035541","appId":"1:488317035541:web:d743aaeed2801117"}</script> <script type="text/javascript" src="//b0.thejournal.ie/redesign/js/redesign-707f0443be.js" viewType="desktop"></script> <title>The 42</title> <link rel="apple-touch-icon" sizes="180x180" href="//b0.thejournal.ie/redesign/i/the42/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="//b0.thejournal.ie/redesign/i/the42/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="//b0.thejournal.ie/redesign/i/the42/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="//b0.thejournal.ie/responsive/i/the42/safari-pinned-tab.svg" color="#07188a"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> <link rel="stylesheet" type="text/css" href="//b0.thejournal.ie/redesign/css/main-redesign-1eeea19f8a.css" /> <style> html, body { margin: 0; padding: 0; } .podcast-player { position: fixed; left: 0; right: 0; bottom: 0; z-index: 300002; } .podcast-player iframe { display: block; border: none; overflow: hidden; } </style> </head> <body> <style> #piano-template-container, #piano-unlocked-template-container { overflow-y: auto; overflow-x: hidden; } #piano-template-container, #piano-unlocked-template-container, #firebaseui-auth-ribbon-container { position: fixed; bottom: 0; left: 0; width: 100%; z-index: 300001; max-height: 80%; } #piano-landing-page-container { position: relative; z-index: 300001; } #piano-template-overlay { z-index: 300000; display: block; height: 100%; position: fixed; top: 0; left: 0; right: 0; bottom: 0; opacity: 0.5; background: #000000; } #firebaseui-auth-ribbon { margin-top: 24px; } #firebaseui-auth-ribbon button { text-indent: initial; } #firebaseui-auth-ribbon-container { background: #fff; padding: 24px 0 29px; overflow-y: scroll; } #firebaseui-auth-ribbon { margin-bottom: 24px; } #firebaseui-auth-ribbon .firebaseui-container { max-width: 500px; } #firebaseui-auth-ribbon-container .heading { max-width: 420px; margin: 0 auto 16px; padding: 0 24px; font-family: 'alternate-gothic-extra-cond', sans-serif; font-style: normal; font-weight: 700; font-size: 56px; line-height: 100%; text-align: center; letter-spacing: 0.5px; text-transform: uppercase; color: #1E8B71; } #firebaseui-auth-ribbon-container .heading em { font-style: normal; color: #1D3B3C; } @media (max-width: 600px) { #firebaseui-auth-ribbon-container .heading { font-size: 42px; } #firebaseui-auth-ribbon-container { padding-bottom: 48px; } } #firebaseui-auth-ribbon-container .message { padding: 0 24px; font-family: 'Ballinger', sans-serif; font-weight: 400; font-size: 18px; line-height: 130%; text-align: center; color: #1D3B3C; margin-top: 16px; } .disable-scrolling-for-firebase-ribbon { overflow: hidden; } </style> <div id="piano-template-container"></div> <div id="piano-unlocked-template-container"></div> <div id="piano-template-overlay" style="display: none;"></div> <div id="firebaseui-auth-modal-container" class="auth-flow-modal-container" style="display: none;"> <div class="auth-flow-modal"> <div class="header"> <a href="#" class="close-modal"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M0.75 23.249L23.25 0.749023" stroke="#404040" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M23.25 23.249L0.75 0.749023" stroke="#404040" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </svg> </a> </div> <div class="heading"><em>Sign in</em> or create<br>a free account</div> <div class="message"></div> <div id="firebaseui-auth-modal" class="auth-flow-firebaseui"></div> <div class="message"></div> </div> </div> <div id="firebaseui-auth-ribbon-container" style="display: none;"> <div class="heading">To continue reading create a <em>free account</em></div> <div class="message">Or sign into an existing account</div> <div id="firebaseui-auth-ribbon"></div> </div> <script>(function(src){var a=document.createElement("script");a.type="text/javascript";a.async=true;a.src=src;var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)})("https://experience-eu.piano.io/xbuilder/experience/load?aid=6uVogX5Gpe");</script> <script type="application/json" id="piano-ga-bucket">{"gaBucket":null}</script> <script> let values = JSON.parse(document.getElementById("piano-ga-bucket").innerHTML); tp = window["tp"] || []; if (values.gaBucket !== null) { tp.push(["setCustomVariable", "gaBucket", values.gaBucket]); } </script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-QVZ59BG46E"></script> <script type="application/json" id="gtag-property-ids">["G-QVZ59BG46E"]</script> <script type="text/javascript"> if (typeof gtag === "undefined") { window.dataLayer = window.dataLayer || []; gtag = function(){dataLayer.push(arguments);} } (function(){ function GoogleAnalytics(propertyIds, user) { this.propertyIds = propertyIds; this.user = user; this.hasSentPageView = false; this.hasSentTakeoverImpression = false; } GoogleAnalytics.prototype.disableCookies = function () { this.propertyIds.forEach(function (propertyId) { window['ga-disable-' + propertyId] = true; }); }; GoogleAnalytics.prototype.enableCookies = function () { this.propertyIds.forEach(function (propertyId) { window['ga-disable-' + propertyId] = false; }); }; GoogleAnalytics.prototype.grantConsent = function () { gtag('consent', 'update', { 'analytics_storage': "granted" }); }; GoogleAnalytics.prototype.revokeConsent = function () { gtag('consent', 'update', { 'analytics_storage': "denied" }); }; GoogleAnalytics.prototype.sendPageView = function () { if (this.hasSentPageView !== false) { return; } if (commentsAnalytics) { commentsAnalytics.onPageView(); } else { gtag('event', 'page_view'); } this.hasSentPageView = true; }; GoogleAnalytics.prototype.load = function () { var config = this.addUserPropertiesToConfig(config = { send_page_view: false, }); gtag('js', new Date()); this.propertyIds.forEach(function (propertyId) { gtag('config', propertyId, config); }); }; GoogleAnalytics.prototype.sendTakeoverImpression = function () { if (typeof takeover === 'undefined' || this.hasSentTakeoverImpression) { return; } takeover.sendImpressionEvent(); this.hasSentTakeoverImpression = true; }; GoogleAnalytics.prototype.consentGrantedOnLoad = function () { this.enableCookies(); this.load(); this.sendPageView(); this.sendTakeoverImpression(); }; GoogleAnalytics.prototype.consentGrantedByUser = function () { this.enableCookies(); this.grantConsent(); this.sendPageView(); this.sendTakeoverImpression(); } GoogleAnalytics.prototype.consentRevokedOnLoad = function () { this.disableCookies(); this.revokeConsent(); this.load(); } GoogleAnalytics.prototype.consentRevokedByUser = function () { this.disableCookies(); } GoogleAnalytics.prototype.addUserPropertiesToConfig = function (config) { if (this.user) { config.user_id = this.user.id; config.dimension3 = this.user.has_contributed === true ? 1 : 0; } return config; } function boot(user) { var googleAnalytics = new GoogleAnalytics( JSON.parse(document.getElementById("gtag-property-ids").innerText), user ); if (CookieConsentRepository.fetch().performance) { googleAnalytics.consentGrantedOnLoad(); } else { googleAnalytics.consentRevokedOnLoad(); } CookieConsentListener.onPerformanceConsentChange(function(hasPerformanceConsent) { if (hasPerformanceConsent) { googleAnalytics.consentGrantedByUser(); } else { googleAnalytics.consentRevokedByUser(); } }); } document.addEventListener('DOMContentLoaded', function() { if (typeof auth === 'undefined') { boot(); return; } auth.whenReady().then( function () { boot(userRepository.get()); }, function () { boot(); } ); auth.addEventListener('auth.user.logged_in', function (payload) { const user = payload.user; if (!user || !user.id) { return; } gtag('set', {'user_id': user.id}); }) }); }()); </script> <div id="piano-landing-page-container"></div> <script> window.addEventListener("message", (e) => { if (e && e.isTrusted && e.origin && e.data) { const payload = (typeof e.data === "string") ? JSON.parse(e.data) : null; if (payload && payload.event) { switch (payload.event) { case "showPodcastPlayer": if (e.origin === "https://buy-eu.piano.io" && payload.url) { const id = getIdFromUrl(payload.url); if (document.getElementById(id)) { return; } const el = document.createElement("div"); el.innerHTML = ` <div class="podcast-player"> <iframe id="${id}" allow="autoplay" title="Embed Player" width="100%" height="100%" src="${payload.url}" scrolling="no" frameBorder="0"> </div> `.trim(); document.body.appendChild(el.firstChild); } break; case "ready": if (e.origin === "https://embed.acast.com") { const iframe = document.getElementById(getIdFromUrl(payload.value.src)); if (iframe) { iframe.contentWindow.postMessage(JSON.stringify({eventName: 'postmessage:do:play'}),'*'); } } break; } } } }); const getIdFromUrl = (url) => { const urlParts = url.split("/"); if (urlParts.length) { return urlParts.pop(); } return url; }; </script> </body> </html>