{"id":3539,"date":"2025-07-12T09:08:34","date_gmt":"2025-07-12T09:08:34","guid":{"rendered":"https:\/\/godsgalaxygame.com\/GGG\/?page_id=3539"},"modified":"2026-07-27T16:35:12","modified_gmt":"2026-07-27T16:35:12","slug":"medayork-pyramid-2","status":"publish","type":"page","link":"https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/","title":{"rendered":"MedaYork Pyramid"},"content":{"rendered":"\r\n<script>\r\n\/* BLISS \u2014 SHARED MEMBERSHIP SERVER REQUEST *\/\r\nwindow.BlissMembershipRequest =\r\n  window.BlissMembershipRequest ||\r\n  (function(){\r\n\r\n    let activeRequest = null;\r\n    let cachedResult = null;\r\n    let cachedAt = 0;\r\n\r\n    function load(url, action){\r\n\r\n      \/*\r\n       * Reuse a response briefly so all membership systems\r\n       * loading together receive the same server result.\r\n       *\/\r\n      if(\r\n        cachedResult &&\r\n        Date.now() - cachedAt < 2000\r\n      ){\r\n        return Promise.resolve(cachedResult);\r\n      }\r\n\r\n      \/*\r\n       * If another membership request is currently running,\r\n       * return that exact same Promise.\r\n       *\/\r\n      if(activeRequest){\r\n        return activeRequest;\r\n      }\r\n\r\n      const formData = new FormData();\r\n      formData.append(\"action\", action);\r\n\r\n      activeRequest =\r\n        fetch(url, {\r\n          method:\"POST\",\r\n          credentials:\"same-origin\",\r\n          cache:\"no-store\",\r\n          body:formData\r\n        })\r\n        .then(function(response){\r\n          if(!response.ok){\r\n            throw new Error(\r\n              \"Membership request failed: \" +\r\n              response.status\r\n            );\r\n          }\r\n\r\n          return response.json();\r\n        })\r\n        .then(function(result){\r\n          cachedResult = result;\r\n          cachedAt = Date.now();\r\n\r\n          return result;\r\n        })\r\n        .finally(function(){\r\n          activeRequest = null;\r\n        });\r\n\r\n      return activeRequest;\r\n    }\r\n\r\n    function clear(){\r\n      activeRequest = null;\r\n      cachedResult = null;\r\n      cachedAt = 0;\r\n    }\r\n\r\n    return {\r\n      load:load,\r\n      clear:clear\r\n    };\r\n\r\n  })();\r\n<\/script>\r\n<!-- ================== GGG PYRAMID \u2013 MEMBERSHIP-BASED UNLOCK ================== -->\r\n<style>\r\n  #pyramidShell{\r\n    position:relative;\r\n    width:100%;\r\n    max-width:600px;\r\n    margin:-130px auto 0;\r\n    z-index:10;\r\n  }\r\n\r\n  #pyramidContainer{\r\n    position:relative;\r\n    width:100%;\r\n    display:flex;\r\n    flex-direction:column;\r\n    align-items:center;\r\n    gap:18px;\r\n    z-index:15;\r\n    transition:filter .25s ease;\r\n  }\r\n\r\n  .pyramid-row{\r\n    display:flex;\r\n    justify-content:center;\r\n    gap:14px;\r\n  }\r\n\r\n  .pyramid-cube{\r\n    width:80px;\r\n    height:80px;\r\n    background-size:cover;\r\n    background-position:center;\r\n    border:2px solid white;\r\n    border-radius:16px;\r\n    box-shadow:0 0 12px cyan;\r\n    cursor:pointer;\r\n    transition:transform .3s ease, box-shadow .3s ease, filter .25s ease, opacity .25s ease;\r\n  }\r\n\r\n  .pyramid-cube:hover{\r\n    transform:scale(1.05);\r\n    box-shadow:0 0 18px white;\r\n  }\r\n\r\n  .pyramid-cube.locked{\r\n    filter:brightness(.45) saturate(.85);\r\n    opacity:.72;\r\n  }\r\n\r\n  .pyramid-cube.band-active{\r\n    box-shadow:0 0 20px rgba(0,255,255,.9);\r\n    border-color:rgba(0,255,255,.8);\r\n  }\r\n\r\n  .pyramid-cube.unlocked{\r\n    box-shadow:0 0 22px rgba(0,255,255,1);\r\n    border-color:rgba(0,255,255,.95);\r\n  }\r\n\r\n  #gggAuthBar{\r\n    position:fixed;\r\n    top:14px;\r\n    right:14px;\r\n    z-index:9999;\r\n    display:flex;\r\n    gap:10px;\r\n  }\r\n\r\n  #gggAuthBar button{\r\n    border:1px solid rgba(0,255,255,.45);\r\n    background:rgba(0,255,255,.10);\r\n    color:#e9f8ff;\r\n    padding:9px 12px;\r\n    border-radius:12px;\r\n    cursor:pointer;\r\n    backdrop-filter:blur(6px) saturate(130%);\r\n    font-size:14px;\r\n    line-height:1;\r\n    font-family:Orbitron,system-ui,sans-serif;\r\n  }\r\n\r\n  #gggAuthBar button:hover{\r\n    background:rgba(0,255,255,.18);\r\n    box-shadow:0 0 14px rgba(0,255,255,.25);\r\n  }\r\n\r\n  #pyramidBands{\r\n    pointer-events:auto;\r\n    position:absolute;\r\n    inset:0;\r\n    display:flex;\r\n    flex-direction:column;\r\n    justify-content:space-between;\r\n    padding:4px 6%;\r\n    z-index:5;\r\n  }\r\n\r\n  .pyramid-band{\r\n    flex:0 0 23%;\r\n    margin:3px 0;\r\n    border-radius:26px;\r\n    background:rgba(0,0,0,.25);\r\n    border:1px solid rgba(255,255,255,.12);\r\n    backdrop-filter:blur(10px);\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    text-align:center;\r\n    color:rgba(255,255,255,.9);\r\n    font-family:Orbitron,system-ui,sans-serif;\r\n    font-size:18px;\r\n    letter-spacing:.05em;\r\n    cursor:pointer;\r\n    transition:background .25s, box-shadow .25s, border-color .25s, transform .25s;\r\n  }\r\n\r\n  .pyramid-band:hover{\r\n    transform:translateY(-2px);\r\n    box-shadow:0 0 18px rgba(0,255,255,.25);\r\n  }\r\n\r\n  .pyramid-band.unlocked{\r\n    background:rgba(0,255,255,.18);\r\n    border-color:rgba(0,255,255,.6);\r\n    box-shadow:0 0 26px rgba(0,255,255,.7);\r\n  }\r\n\r\n  .pyramid-band.active-band{\r\n    background:rgba(0,255,255,.24);\r\n    border-color:rgba(0,255,255,1);\r\n    box-shadow:0 0 32px rgba(0,255,255,1);\r\n  }\r\n\r\n  #cubeLabel{\r\n    position:fixed;\r\n    left:50%;\r\n    bottom:14px;\r\n    transform:translateX(-50%);\r\n    padding:6px 14px;\r\n    border-radius:999px;\r\n    border:1px solid rgba(0,255,255,.6);\r\n    background:rgba(0,0,0,.78);\r\n    color:#eaf8ff;\r\n    font-family:Orbitron,system-ui,sans-serif;\r\n    font-size:13px;\r\n    letter-spacing:.03em;\r\n    pointer-events:none;\r\n    opacity:0;\r\n    transition:opacity .25s ease, transform .25s ease;\r\n    z-index:9998;\r\n  }\r\n\r\n  #cubeLabel.show{\r\n    opacity:1;\r\n    transform:translate(-50%, -4px);\r\n  }\r\n\r\n  .ggg-toast{\r\n    position:fixed;\r\n    left:50%;\r\n    bottom:60px;\r\n    transform:translateX(-50%);\r\n    background:rgba(0,0,0,.88);\r\n    color:#fff;\r\n    border:1px solid rgba(0,255,255,.45);\r\n    border-radius:14px;\r\n    padding:10px 14px;\r\n    font-size:13px;\r\n    font-family:Orbitron,system-ui,sans-serif;\r\n    z-index:10000;\r\n    box-shadow:0 0 18px rgba(0,255,255,.3);\r\n    display:none;\r\n    max-width:90vw;\r\n    text-align:center;\r\n  }\r\n\r\n  .ggg-toast.show{\r\n    display:block;\r\n  }\r\n\r\n  @media (min-width:1024px){\r\n    #pyramidShell{ max-width:900px; }\r\n    #pyramidContainer{ gap:24px; }\r\n    .pyramid-cube{ width:110px; height:110px; }\r\n    .pyramid-band{ font-size:20px; }\r\n  }\r\n\r\n  @media (max-width:768px){\r\n    #pyramidShell{\r\n      max-width:360px;\r\n      margin:10px auto 0;\r\n    }\r\n    .pyramid-cube{ width:70px; height:70px; }\r\n    .pyramid-band{ font-size:15px; }\r\n  }\r\n<\/style>\r\n\r\n<div id=\"gggAuthBar\">\r\n  <button id=\"gggAuthMain\" type=\"button\">Sign In \/ Sign Up<\/button>\r\n<\/div>\r\n\r\n<div id=\"cubeLabel\"><\/div>\r\n<div id=\"gggToast\" class=\"ggg-toast\"><\/div>\r\n\r\n<div id=\"pyramidShell\">\r\n  <div id=\"pyramidBands\">\r\n    <div class=\"pyramid-band\" data-band=\"fractional\">Fractional Club<\/div>\r\n    <div class=\"pyramid-band\" data-band=\"real\">Real Estate<\/div>\r\n    <div class=\"pyramid-band\" data-band=\"discounts\">Discounts &amp; Investments<\/div>\r\n    <div class=\"pyramid-band\" data-band=\"travel\">Travel Club<\/div>\r\n  <\/div>\r\n\r\n  <div id=\"pyramidContainer\">\r\n    <!-- TOP -->\r\n    <div class=\"pyramid-row\">\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"fractional\"\r\n           data-level=\"8\"\r\n           data-key=\"fractional\"\r\n           data-url=\"\/GGG\/fractional-ownership\/\"\r\n           data-name=\"Fractional Club \u2013 Bliss\u2019s Exclusive Fractional Ownership Club\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20231020-190236_PowerPoint.jpg')\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- REAL ESTATE -->\r\n    <div class=\"pyramid-row\">\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"real\"\r\n           data-level=\"7\"\r\n           data-key=\"real\"\r\n           data-url=\"\/GGG\/real-estate\/\"\r\n           data-name=\"Real Estate \u2013 ENP Worldwide Real Estate\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250605_200742_PowerPoint-scaled.jpg')\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- DISCOUNTS + INVESTMENTS -->\r\n    <div class=\"pyramid-row\">\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"discounts\"\r\n           data-level=\"5\"\r\n           data-key=\"discounts\"\r\n           data-url=\"\/GGG\/discounts-gift\/\"\r\n           data-name=\"Discounts &#038; Gifts\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250601_193959_Gallery.jpg')\"><\/div>\r\n\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"discounts\"\r\n           data-level=\"6\"\r\n           data-key=\"investments\"\r\n           data-url=\"\/GGG\/limitless-investments\/\"\r\n           data-name=\"Limitless Investments\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240104-113821_PowerPoint.jpg')\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- TRAVEL -->\r\n    <div class=\"pyramid-row\">\r\n      <div class=\"pyramid-cube always-open unlocked\"\r\n           data-band=\"travel\"\r\n           data-level=\"1\"\r\n           data-key=\"astro\"\r\n           data-url=\"\/GGG\/astro\"\r\n           data-name=\"Astro Travel Recommendations\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/Screenshot_20250909_174524_Chrome.jpg')\"><\/div>\r\n\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"travel\"\r\n           data-level=\"2\"\r\n           data-key=\"rr\"\r\n           data-url=\"\/GGG\/responsable-reservations\/\"\r\n           data-name=\"Responsable Reservations\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20231205-181457_PowerPoint.jpg')\"><\/div>\r\n\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"travel\"\r\n           data-level=\"3\"\r\n           data-key=\"thematic\"\r\n           data-url=\"\/GGG\/thematic-tours\/\"\r\n           data-name=\"Thematic Tours\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20231205-183244_PowerPoint.jpg')\"><\/div>\r\n\r\n      <div class=\"pyramid-cube locked\"\r\n           data-band=\"travel\"\r\n           data-level=\"4\"\r\n           data-key=\"evolution\"\r\n           data-url=\"\/GGG\/evolution-tours\/\"\r\n           data-name=\"Evolution Tours\"\r\n           style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20231205-182854_PowerPoint.jpg')\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const ajaxUrl = \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\n  const data = window.gggPmsData || {\r\n    loggedIn: false,\r\n    owned: {1:true,2:false,3:false,4:false,5:false,6:false,7:false,8:false},\r\n    urls: {login:'\/login\/', account:'\/account\/', register:'\/register\/'},\r\n    currentUserEmail: ''\r\n  };\r\n\r\n  const adminTestMode = true;\r\n  const adminEmails = [\r\n    \"edwardraigozallc@gmail.com\",\r\n    \"juelsbotmi@hotmail.com\"\r\n  ];\r\n  const masterCode = \"Galaxy2026\";\r\n\r\n  const authBtn = document.getElementById('gggAuthMain');\r\n  const bands   = document.querySelectorAll('.pyramid-band');\r\n  const cubes   = document.querySelectorAll('#pyramidContainer .pyramid-cube');\r\n  const label   = document.getElementById('cubeLabel');\r\n  const toast   = document.getElementById('gggToast');\r\n\r\n  function showToast(message){\r\n    if (!toast) return;\r\n    toast.textContent = message;\r\n    toast.classList.add('show');\r\n    clearTimeout(toast._hide);\r\n    toast._hide = setTimeout(() => toast.classList.remove('show'), 2200);\r\n  }\r\n\r\n  function lockCube(cube){\r\n    if (!cube.classList.contains('always-open')) {\r\n      cube.classList.add('locked');\r\n      cube.classList.remove('unlocked');\r\n    }\r\n  }\r\n\r\n  function unlockCube(cube){\r\n    cube.classList.remove('locked');\r\n    cube.classList.add('unlocked');\r\n  }\r\n\r\n  function refreshBands(){\r\n    bands.forEach(band => {\r\n      const bandId = band.dataset.band;\r\n      const unlockedInBand = document.querySelector('.pyramid-cube[data-band=\"' + bandId + '\"]:not(.locked)');\r\n      band.classList.toggle('unlocked', !!unlockedInBand);\r\n    });\r\n  }\r\n\r\n  function resetOwnershipVisuals(){\r\n    cubes.forEach(cube => {\r\n      if (cube.classList.contains('always-open')) {\r\n        unlockCube(cube);\r\n      } else {\r\n        lockCube(cube);\r\n      }\r\n    });\r\n  }\r\n\r\n  function applyOwnership(){\r\n    resetOwnershipVisuals();\r\n\r\n    cubes.forEach(cube => {\r\n      const level = parseInt(cube.dataset.level || '0', 10);\r\n\r\n      if (level === 1 || cube.classList.contains('always-open')){\r\n        unlockCube(cube);\r\n        return;\r\n      }\r\n\r\n      if (data.owned && data.owned[level]) {\r\n        unlockCube(cube);\r\n      }\r\n    });\r\n\r\n    refreshBands();\r\n  }\r\n\r\n  function setActiveBand(bandId){\r\n    bands.forEach(b => b.classList.toggle('active-band', b.dataset.band === bandId));\r\n    cubes.forEach(c => c.classList.toggle('band-active', c.dataset.band === bandId));\r\n  }\r\n\r\n  function setAuthButton(){\r\n    if (data.loggedIn){\r\n      authBtn.textContent = 'My Account';\r\n      authBtn.onclick = function(){ window.location.href = data.urls.account; };\r\n    } else {\r\n      authBtn.textContent = 'Sign In \/ Sign Up';\r\n      authBtn.onclick = function(){\r\n        const entered = prompt(\"Enter master access code or press Cancel to sign in:\");\r\n\r\n        if (entered === masterCode) {\r\n          data.owned = {\r\n            1: true, 2: true, 3: true, 4: true,\r\n            5: true, 6: true, 7: true, 8: true\r\n          };\r\n          showToast('Master access activated.');\r\n          applyOwnership();\r\n          refreshBands();\r\n        } else if (entered !== null && entered !== \"\") {\r\n          showToast('Incorrect code.');\r\n        } else {\r\n          window.location.href = data.urls.login;\r\n        }\r\n      };\r\n    }\r\n  }\r\n\r\n  function applyAdminEmailOverride(){\r\n    if (\r\n      adminTestMode &&\r\n      data.loggedIn &&\r\n      adminEmails.includes((data.currentUserEmail || \"\").toLowerCase())\r\n    ) {\r\n      data.owned = {\r\n        1: true, 2: true, 3: true, 4: true,\r\n        5: true, 6: true, 7: true, 8: true\r\n      };\r\n    }\r\n  }\r\n\r\n  function loadVaultLevels(){\r\n    window.BlissMembershipRequest.load(\r\n  ajaxUrl,\r\n  \"ggg_get_current_user_vault_levels\"\r\n)\r\n    .then(res => {\r\n      if (!res || !res.success || !res.data) {\r\n        applyAdminEmailOverride();\r\n        setAuthButton();\r\n        applyOwnership();\r\n        return;\r\n      }\r\n\r\n      if (res.data.logged_in && res.data.owned) {\r\n        data.loggedIn = true;\r\n        data.owned = res.data.owned;\r\n      }\r\n\r\n      applyAdminEmailOverride();\r\n      setAuthButton();\r\n      applyOwnership();\r\n    })\r\n    .catch(() => {\r\n      applyAdminEmailOverride();\r\n      setAuthButton();\r\n      applyOwnership();\r\n    });\r\n  }\r\n\r\n  bands.forEach(band => {\r\n    band.addEventListener('click', () => {\r\n      setActiveBand(band.dataset.band);\r\n    });\r\n  });\r\n\r\n  cubes.forEach(cube => {\r\n    cube.addEventListener('click', () => {\r\n      const name = cube.dataset.name || '';\r\n      const url  = cube.dataset.url || '#';\r\n      const band = cube.dataset.band || '';\r\n\r\n      if (label && name){\r\n        label.textContent = name;\r\n        label.classList.add('show');\r\n        clearTimeout(label._hideTimer);\r\n        label._hideTimer = setTimeout(() => label.classList.remove('show'), 1800);\r\n      }\r\n\r\n      setActiveBand(band);\r\n\r\n      if (!cube.classList.contains('locked')) {\r\n        window.location.href = url;\r\n        return;\r\n      }\r\n\r\n      if (!data.loggedIn) {\r\n        showToast('Please sign in or sign up first.');\r\n        setTimeout(() => {\r\n          window.location.href = data.urls.login;\r\n        }, 700);\r\n        return;\r\n      }\r\n\r\n      showToast('This level is not active in your account yet.');\r\n    });\r\n  });\r\n\r\n  loadVaultLevels();\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n<!-- MedaYork \u2014 HyperTunnel PURE: Purple Warp + Neon Network (no shapes), SLOW -->\r\n<style>\r\n  #medayork-bg{position:fixed; inset:0; z-index:0; pointer-events:none;}\r\n  #medayork-bg canvas{position:absolute; inset:0; width:100vw; height:100vh; display:block;}\r\n\r\n  \/* Deep purple ambience *\/\r\n  #medayork-bg::before{\r\n    content:\"\"; position:absolute; inset:-10%;\r\n    background:\r\n      radial-gradient(120% 90% at 50% 100%, rgba(8, 4, 20, .95), transparent 58%),\r\n      radial-gradient(100% 80% at 80% 24%, rgba(170, 80, 255, .22), transparent 60%),\r\n      radial-gradient(90% 70%  at 22% 76%, rgba(70, 190, 255, .12), transparent 60%),\r\n      radial-gradient(65% 55%  at 50% 40%, rgba(140, 0, 255, .18), transparent 60%);\r\n    mix-blend-mode:screen; opacity:.98;\r\n  }\r\n  \/* Soft scanning shimmer (slower) *\/\r\n  #medayork-bg::after{\r\n    content:\"\"; position:absolute; inset:0;\r\n    background:linear-gradient(transparent 42%, rgba(160, 80, 255, .10) 50%, transparent 58%);\r\n    background-size:100% 300%;\r\n    animation:medaScan 14s linear infinite; opacity:.28;\r\n  }\r\n  @keyframes medaScan{0%{background-position-y:-180%}100%{background-position-y:180%}}\r\n\r\n  body{ background:#0a0714; }\r\n  .medayork-raise{ position:relative; z-index:1; }\r\n\r\n  @media (prefers-reduced-motion: reduce){\r\n    #medayork-bg::after{ animation:none; opacity:.14; }\r\n  }\r\n<\/style>\r\n\r\n<div id=\"medayork-bg\" aria-hidden=\"true\">\r\n  <canvas id=\"medaHyper\"><\/canvas>\r\n<\/div>\r\n\r\n<script>\r\n(()=>{\r\n\r\n  const MOBILE = innerWidth < 768;\r\n\r\n  \/* ===== Slowed config (no shapes) ===== *\/\r\n  const CFG = {\r\n    \/\/ Radial warp stars (very slow)\r\n    growth   : MOBILE ? 1.006 : 1.009,          \/\/ radial expansion per frame\r\n    swirl    : 0.00055,                          \/\/ subtle spiral\r\n    starCount: MOBILE ? 600 : 1200,\r\n    parallax : 10,\r\n\r\n    \/\/ Neon network\r\n    nodes    : MOBILE ? 60 : 120,\r\n    nodeSpeed: 0.12,                             \/\/ drift speed (slow)\r\n    linkDist : MOBILE ? 120 : 160,\r\n\r\n    \/\/ Colors\r\n    col:{\r\n      streak : 'rgba(195, 235, 255, .75)',\r\n      streak2: 'rgba(160, 120, 255, .35)',\r\n      glow   : 'rgba(150, 90, 255, .10)',\r\n      node   : '#efe6ff',\r\n      link   : 'rgba(140, 220, 255, .20)'\r\n    }\r\n  };\r\n\r\n  \/* ===== Canvas ===== *\/\r\n  const cvs = document.getElementById('medaHyper');\r\n  if(!cvs) return;\r\n  const ctx = cvs.getContext('2d', { alpha:true });\r\n  const DPR = Math.min(devicePixelRatio||1, 2);\r\n  let W=0,H=0,CX=0,CY=0,MAXR=0;\r\n\r\n  function resize(){\r\n    W = Math.max(document.documentElement.clientWidth, innerWidth||0);\r\n    H = Math.max(document.documentElement.clientHeight, innerHeight||0);\r\n    CX = W\/2; CY = H\/2;\r\n    MAXR = Math.hypot(W, H) * 0.72;\r\n    cvs.width = Math.floor(W*DPR); cvs.height = Math.floor(H*DPR);\r\n    cvs.style.width = W+'px'; cvs.style.height = H+'px';\r\n    ctx.setTransform(DPR,0,0,DPR,0,0);\r\n  }\r\n  resize(); addEventListener('resize', resize);\r\n\r\n  \/* ===== Input (parallax) ===== *\/\r\n  let mx=0,my=0;\r\n  addEventListener('mousemove', e=>{ mx = (e.clientX\/W)*2-1; my = (e.clientY\/H)*2-1; }, {passive:true});\r\n  addEventListener('deviceorientation', e=>{\r\n    if (e && (e.beta||e.gamma)){\r\n      mx = Math.max(-1, Math.min(1, (e.gamma||0)\/45));\r\n      my = Math.max(-1, Math.min(1, (e.beta ||0)\/45));\r\n    }\r\n  }, {passive:true});\r\n\r\n  \/* ===== Star Streaks (radial warp) ===== *\/\r\n  function makeStar(){\r\n    const r0 = 1 + Math.random()*3;\r\n    const a0 = Math.random()*Math.PI*2;\r\n    const v  = 1 + Math.random()*0.012;         \/\/ much smaller variance\r\n    const t  = Math.random()*2*Math.PI;\r\n    return { r:r0, a:a0, v, px:null, py:null, t };\r\n  }\r\n  const stars = Array.from({length:CFG.starCount}, makeStar);\r\n\r\n  function drawStars(){\r\n    ctx.globalCompositeOperation = 'source-over';\r\n    ctx.strokeStyle = CFG.col.streak;\r\n\r\n    for(const s of stars){\r\n      const ox = s.px, oy = s.py;\r\n\r\n      \/\/ slow radial growth + gentle swirl\r\n      s.r *= (CFG.growth * s.v);\r\n      s.a += CFG.swirl * (1.6 - Math.min(1.6, s.r\/(MAXR*0.6)));\r\n\r\n      \/\/ recycle when past edge\r\n      if (s.r > MAXR){\r\n        Object.assign(s, makeStar());\r\n      }\r\n\r\n      const x = CX + Math.cos(s.a)*s.r + mx*CFG.parallax;\r\n      const y = CY + Math.sin(s.a)*s.r - my*(CFG.parallax*0.9);\r\n\r\n      \/\/ short, soft trail (slow)\r\n      const tail = Math.min(8, (s.r\/MAXR)*12) + Math.sin(s.t += 0.08)*0.3;\r\n\r\n      if (ox != null){\r\n        ctx.lineWidth = Math.max(0.9, tail*0.42);\r\n        ctx.beginPath(); ctx.moveTo(ox, oy); ctx.lineTo(x, y); ctx.stroke();\r\n\r\n        ctx.globalCompositeOperation = 'lighter';\r\n        ctx.strokeStyle = CFG.col.streak2;\r\n        ctx.lineWidth = Math.max(0.5, tail*0.26);\r\n        ctx.beginPath(); ctx.moveTo(ox+0.4, oy); ctx.lineTo(x+0.4, y); ctx.stroke();\r\n        ctx.globalCompositeOperation = 'source-over';\r\n        ctx.strokeStyle = CFG.col.streak;\r\n      }\r\n\r\n      \/\/ node glow\r\n      ctx.fillStyle = CFG.col.glow;\r\n      ctx.beginPath(); ctx.arc(x, y, 5.5, 0, Math.PI*2); ctx.fill();\r\n      ctx.fillStyle = CFG.col.node;\r\n      ctx.beginPath(); ctx.arc(x, y, 1.1, 0, Math.PI*2); ctx.fill();\r\n\r\n      s.px = x; s.py = y;\r\n    }\r\n  }\r\n\r\n  \/* ===== Neon Network (nodes + links) ===== *\/\r\n  const nodes = Array.from({length:CFG.nodes}, ()=>({\r\n    x: Math.random()*W,\r\n    y: Math.random()*H,\r\n    vx: (Math.random()*2-1)*CFG.nodeSpeed,\r\n    vy: (Math.random()*2-1)*CFG.nodeSpeed\r\n  }));\r\n\r\n  function drawNetwork(){\r\n    \/\/ slow drift\r\n    for(const n of nodes){\r\n      n.x += n.vx; n.y += n.vy;\r\n      if (n.x<-30) n.x=W+30; if (n.x>W+30) n.x=-30;\r\n      if (n.y<-30) n.y=H+30; if (n.y>H+30) n.y=-30;\r\n    }\r\n\r\n    \/\/ links\r\n    ctx.strokeStyle = CFG.col.link;\r\n    ctx.lineWidth = 1;\r\n    ctx.globalAlpha = 0.9;\r\n    ctx.beginPath();\r\n    for(let i=0;i<nodes.length;i++){\r\n      const a = nodes[i];\r\n      const ax = a.x + mx*4, ay = a.y - my*4;\r\n      for(let j=i+1;j<nodes.length;j++){\r\n        const b = nodes[j];\r\n        const bx = b.x + mx*4, by = b.y - my*4;\r\n        const dx = ax - bx, dy = ay - by, d = Math.hypot(dx,dy);\r\n        if (d < CFG.linkDist){ ctx.moveTo(ax, ay); ctx.lineTo(bx, by); }\r\n      }\r\n    }\r\n    ctx.stroke();\r\n    ctx.globalAlpha = 1;\r\n\r\n    \/\/ nodes\r\n    for(const n of nodes){\r\n      const x = n.x + mx*4, y = n.y - my*4;\r\n      ctx.fillStyle = CFG.col.glow;\r\n      ctx.beginPath(); ctx.arc(x, y, 6, 0, Math.PI*2); ctx.fill();\r\n      ctx.fillStyle = CFG.col.node;\r\n      ctx.beginPath(); ctx.arc(x, y, 1.2, 0, Math.PI*2); ctx.fill();\r\n    }\r\n  }\r\n\r\n  \/* ===== Main Loop ===== *\/\r\n  let running = true;\r\n  function frame(){\r\n    if(!running) return;\r\n    requestAnimationFrame(frame);\r\n    ctx.clearRect(0,0,W,H);\r\n    drawNetwork();   \/\/ web first\r\n    drawStars();     \/\/ then warp streaks over it\r\n  }\r\n  frame();\r\n\r\n  document.addEventListener('visibilitychange', ()=>{\r\n    running = !document.hidden; if (running) frame();\r\n  });\r\n\r\n  \/\/ Runtime speed control (0.5 = slower, 1.0 = default, 1.4 = faster)\r\n  window.MedaYorkHyper = {\r\n    speed(mult=1){\r\n      const base = (innerWidth<768?1.006:1.009);\r\n      CFG.growth = base * mult;\r\n      CFG.swirl  = 0.00055 * mult;\r\n      \/\/ network drift\r\n      const baseV = 0.12;\r\n      for (const n of nodes){\r\n        const ang = Math.atan2(n.vy, n.vx);\r\n        const spd = baseV * mult;\r\n        n.vx = Math.cos(ang) * spd;\r\n        n.vy = Math.sin(ang) * spd;\r\n      }\r\n    }\r\n  };\r\n\r\n})();\r\n<\/script>\r\n\r\n\r\n<!-- ================== GGG TRAVEL CLUB HIDDEN PAGE \u2013 PREMIUM MEMBERSHIP UPGRADE ================== -->\r\n<style>\r\nhtml.tc2-active,\r\nbody.tc2-active{\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  overflow:hidden !important;\r\n  background:#02050d !important;\r\n}\r\nbody.tc2Hide *{visibility:hidden !important;}\r\nbody.tc2Hide #tc2Overlay,\r\nbody.tc2Hide #tc2Overlay *{visibility:visible !important;}\r\n\r\n#tc2Overlay{\r\n  --tc-bg:#02050d;\r\n  --tc-bg2:#071223;\r\n  --tc-bg3:#0c1730;\r\n  --tc-panel:rgba(7,13,28,.78);\r\n  --tc-panel2:rgba(255,255,255,.04);\r\n  --tc-line:rgba(255,255,255,.10);\r\n  --tc-line2:rgba(255,255,255,.06);\r\n  --tc-white:#f8fbff;\r\n  --tc-soft:rgba(248,251,255,.82);\r\n  --tc-soft2:rgba(248,251,255,.58);\r\n  --tc-gold:#f4d27a;\r\n  --tc-gold2:#dca63a;\r\n  --tc-cyan:#53f3ff;\r\n  --tc-cyan2:#00b8ff;\r\n  --tc-green:#70f7a2;\r\n  --tc-violet:#8b5cf6;\r\n  --tc-magenta:#cf56ff;\r\n  --tc-red:#ff6b8a;\r\n  --tc-shadow:0 24px 80px rgba(0,0,0,.52);\r\n\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n  width:100vw !important;\r\n  height:100vh !important;\r\n  z-index:2147483647 !important;\r\n  overflow-y:auto !important;\r\n  overflow-x:hidden !important;\r\n  -webkit-overflow-scrolling:touch;\r\n  display:none;\r\n  font-family:Arial, Helvetica, sans-serif !important;\r\n  color:var(--tc-white);\r\n  background:\r\n    radial-gradient(circle at 18% 14%, rgba(83,243,255,.08), transparent 20%),\r\n    radial-gradient(circle at 82% 18%, rgba(139,92,246,.10), transparent 22%),\r\n    radial-gradient(circle at 50% 88%, rgba(244,210,122,.06), transparent 24%),\r\n    linear-gradient(180deg, #01030b 0%, #06101f 46%, #02050d 100%) !important;\r\n}\r\n#tc2Overlay *{box-sizing:border-box;}\r\n\r\n.tc2-wrap{position:relative;min-height:100%;}\r\n.tc2-page{display:none;min-height:100vh;animation:tc2Fade .35s ease both;}\r\n.tc2-page.active{display:block;}\r\n\r\n.tc2-shell{\r\n  width:100%;\r\n  max-width:1500px;\r\n  margin:0 auto;\r\n  padding:22px 18px 96px;\r\n  position:relative;\r\n  z-index:3;\r\n}\r\n\r\n.tc2-glass{\r\n  background:\r\n    radial-gradient(circle at top left, rgba(83,243,255,.05), transparent 26%),\r\n    linear-gradient(180deg, rgba(12,18,40,.86), rgba(7,11,26,.94));\r\n  border:1px solid var(--tc-line);\r\n  border-radius:34px;\r\n  box-shadow:var(--tc-shadow);\r\n  backdrop-filter:blur(22px);\r\n  -webkit-backdrop-filter:blur(22px);\r\n}\r\n\r\n\/* HERO SCROLL SYSTEM \u2013 KEPT *\/\r\n.tc2-hero{position:relative;min-height:230vh;}\r\n.tc2-hero-sticky{\r\n  position:sticky;\r\n  top:0;\r\n  min-height:100vh;\r\n  overflow:hidden;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n}\r\n.tc2-hero-bg{\r\n  position:absolute;\r\n  inset:0;\r\n  background:\r\n    linear-gradient(180deg, rgba(0,0,0,.08), rgba(0,0,0,.66)),\r\n    url(\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\")\r\n    center center \/ cover no-repeat;\r\n  transform:scale(var(--tc2BgScale,1)) translateY(var(--tc2BgShift,0px));\r\n  transform-origin:center center;\r\n  will-change:transform, opacity, filter;\r\n  filter:brightness(var(--tc2BgBrightness,1));\r\n}\r\n.tc2-stars{position:absolute;inset:0;pointer-events:none;overflow:hidden;}\r\n.tc2-stars span{\r\n  position:absolute;\r\n  display:block;\r\n  border-radius:50%;\r\n  background:#fff;\r\n  opacity:.82;\r\n  animation:tc2Star linear infinite;\r\n}\r\n.tc2-hero-inner{\r\n  position:relative;\r\n  z-index:2;\r\n  width:100%;\r\n  max-width:1280px;\r\n  padding:20px;\r\n  text-align:center;\r\n}\r\n.tc2-logoWrap{\r\n  position:relative;\r\n  width:min(42vw,220px);\r\n  aspect-ratio:1\/1;\r\n  margin:0 auto 18px;\r\n  transform:scale(var(--tc2LogoScale,1));\r\n  transform-origin:center center;\r\n  opacity:var(--tc2LogoOpacity,1);\r\n  will-change:transform, opacity;\r\n}\r\n.tc2-logoAura{\r\n  position:absolute;\r\n  inset:-14px;\r\n  border-radius:50%;\r\n  background:conic-gradient(from 0deg, rgba(244,210,122,.85), rgba(83,243,255,.8), rgba(139,92,246,.78), rgba(244,210,122,.85));\r\n  filter:blur(18px);\r\n  opacity:.75;\r\n}\r\n.tc2-logoRing{\r\n  position:absolute;\r\n  inset:0;\r\n  border-radius:50%;\r\n  background:radial-gradient(\r\n      circle at 50% 50%,\r\n      rgba(8,13,28,.4),\r\n      rgba(2,5,13,.94)\r\n  );\r\n\r\n  border:2px solid rgba(0,245,255,.7);\r\n  box-shadow:\r\n      0 0 18px rgba(0,245,255,.8),\r\n      0 0 45px rgba(59,130,246,.6),\r\n      0 0 80px rgba(139,92,246,.5);\r\n}\r\n.tc2-logo{position:absolute;inset:10px;border-radius:50%;overflow:hidden;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06);}\r\n.tc2-logo img{width:100%;height:100%;object-fit:cover;display:block;}\r\n.tc2-hero-copy{\r\n  transform:translateY(var(--tc2CopyY,0px)) scale(var(--tc2CopyScale,1));\r\n  transform-origin:center top;\r\n  opacity:var(--tc2CopyOpacity,1);\r\n  will-change:transform, opacity;\r\n}\r\n.tc2-medayork{\r\n    display:block;\r\n    position:relative;\r\n    margin:0 auto 12px;\r\n\r\n    font-family:\"Orbitron\",sans-serif;\r\n\r\n    font-size:clamp(2.1rem,6vw,5.4rem);\r\n    font-weight:900;\r\n\r\n    letter-spacing:.65em;\r\n    text-transform:uppercase;\r\n\r\n    color:#ecffff;\r\n\r\n    text-align:center;\r\n\r\n    text-shadow:\r\n        0 0 6px rgba(255,255,255,.9),\r\n        0 0 14px rgba(0,245,255,.95),\r\n        0 0 28px rgba(59,130,246,.9),\r\n        0 0 55px rgba(139,92,246,.8),\r\n        0 0 100px rgba(217,70,239,.55);\r\n\r\n    transform:perspective(1200px) rotateX(8deg);\r\n\r\n    animation:medayorkPulse 5s ease-in-out infinite;\r\n}\r\n\r\n.tc2-medayork::before{\r\n    content:\"MEDAYORK\";\r\n\r\n    position:absolute;\r\n    inset:0;\r\n\r\n    color:transparent;\r\n\r\n    -webkit-text-stroke:1px rgba(0,245,255,.45);\r\n\r\n    filter:blur(10px);\r\n\r\n    opacity:.9;\r\n\r\n    transform:scale(1.03);\r\n}\r\n\r\n.tc2-medayork::after{\r\n    content:\"\";\r\n\r\n    position:absolute;\r\n\r\n    left:10%;\r\n    right:10%;\r\n    bottom:-12px;\r\n\r\n    height:2px;\r\n\r\n    background:linear-gradient(\r\n        90deg,\r\n        transparent,\r\n        #00F5FF,\r\n        #3B82F6,\r\n        #8B5CF6,\r\n        transparent\r\n    );\r\n\r\n    box-shadow:\r\n        0 0 12px #00F5FF,\r\n        0 0 30px #3B82F6,\r\n        0 0 55px #8B5CF6;\r\n\r\n    opacity:.8;\r\n}\r\n\r\n@keyframes medayorkPulse{\r\n\r\n    0%,100%{\r\n        filter:brightness(1);\r\n        transform:perspective(1200px) rotateX(8deg) scale(1);\r\n    }\r\n\r\n    50%{\r\n        filter:brightness(1.3);\r\n        transform:perspective(1200px) rotateX(8deg) scale(1.03);\r\n    }\r\n\r\n}\r\n.tc2-kicker{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  min-height:42px;\r\n  padding:0 16px;\r\n  border-radius:999px;\r\n  background:rgba(8,13,28,.56);\r\n  border:1px solid rgba(255,255,255,.12);\r\n  color:#fff0c4;\r\n  font-size:.75rem;\r\n  font-weight:800;\r\n  letter-spacing:.18em;\r\n  text-transform:uppercase;\r\n}\r\n.tc2-title{\r\n    margin:10px auto 10px;\r\n    max-width:1200px;\r\n\r\n    font-size:clamp(5rem,12vw,9.5rem);\r\n\r\n    line-height:.86;\r\n\r\n    font-weight:900;\r\n\r\n    letter-spacing:-.06em;\r\n\r\n    text-transform:uppercase;\r\n\r\n    color:white;\r\n\r\n    text-shadow:\r\n        0 0 18px rgba(255,255,255,.18),\r\n        0 18px 40px rgba(0,0,0,.55);\r\n}\r\n.tc2-title .glow{\r\n  color:var(--tc-gold);\r\n  text-shadow:0 0 16px rgba(244,210,122,.22),0 0 36px rgba(83,243,255,.10);\r\n}\r\n.tc2-sub{\r\n    margin-top:10px;\r\n\r\n    font-size:clamp(1.2rem,2vw,2rem);\r\n\r\n    font-weight:700;\r\n\r\n    letter-spacing:.8em;\r\n\r\n    text-transform:uppercase;\r\n\r\n    color:#9eefff;\r\n\r\n    text-shadow:\r\n        0 0 10px rgba(0,245,255,.5),\r\n        0 0 30px rgba(59,130,246,.3);\r\n}\r\n.tc2-scroll{\r\n  margin-top:28px;\r\n  color:var(--tc-soft2);\r\n  font-size:.76rem;\r\n  letter-spacing:.22em;\r\n  text-transform:uppercase;\r\n}\r\n.tc2-wheel{\r\n  width:36px;\r\n  height:60px;\r\n  margin:0 auto 10px;\r\n  border-radius:999px;\r\n  border:1.5px solid rgba(244,210,122,.62);\r\n  position:relative;\r\n  background:rgba(8,13,28,.44);\r\n}\r\n.tc2-wheel::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  top:10px;\r\n  left:50%;\r\n  width:6px;\r\n  height:12px;\r\n  border-radius:999px;\r\n  background:var(--tc-gold);\r\n  transform:translateX(-50%);\r\n  animation:tc2Wheel 1.5s ease-in-out infinite;\r\n}\r\n\r\n\/* TOP CONTROLS *\/\r\n.tc2-backSolo{\r\n  position:fixed;\r\n  top:18px;\r\n  left:18px;\r\n  z-index:120;\r\n  width:50px;\r\n  height:50px;\r\n  border:none;\r\n  border-radius:50%;\r\n  background:rgba(8,13,28,.18);\r\n  color:#fff;\r\n  font-size:1.2rem;\r\n  cursor:pointer;\r\n}\r\n.tc2-menuBtn{\r\n  position:fixed;\r\n  top:18px;\r\n  right:18px;\r\n  z-index:2147483647;\r\n  width:48px;\r\n  height:48px;\r\n  border-radius:50%;\r\n  background:rgba(8,13,28,.7);\r\n  border:1px solid rgba(255,255,255,.1);\r\n  color:#fff;\r\n  font-size:1.2rem;\r\n  cursor:pointer;\r\n}\r\n.tc2-menuPanel{\r\n  position:fixed;\r\n  top:76px;\r\n  right:18px;\r\n  width:90%;\r\n  max-width:420px;\r\n  max-height:80vh;\r\n  overflow:auto;\r\n  display:none;\r\n  background:rgba(8,13,26,.72);\r\n  backdrop-filter:blur(14px);\r\n  border:1px solid rgba(255,255,255,.09);\r\n  border-radius:22px;\r\n  padding:16px;\r\n  z-index:2147483646;\r\n}\r\n.tc2-menuPanel.open{display:block;}\r\n.tc2-menuTitle{margin:0 0 6px;font-size:1.25rem;text-transform:uppercase;letter-spacing:.05em;}\r\n.tc2-menuText{margin:0 0 12px;color:var(--tc-soft);line-height:1.55;}\r\n.tc2-menuLink{\r\n  display:block;\r\n  width:100%;\r\n  margin:6px 0;\r\n  padding:11px;\r\n  border-radius:12px;\r\n  background:rgba(255,255,255,.05);\r\n  border:1px solid rgba(255,255,255,.08);\r\n  color:#fff;\r\n  cursor:pointer;\r\n  text-align:left;\r\n}\r\n.tc2-legalBlock{\r\n  display:none;\r\n  margin-top:10px;\r\n  padding:12px;\r\n  border-radius:12px;\r\n  background:rgba(255,255,255,.05);\r\n  color:var(--tc-soft);\r\n  line-height:1.65;\r\n}\r\n.tc2-legalBlock.open{display:block;}\r\n\r\n\/* HOME *\/\r\n.tc2-mainReveal{position:relative;margin-top:-18vh;z-index:4;}\r\n.tc2-futureGrid{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n.tc2-futureCard{\r\n  position:relative;\r\n  min-height:310px;\r\n  padding:24px;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  border-radius:32px;\r\n  background:\r\n    radial-gradient(circle at 50% 0%, rgba(83,243,255,.16), transparent 38%),\r\n    linear-gradient(180deg, rgba(10,18,40,.92), rgba(2,5,13,.98));\r\n  color:#fff;\r\n  text-align:left;\r\n  overflow:hidden;\r\n  cursor:pointer;\r\n  box-shadow:0 0 24px rgba(0,255,255,.12);\r\n  transition:.28s ease;\r\n}\r\n\r\n.tc2-futureCard:hover{\r\n  transform:translateY(-6px) scale(1.015);\r\n  box-shadow:0 0 34px rgba(83,243,255,.35);\r\n}\r\n\r\n.tc2-futureCard::before{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:-2px;\r\n  border-radius:inherit;\r\n  padding:2px;\r\n  background:conic-gradient(\r\n    from 0deg,\r\n    transparent,\r\n    rgba(83,243,255,.85),\r\n    rgba(139,92,246,.75),\r\n    rgba(244,210,122,.75),\r\n    transparent\r\n  );\r\n  -webkit-mask:\r\n    linear-gradient(#000 0 0) content-box,\r\n    linear-gradient(#000 0 0);\r\n  -webkit-mask-composite:xor;\r\n  mask-composite:exclude;\r\n  animation:tc2EnergySpin 7s linear infinite;\r\n  pointer-events:none;\r\n}\r\n\r\n.tc2-futureCard::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  background:\r\n    linear-gradient(120deg, transparent 20%, rgba(255,255,255,.08), transparent 45%);\r\n  transform:translateX(-120%);\r\n  animation:tc2ScanCard 5.5s ease-in-out infinite;\r\n  pointer-events:none;\r\n}\r\n\r\n.tc2-status{\r\n  position:relative;\r\n  z-index:2;\r\n  display:inline-flex;\r\n  padding:7px 12px;\r\n  border-radius:999px;\r\n  background:rgba(0,0,0,.42);\r\n  border:1px solid rgba(255,255,255,.14);\r\n  color:#9eefff;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-orb{\r\n  position:relative;\r\n  z-index:2;\r\n  width:92px;\r\n  height:92px;\r\n  margin:30px 0 20px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  border-radius:50%;\r\n  font-size:2.7rem;\r\n  background:radial-gradient(circle, rgba(255,255,255,.16), rgba(0,0,0,.8));\r\n  border:1px solid rgba(255,255,255,.18);\r\n  box-shadow:\r\n    0 0 18px rgba(83,243,255,.55),\r\n    inset 0 0 22px rgba(255,255,255,.08);\r\n}\r\n\r\n.tc2-futureCard h3{\r\n  position:relative;\r\n  z-index:2;\r\n  margin:0;\r\n  font-size:clamp(1.7rem,4vw,2.5rem);\r\n  line-height:.95;\r\n  text-transform:uppercase;\r\n  font-weight:900;\r\n  letter-spacing:-.04em;\r\n}\r\n\r\n.tc2-futureCard p{\r\n  position:relative;\r\n  z-index:2;\r\n  margin:14px 0 0;\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.65;\r\n  font-size:.96rem;\r\n}\r\n\r\n.tc2-futureCard.is-locked{\r\n  filter:saturate(.82) brightness(.82);\r\n}\r\n\r\n.tc2-futureCard.is-locked .tc2-orb{\r\n  opacity:.72;\r\n}\r\n\r\n.tc2-futureCard.astro .tc2-orb{box-shadow:0 0 26px rgba(244,210,122,.65);}\r\n.tc2-futureCard.brain .tc2-orb{box-shadow:0 0 26px rgba(139,92,246,.75);}\r\n.tc2-futureCard.evolution .tc2-orb{box-shadow:0 0 30px rgba(207,86,255,.75);}\r\n\r\n@media (min-width:980px){\r\n  .tc2-futureGrid{\r\n    grid-template-columns:repeat(3,minmax(0,1fr)) !important;\r\n  }\r\n}\r\n\r\n@media (min-width:1350px){\r\n  .tc2-futureGrid{\r\n    grid-template-columns:repeat(3,minmax(0,1fr)) !important;\r\n  }\r\n}\r\n\r\n@keyframes tc2EnergySpin{\r\n  to{transform:rotate(360deg);}\r\n}\r\n\r\n@keyframes tc2ScanCard{\r\n  0%,55%{transform:translateX(-120%);}\r\n  100%{transform:translateX(120%);}\r\n}\r\n.tc2-grid{display:grid;gap:18px;}\r\n.tc2-mainGrid{grid-template-columns:1fr;}\r\n.tc2-mainCard{\r\n  position:relative;\r\n  overflow:hidden;\r\n  min-height:240px;\r\n  padding:24px;\r\n  border:none;\r\n  border-radius:30px;\r\n  text-align:left;\r\n  color:#fff;\r\n  cursor:pointer;\r\n  background:linear-gradient(180deg, rgba(10,15,30,.95), rgba(5,8,18,.98));\r\n  transition:transform .22s ease, box-shadow .22s ease;\r\n}\r\n.tc2-mainCard:hover{transform:translateY(-4px);}\r\n.tc2-mainCard::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  border-radius:inherit;\r\n  pointer-events:none;\r\n  box-shadow:inset 0 0 0 2px rgba(83,243,255,.24),0 0 26px rgba(83,243,255,.08);\r\n}\r\n.tc2-mainCard.explore::after{box-shadow:inset 0 0 0 2px rgba(244,210,122,.48),0 0 28px rgba(244,210,122,.12);}\r\n.tc2-mainCard.journey::after{box-shadow:inset 0 0 0 2px rgba(83,243,255,.44),0 0 26px rgba(83,243,255,.10);}\r\n.tc2-mainCard.services::after{box-shadow:inset 0 0 0 2px rgba(112,247,162,.38),0 0 26px rgba(112,247,162,.10);}\r\n.tc2-mainCard.story::after{box-shadow:inset 0 0 0 2px rgba(139,92,246,.46),0 0 26px rgba(139,92,246,.12);}\r\n.tc2-mainMedia{\r\n  height:135px;\r\n  border-radius:22px;\r\n  margin-bottom:16px;\r\n  background:#111 center center \/ cover no-repeat;\r\n  position:relative;\r\n}\r\n.tc2-mainMedia::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  border-radius:inherit;\r\n  background:linear-gradient(180deg, transparent, rgba(0,0,0,.35));\r\n}\r\n.tc2-mainKicker{\r\n  display:block;\r\n  font-size:.76rem;\r\n  letter-spacing:.18em;\r\n  text-transform:uppercase;\r\n  color:#e9f3ff;\r\n  opacity:.82;\r\n  font-weight:800;\r\n}\r\n.tc2-mainTitle{\r\n  display:block;\r\n  margin-top:10px;\r\n  font-size:clamp(1.8rem,6vw,3rem);\r\n  line-height:.95;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n.tc2-mainCopy{\r\n  display:block;\r\n  margin-top:12px;\r\n  color:var(--tc-soft);\r\n  line-height:1.75;\r\n  font-size:.96rem;\r\n}\r\n.tc2-brainStrip{\r\n  margin-top:18px;\r\n  padding:18px;\r\n  display:grid;\r\n  gap:12px;\r\n  grid-template-columns:1fr;\r\n}\r\n.tc2-brainTitle{\r\n  font-size:.78rem;\r\n  letter-spacing:.17em;\r\n  text-transform:uppercase;\r\n  color:#fff0c4;\r\n  font-weight:900;\r\n}\r\n.tc2-brainText{color:var(--tc-soft);line-height:1.7;margin:0;}\r\n.tc2-infoBar{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:12px;\r\n  margin-top:18px;\r\n  padding:18px;\r\n}\r\n.tc2-infoCell{\r\n  padding:14px;\r\n  border-radius:22px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.08);\r\n}\r\n.tc2-infoLabel{\r\n  font-size:.72rem;\r\n  letter-spacing:.15em;\r\n  text-transform:uppercase;\r\n  color:var(--tc-soft2);\r\n  font-weight:800;\r\n}\r\n.tc2-infoValue{margin-top:8px;font-size:1.05rem;font-weight:900;color:#fff;}\r\n\r\n\/* COMMON SECTIONS *\/\r\n.tc2-section{margin-top:22px;padding:22px;}\r\n.tc2-sectionTitle{\r\n  margin:0;\r\n  font-size:clamp(2rem,6vw,3.6rem);\r\n  line-height:.94;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n  letter-spacing:-.03em;\r\n}\r\n.tc2-sectionCopy{margin-top:10px;color:var(--tc-soft);line-height:1.8;}\r\n.tc2-chipRow{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px;}\r\n.tc2-chip{\r\n  min-height:38px;\r\n  padding:0 14px;\r\n  border-radius:999px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  background:rgba(255,255,255,.05);\r\n  border:1px solid rgba(255,255,255,.10);\r\n  color:#dceaff;\r\n  font-size:.72rem;\r\n  font-weight:800;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\/* GUIDE \/ EXPLORE *\/\r\n.tc2-guideGrid,\r\n.tc2-servicesGrid,\r\n.tc2-storyGrid{\r\n  display:grid;\r\n  gap:16px;\r\n  grid-template-columns:1fr;\r\n  margin-top:18px;\r\n}\r\n.tc2-guideCard,\r\n.tc2-serviceCard,\r\n.tc2-storyCard{\r\n  border:none;\r\n  border-radius:28px;\r\n  overflow:hidden;\r\n  background:linear-gradient(180deg, rgba(10,15,30,.96), rgba(5,8,18,.99));\r\n  color:#fff;\r\n  text-align:left;\r\n  cursor:pointer;\r\n  padding:0;\r\n  position:relative;\r\n}\r\n.tc2-guideCard::after,\r\n.tc2-serviceCard::after,\r\n.tc2-storyCard::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  border-radius:inherit;\r\n  pointer-events:none;\r\n  box-shadow:inset 0 0 0 2px rgba(83,243,255,.18);\r\n}\r\n.tc2-guideCard:hover::after{box-shadow:inset 0 0 0 2px rgba(244,210,122,.44),0 0 22px rgba(244,210,122,.12);}\r\n.tc2-cardMedia{\r\n  height:160px;\r\n  background:#111 center center \/ cover no-repeat;\r\n}\r\n.tc2-cardBody{padding:18px;}\r\n.tc2-cardType{\r\n  font-size:.74rem;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n  color:#fff0c4;\r\n  font-weight:800;\r\n}\r\n.tc2-cardTitle{\r\n  margin-top:8px;\r\n  font-size:1.5rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n.tc2-cardDesc{margin-top:10px;color:var(--tc-soft);line-height:1.7;}\r\n.tc2-subList{display:grid;gap:10px;margin-top:14px;}\r\n.tc2-subItem{\r\n  min-height:46px;\r\n  border-radius:18px;\r\n  padding:0 16px;\r\n  display:flex;\r\n  align-items:center;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.08);\r\n  font-weight:800;\r\n  letter-spacing:.04em;\r\n}\r\n\r\n\/* JOURNEY \/ PLAN *\/\r\n.tc2-planTop{display:grid;gap:18px;grid-template-columns:1fr;}\r\n.tc2-summaryBar{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr));}\r\n.tc2-summaryCard{\r\n  padding:16px;\r\n  border-radius:24px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.08);\r\n}\r\n.tc2-summaryNum{font-size:1.8rem;font-weight:900;}\r\n.tc2-summaryLabel{margin-top:8px;font-size:.76rem;color:var(--tc-soft2);letter-spacing:.14em;text-transform:uppercase;}\r\n.tc2-planCards{display:grid;gap:16px;margin-top:18px;}\r\n.tc2-expCard{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:14px;\r\n  padding:16px;\r\n  border-radius:28px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.08);\r\n}\r\n.tc2-expMedia{height:190px;border-radius:22px;background:#111 center center \/ cover no-repeat;}\r\n.tc2-expTitle{margin:0;font-size:1.45rem;font-weight:900;text-transform:uppercase;}\r\n.tc2-expMeta{margin-top:8px;color:var(--tc-soft);line-height:1.7;}\r\n.tc2-btnRow{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px;}\r\n.tc2-btn{\r\n  min-height:48px;\r\n  padding:0 18px;\r\n  border:none;\r\n  border-radius:999px;\r\n  cursor:pointer;\r\n  font-size:.76rem;\r\n  font-weight:800;\r\n  letter-spacing:.15em;\r\n  text-transform:uppercase;\r\n}\r\n.tc2-btn-gold{background:linear-gradient(135deg, var(--tc-gold), var(--tc-gold2));color:#111;}\r\n.tc2-btn-cyan{background:linear-gradient(135deg, var(--tc-cyan), var(--tc-cyan2));color:#041119;}\r\n.tc2-btn-violet{background:linear-gradient(135deg, var(--tc-violet), var(--tc-magenta));color:#fff;}\r\n.tc2-btn-outline{background:rgba(255,255,255,.04);color:#fff;border:1px solid rgba(255,255,255,.12);}\r\n.tc2-btn-danger{background:rgba(255,107,138,.12);color:#fff;border:1px solid rgba(255,107,138,.26);}\r\n\r\n\/* LOCAL SERVICES *\/\r\n.tc2-serviceControls{display:grid;gap:18px;grid-template-columns:1fr;margin-top:18px;}\r\n.tc2-formGrid{display:grid;gap:12px;grid-template-columns:1fr;margin-top:18px;}\r\n.tc2-field{display:flex;flex-direction:column;gap:8px;}\r\n.tc2-label{font-size:.74rem;letter-spacing:.15em;text-transform:uppercase;color:#eaf4ff;font-weight:800;}\r\n.tc2-input,.tc2-select,.tc2-textarea{\r\n  width:100%;\r\n  min-height:50px;\r\n  border-radius:18px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  background:rgba(255,255,255,.04);\r\n  color:#fff;\r\n  padding:0 14px;\r\n  outline:none;\r\n}\r\n.tc2-select option{color:#111;}\r\n.tc2-textarea{min-height:110px;padding:14px;resize:vertical;}\r\n\r\n\/* FLOATING NAV *\/\r\n.tc2-floating{\r\n  position:fixed;\r\n  right:12px;\r\n  bottom:12px;\r\n  z-index:50;\r\n  display:flex;\r\n  gap:8px;\r\n  flex-wrap:wrap;\r\n  justify-content:flex-end;\r\n  max-width:92vw;\r\n}\r\n.tc2-float{\r\n  min-height:44px;\r\n  padding:0 13px;\r\n  border:none;\r\n  border-radius:999px;\r\n  background:rgba(8,13,28,.88);\r\n  border:1px solid rgba(255,255,255,.10);\r\n  color:#fff;\r\n  font-size:.68rem;\r\n  font-weight:800;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n  cursor:pointer;\r\n}\r\n\r\n\/* MODAL *\/\r\n.tc2-modal{\r\n  position:fixed;\r\n  inset:0;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:18px;\r\n  background:rgba(0,0,0,.62);\r\n  z-index:80;\r\n}\r\n.tc2-modal.open{display:flex;}\r\n.tc2-modalCard{width:min(94vw,620px);padding:22px;}\r\n\r\n@media (min-width: 980px){\r\n  .tc2-shell{padding:24px 28px 96px;}\r\n  .tc2-mainGrid{grid-template-columns:repeat(4,minmax(0,1fr));}\r\n  .tc2-brainStrip{grid-template-columns:.35fr 1fr;}\r\n  .tc2-planTop{grid-template-columns:1.08fr .92fr;}\r\n  .tc2-summaryBar{grid-template-columns:repeat(4,minmax(0,1fr));}\r\n  .tc2-expCard{grid-template-columns:290px 1fr;}\r\n  .tc2-guideGrid{grid-template-columns:repeat(4,minmax(0,1fr));}\r\n  .tc2-servicesGrid{grid-template-columns:repeat(3,minmax(0,1fr));}\r\n  .tc2-storyGrid{grid-template-columns:repeat(3,minmax(0,1fr));}\r\n  .tc2-serviceControls{grid-template-columns:1.05fr .95fr;}\r\n  .tc2-formGrid.two{grid-template-columns:repeat(2,minmax(0,1fr));}\r\n  .tc2-infoBar{grid-template-columns:repeat(4,minmax(0,1fr));}\r\n}\r\n@media (max-width: 760px){\r\n  .tc2-btnRow{flex-direction:column;}\r\n  .tc2-floating{right:10px;bottom:10px;gap:7px;}\r\n  .tc2-float{min-height:42px;padding:0 11px;font-size:.62rem;}\r\n  .tc2-logoWrap{margin-top:-100px;}\r\n}\r\n@keyframes tc2Fade{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}\r\n@keyframes tc2Wheel{0%{opacity:0;transform:translate(-50%,0);}30%{opacity:1;}100%{opacity:0;transform:translate(-50%,14px);}}\r\n@keyframes tc2Star{from{transform:translateY(0);}to{transform:translateY(24px);}}\r\n\r\n@media(max-width:620px){\r\n\r\n  .blissBeam,\r\n  .blissHoloViewer,\r\n  .blissProjectorDeck,\r\n  .blissProjectorCore,\r\n  .blissActivate{\r\n    left:45% !important;\r\n  }\r\n\r\n}\r\n<\/style>\r\n\r\n<style>\r\n#tc2JourneyPage{\r\n  --mj-cyan:#38e8ff;\r\n  --mj-violet:#8b5cf6;\r\n  --mj-green:#34d399;\r\n  --mj-yellow:#f7c948;\r\n  --mj-panel:rgba(5,10,24,.94);\r\n}\r\n\r\n.tc2-mj-shell{display:grid;gap:18px;padding-bottom:100px}\r\n\r\n\r\n.tc2-mj-title{\r\n  margin:8px 0 12px;\r\n  font-size:clamp(2.5rem,8vw,5.8rem);\r\n  line-height:.94;\r\n  letter-spacing:-.055em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-mj-subtitle{\r\n  max-width:720px;\r\n  margin:0;\r\n  color:rgba(241,247,255,.72);\r\n  line-height:1.75;\r\n}\r\n\r\n.tc2-mj-destination{\r\n  display:flex;\r\n  flex-direction:column;\r\n  justify-content:center;\r\n  gap:8px;\r\n  padding:22px;\r\n  border:1px solid rgba(255,255,255,.09);\r\n  border-radius:26px;\r\n  background:rgba(255,255,255,.035);\r\n}\r\n\r\n.tc2-mj-destination span{\r\n  color:rgba(255,255,255,.48);\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.15em;\r\n}\r\n\r\n.tc2-mj-destination strong{font-size:clamp(1.5rem,4vw,2.5rem)}\r\n.tc2-mj-destination small{color:rgba(255,255,255,.62);line-height:1.5}\r\n\r\n.tc2-mj-summary{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:12px;\r\n}\r\n\r\n.tc2-mj-summary article{\r\n  min-width:0;\r\n  padding:18px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:22px;\r\n  background:linear-gradient(180deg,rgba(15,25,53,.92),rgba(6,10,24,.95));\r\n}\r\n\r\n.tc2-mj-summary span{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:rgba(255,255,255,.45);\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-mj-summary strong{\r\n  display:block;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n}\r\n\r\n.tc2-mj-readiness{\r\n  padding:22px;\r\n  border:1px solid rgba(52,211,153,.16);\r\n  border-radius:28px;\r\n  background:radial-gradient(circle at 100% 0%,rgba(52,211,153,.10),transparent 32%),rgba(5,12,26,.92);\r\n}\r\n\r\n.tc2-mj-readinessTop{\r\n  display:flex;\r\n  align-items:flex-end;\r\n  justify-content:space-between;\r\n  gap:20px;\r\n}\r\n\r\n.tc2-mj-readinessTop strong{\r\n  display:block;\r\n  margin-top:4px;\r\n  font-size:clamp(2rem,5vw,3.3rem);\r\n}\r\n\r\n.tc2-mj-readinessTop p{\r\n  max-width:520px;\r\n  margin:0;\r\n  color:rgba(255,255,255,.64);\r\n  line-height:1.6;\r\n  text-align:right;\r\n}\r\n\r\n.tc2-mj-track{\r\n  height:10px;\r\n  margin:18px 0;\r\n  overflow:hidden;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.045);\r\n}\r\n\r\n.tc2-mj-bar{\r\n  width:0;\r\n  height:100%;\r\n  border-radius:inherit;\r\n  background:linear-gradient(90deg,#2563eb,var(--mj-cyan),var(--mj-green));\r\n  box-shadow:0 0 26px rgba(56,232,255,.48);\r\n  transition:width .55s ease;\r\n}\r\n\r\n.tc2-mj-checklist{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:9px;\r\n}\r\n\r\n.tc2-mj-check{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:9px;\r\n  padding:10px 12px;\r\n  border:1px solid rgba(255,255,255,.07);\r\n  border-radius:14px;\r\n  background:rgba(255,255,255,.025);\r\n  color:rgba(255,255,255,.52);\r\n  font-size:.78rem;\r\n  font-weight:800;\r\n}\r\n\r\n.tc2-mj-check:before{\r\n  content:\"\";\r\n  width:8px;\r\n  height:8px;\r\n  border:1px solid rgba(255,255,255,.32);\r\n  border-radius:50%;\r\n}\r\n\r\n.tc2-mj-check.is-ready{\r\n  border-color:rgba(52,211,153,.18);\r\n  color:#dffdf3;\r\n  background:rgba(52,211,153,.07);\r\n}\r\n\r\n.tc2-mj-check.is-ready:before{\r\n  border-color:var(--mj-green);\r\n  background:var(--mj-green);\r\n  box-shadow:0 0 14px rgba(52,211,153,.7);\r\n}\r\n\r\n.tc2-mj-command{\r\n  display:grid;\r\n  grid-template-columns:245px minmax(0,1fr);\r\n  gap:15px;\r\n  min-height:590px;\r\n}\r\n\r\n.tc2-mj-sidebar{\r\n  position:sticky;\r\n  top:18px;\r\n  align-self:start;\r\n  display:grid;\r\n  gap:7px;\r\n  padding:12px;\r\n  border:1px solid rgba(132,224,255,.16);\r\n  border-radius:28px;\r\n  background:rgba(4,9,21,.94);\r\n}\r\n\r\n.tc2-mj-nav{\r\n  display:grid;\r\n  grid-template-columns:32px minmax(0,1fr) auto;\r\n  align-items:center;\r\n  gap:8px;\r\n  width:100%;\r\n  padding:13px 12px;\r\n  border:1px solid transparent;\r\n  border-radius:16px;\r\n  background:transparent;\r\n  color:rgba(255,255,255,.62);\r\n  font:inherit;\r\n  font-size:.79rem;\r\n  font-weight:800;\r\n  text-align:left;\r\n  cursor:pointer;\r\n}\r\n\r\n.tc2-mj-nav span{color:rgba(56,232,255,.42);font-size:.65rem}\r\n.tc2-mj-nav b{\r\n  min-width:24px;\r\n  padding:3px 6px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.06);\r\n  color:rgba(255,255,255,.54);\r\n  font-size:.66rem;\r\n  text-align:center;\r\n}\r\n\r\n.tc2-mj-nav:hover,.tc2-mj-nav.is-active{\r\n  border-color:rgba(56,232,255,.20);\r\n  background:linear-gradient(90deg,rgba(37,99,235,.18),rgba(56,232,255,.07));\r\n  color:#fff;\r\n}\r\n\r\n.tc2-mj-nav.is-active{box-shadow:inset 3px 0 0 var(--mj-cyan)}\r\n\r\n.tc2-mj-workspace{\r\n  min-width:0;\r\n  padding:18px;\r\n  border:1px solid rgba(132,224,255,.16);\r\n  border-radius:30px;\r\n  background:radial-gradient(circle at 95% 0%,rgba(37,99,235,.10),transparent 30%),rgba(4,9,21,.90);\r\n}\r\n\r\n.tc2-mj-workspaceTop{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:15px;\r\n  margin-bottom:18px;\r\n  padding:4px 4px 14px;\r\n  border-bottom:1px solid rgba(255,255,255,.07);\r\n}\r\n\r\n.tc2-mj-workspaceTop h3{margin:5px 0 0;font-size:clamp(1.35rem,3vw,2rem)}\r\n.tc2-mj-mobileNav{\r\n  display:none;\r\n  padding:10px 14px;\r\n  border:1px solid rgba(56,232,255,.25);\r\n  border-radius:999px;\r\n  background:rgba(56,232,255,.08);\r\n  color:#fff;\r\n  font:inherit;\r\n  font-size:.78rem;\r\n  font-weight:900;\r\n}\r\n\r\n.tc2-mj-content,.tc2-mj-list{display:grid;gap:14px}\r\n\r\n.tc2-mj-dashboard{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:13px;\r\n}\r\n\r\n.tc2-mj-dashCard{\r\n  position:relative;\r\n  min-height:180px;\r\n  padding:20px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:24px;\r\n  background:radial-gradient(circle at 100% 0%,rgba(56,232,255,.10),transparent 36%),linear-gradient(145deg,rgba(14,23,49,.94),rgba(5,9,22,.98));\r\n  color:#fff;\r\n  text-align:left;\r\n  cursor:pointer;\r\n}\r\n\r\n.tc2-mj-dashCard:hover{border-color:rgba(56,232,255,.25);transform:translateY(-3px)}\r\n.tc2-mj-dashCard h4{margin:30px 0 7px;font-size:1.25rem}\r\n.tc2-mj-dashCard p{margin:0;color:rgba(255,255,255,.54);line-height:1.55}\r\n.tc2-mj-dashIndex{color:rgba(56,232,255,.52);font-size:.65rem;font-weight:900}\r\n.tc2-mj-dashCount{position:absolute;top:16px;right:18px;font-size:2.5rem}\r\n\r\n.tc2-mj-item{\r\n  display:grid;\r\n  grid-template-columns:190px minmax(0,1fr);\r\n  overflow:hidden;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:24px;\r\n  background:linear-gradient(145deg,rgba(14,23,48,.94),rgba(5,9,21,.98));\r\n}\r\n\r\n.tc2-mj-itemMedia{min-height:220px;background-position:center;background-size:cover}\r\n.tc2-mj-itemBody{display:grid;align-content:center;gap:10px;min-width:0;padding:20px}\r\n.tc2-mj-itemTop{display:flex;align-items:center;justify-content:space-between;gap:12px}\r\n.tc2-mj-itemType{color:var(--mj-cyan);font-size:.68rem;font-weight:900;letter-spacing:.12em;text-transform:uppercase}\r\n.tc2-mj-itemTitle{margin:0;font-size:clamp(1.25rem,3vw,1.8rem)}\r\n.tc2-mj-itemMeta,.tc2-mj-itemDescription{color:rgba(255,255,255,.58);line-height:1.55}\r\n.tc2-mj-itemDescription{font-size:.88rem}\r\n\r\n.tc2-mj-status{\r\n  padding:6px 10px;\r\n  border:1px solid rgba(56,232,255,.20);\r\n  border-radius:999px;\r\n  background:rgba(56,232,255,.07);\r\n  color:#dffaff;\r\n  font-size:.65rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-mj-status[data-status*=\"request\"],\r\n.tc2-mj-status[data-status*=\"waiting\"]{\r\n  border-color:rgba(247,201,72,.24);\r\n  background:rgba(247,201,72,.09);\r\n  color:#fff1b8;\r\n}\r\n\r\n.tc2-mj-status[data-status*=\"confirm\"]{\r\n  border-color:rgba(52,211,153,.24);\r\n  background:rgba(52,211,153,.09);\r\n  color:#dffdf3;\r\n}\r\n\r\n.tc2-mj-empty{\r\n  display:grid;\r\n  place-items:center;\r\n  min-height:340px;\r\n  padding:35px;\r\n  border:1px dashed rgba(56,232,255,.18);\r\n  border-radius:26px;\r\n  background:rgba(56,232,255,.025);\r\n  text-align:center;\r\n}\r\n\r\n.tc2-mj-emptyInner{max-width:510px}\r\n.tc2-mj-empty h4{margin:7px 0 10px;font-size:1.55rem}\r\n.tc2-mj-empty p{margin:0 0 20px;color:rgba(255,255,255,.58);line-height:1.65}\r\n\r\n.tc2-mj-reservations{display:grid;gap:12px}\r\n.tc2-mj-reservation{\r\n  display:grid;\r\n  grid-template-columns:13px minmax(0,1fr) auto;\r\n  align-items:center;\r\n  gap:14px;\r\n  padding:16px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:18px;\r\n  background:rgba(255,255,255,.025);\r\n}\r\n\r\n.tc2-mj-dot{\r\n  width:10px;\r\n  height:10px;\r\n  border-radius:50%;\r\n  background:var(--mj-cyan);\r\n  box-shadow:0 0 16px rgba(56,232,255,.7);\r\n}\r\n\r\n.tc2-mj-reservation span{display:block;margin-top:4px;color:rgba(255,255,255,.48);font-size:.75rem}\r\n\r\n.tc2-mj-concierge{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.2fr) minmax(220px,.8fr);\r\n  gap:15px;\r\n}\r\n\r\n.tc2-mj-conciergeCard{\r\n  padding:24px;\r\n  border:1px solid rgba(139,92,246,.20);\r\n  border-radius:25px;\r\n  background:radial-gradient(circle at 0 0,rgba(139,92,246,.16),transparent 36%),rgba(255,255,255,.025);\r\n}\r\n\r\n.tc2-mj-conciergeCard h4{margin:7px 0 9px;font-size:1.45rem}\r\n.tc2-mj-conciergeCard p{color:rgba(255,255,255,.58);line-height:1.65}\r\n\r\n.tc2-mj-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  justify-content:center;\r\n  gap:10px;\r\n  padding:18px;\r\n  border:1px solid rgba(255,255,255,.07);\r\n  border-radius:24px;\r\n  background:rgba(4,9,21,.88);\r\n}\r\n\r\n@media(max-width:900px){\r\n  .tc2-mj-hero{grid-template-columns:1fr}\r\n  .tc2-mj-summary{grid-template-columns:repeat(2,minmax(0,1fr))}\r\n  .tc2-mj-command{grid-template-columns:1fr}\r\n  .tc2-mj-sidebar{position:static;display:none;grid-template-columns:repeat(2,minmax(0,1fr))}\r\n  .tc2-mj-sidebar.is-open{display:grid}\r\n  .tc2-mj-mobileNav{display:inline-flex}\r\n}\r\n\r\n@media(max-width:620px){\r\n  .tc2-mj-hero{padding:22px;border-radius:25px}\r\n  .tc2-mj-summary,.tc2-mj-dashboard,.tc2-mj-concierge,.tc2-mj-checklist{grid-template-columns:1fr}\r\n  .tc2-mj-readinessTop{align-items:flex-start;flex-direction:column}\r\n  .tc2-mj-readinessTop p{text-align:left}\r\n  .tc2-mj-sidebar{grid-template-columns:1fr}\r\n  .tc2-mj-item{grid-template-columns:1fr}\r\n  .tc2-mj-itemMedia{min-height:190px}\r\n  .tc2-mj-itemTop{align-items:flex-start;flex-direction:column}\r\n  .tc2-mj-reservation{grid-template-columns:12px minmax(0,1fr)}\r\n}\r\n<\/style>\r\n\r\n\r\n<div id=\"tc2Overlay\" aria-hidden=\"true\">\r\n  <div class=\"tc2-wrap\">\r\n\r\n    <div class=\"tc2-floating\">\r\n      <button id=\"tc2FloatExplore\" class=\"tc2-float\" type=\"button\">Explore<\/button>\r\n      <button id=\"tc2FloatJourney\" class=\"tc2-float\" type=\"button\">Journey<\/button>\r\n      <button id=\"tc2FloatServices\" class=\"tc2-float\" type=\"button\">Services<\/button>\r\n      <button id=\"tc2FloatStory\" class=\"tc2-float\" type=\"button\">Story<\/button>\r\n    <\/div>\r\n\r\n    <button id=\"tc2BackBtn\" class=\"tc2-backSolo\" type=\"button\">\u2190<\/button>\r\n    <button id=\"tc2MenuBtn\" class=\"tc2-menuBtn\" type=\"button\">\u2630<\/button>\r\n\r\n    <div id=\"tc2MenuPanel\" class=\"tc2-menuPanel\" aria-hidden=\"true\">\r\n      <div class=\"tc2-menuSection\">\r\n        <h3 class=\"tc2-menuTitle\">Travel Club<\/h3>\r\n        <p class=\"tc2-menuText\">\r\n          A private membership to discover, plan, experience, and remember destinations.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"tc2-menuSection\">\r\n        <div class=\"tc2-menuList\">\r\n          <button class=\"tc2-menuLink\" data-tc2=\"club\">The Club<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"brain\">Travel Brain<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"scope\">Service Scope<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"disclosures\">Disclosures<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"terms\">Terms<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"privacy\">Privacy<\/button>\r\n          <button class=\"tc2-menuLink\" data-tc2=\"contact\">Contact<\/button>\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-club\" class=\"tc2-legalBlock\">\r\n          The Travel Club helps members explore Medell\u00edn, build a journey, request local services, and preserve memories over time.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-brain\" class=\"tc2-legalBlock\">\r\n          Travel Brain is the invisible personalization layer. It quietly learns preferences like luxury, family travel, nature, local culture, and food so recommendations feel smarter.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-scope\" class=\"tc2-legalBlock\">\r\n          This platform coordinates requests with independent local providers including accommodations, drivers, concierge, translators, reservations, guides, and experiences.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-disclosures\" class=\"tc2-legalBlock\">\r\n          All services are provided by independent providers. Requests are not confirmed until manually approved.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-terms\" class=\"tc2-legalBlock\">\r\n          Use of this platform does not guarantee availability. All services are subject to confirmation and governed by applicable local terms.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-privacy\" class=\"tc2-legalBlock\">\r\n          Personal data is collected only for coordination and personalization purposes and is not distributed externally.\r\n        <\/div>\r\n\r\n        <div id=\"tc2Block-contact\" class=\"tc2-legalBlock\">\r\n          Medell\u00edn, Colombia<br>\r\n          Email: edwardraigozallc@gmail.com<br>\r\n          WhatsApp: +57 314 762 9693\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- HOME -->\r\n    <section id=\"tc2HomePage\" class=\"tc2-page active\">\r\n      <section class=\"tc2-hero\">\r\n        <div class=\"tc2-hero-sticky\">\r\n          <div class=\"tc2-hero-bg\"><\/div>\r\n          <div id=\"tc2Stars\" class=\"tc2-stars\"><\/div>\r\n\r\n          <div class=\"tc2-hero-inner\">\r\n            <div class=\"tc2-logoWrap\">\r\n              <div class=\"tc2-logoAura\"><\/div>\r\n              <div class=\"tc2-logoRing\"><\/div>\r\n              <div class=\"tc2-logo\">\r\n                <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/06\/380d6238-b6c2-46c7-bdb5-5beae349a1bf.png\" alt=\"Travel Club Logo\">\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-hero-copy\">\r\n              <div class=\"tc2-medayork\">\r\n  MEDAYORK\r\n<\/div>\r\n\r\n<h1 class=\"tc2-title\">\r\n  BLISS\r\n<\/h1>\r\n\r\n<p class=\"tc2-sub\">\r\n  TRAVEL CLUB\r\n<\/p>\r\n\r\n<p class=\"tc2-description\">\r\n  Your membership to destinations, experiences, local services, and unforgettable journeys.\r\n<\/p>\r\n              <div class=\"tc2-scroll\">\r\n                <div class=\"tc2-wheel\"><\/div>\r\n                Scroll to Enter\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <div class=\"tc2-shell tc2-mainReveal\">\r\n        <div class=\"tc2-grid tc2-mainGrid tc2-futureGrid\">\r\n\r\n  <button id=\"tc2MainAstro\" class=\"tc2-futureCard astro is-on\" type=\"button\">\r\n    <div class=\"tc2-status\">FREE \u00b7 ONLINE<\/div>\r\n    <div class=\"tc2-orb\">\u2648<\/div>\r\n    <h3>Astro Travel Recommendations<\/h3>\r\n    <p>Choose your sign and unlock free recommendations for accommodations, restaurants, entertainment, and VIP.<\/p>\r\n  <\/button>\r\n\r\n  <button id=\"tc2MainExplore\" class=\"tc2-futureCard explore is-on\" type=\"button\">\r\n    <div class=\"tc2-status\">CITY GUIDE<\/div>\r\n    <div class=\"tc2-orb\">\ud83c\udf0d<\/div>\r\n    <h3>Explore Medell\u00edn<\/h3>\r\n    <p>First Time Visitor, Food Guide, Apps, Know Locals, Shop, Respect Nature, Conservation, and premium guides.<\/p>\r\n  <\/button>\r\n\r\n  <button id=\"tc2MainBrain\" class=\"tc2-futureCard brain is-on\" type=\"button\">\r\n    <div class=\"tc2-status\">PROFILE ENGINE<\/div>\r\n    <div class=\"tc2-orb\">\ud83e\udde0<\/div>\r\n    <h3>Travel Intelligence<\/h3>\r\n    <p>Build your travel profile so Bliss can personalize the whole Travel Club around how you travel.<\/p>\r\n  <\/button>\r\n\r\n  <button id=\"tc2MainJourney\" class=\"tc2-futureCard journey is-on\" type=\"button\">\r\n    <div class=\"tc2-status\">MISSION CONTROL<\/div>\r\n    <div class=\"tc2-orb\">\ud83d\uddfa\ufe0f<\/div>\r\n    <h3>My Journey<\/h3>\r\n    <p>Your saved hosts, favorites, services, reservations, notes, photos, and trip status in one place.<\/p>\r\n  <\/button>\r\n\r\n  <button id=\"tc2MainServices\" class=\"tc2-futureCard services is-on\" type=\"button\">\r\n    <div class=\"tc2-status\">LOCAL SUPPORT<\/div>\r\n    <div class=\"tc2-orb\">\ud83d\udece\ufe0f<\/div>\r\n    <h3>Local Services<\/h3>\r\n    <p>Drivers, concierge, translators, guides, nightlife help, reservations, security, and VIP support.<\/p>\r\n  <\/button>\r\n\r\n<button id=\"tc2MainStory\" class=\"tc2-futureCard story is-on\" type=\"button\">\r\n  <div class=\"tc2-status\">MEMORY ARCHIVE<\/div>\r\n  <div class=\"tc2-orb\">\ud83c\udfa5<\/div>\r\n  <h3>My Travel Story<\/h3>\r\n  <p>Your photos, videos, favorite restaurant, favorite experience, favorite guide, and personal notes.<\/p>\r\n<\/button>\r\n\r\n  <button id=\"tc2MainEvolution\" class=\"tc2-futureCard evolution is-locked\" type=\"button\">\r\n    <div class=\"tc2-status\">LEVEL 4 \ud83d\udd12<\/div>\r\n    <div class=\"tc2-orb\">\u2728<\/div>\r\n    <h3>Personal Evolution<\/h3>\r\n    <p>Go Beyond the Destination. Insight, Entrepreneurship, Cosmic, Give Back, Conferences, Gastronomic, and Relationships.<\/p>\r\n  <\/button>\r\n\r\n<\/div>\r\n\r\n        <div class=\"tc2-glass tc2-brainStrip\">\r\n          <div class=\"tc2-brainTitle\">\ud83e\udde0 Travel Brain<\/div>\r\n          <p class=\"tc2-brainText\">\r\n            Invisible engine active. It quietly adapts recommendations for members who love luxury, travel with family, enjoy nature, local culture, and great food.\r\n          <\/p>\r\n        <\/div>\r\n\r\n        <div class=\"tc2-glass tc2-infoBar\">\r\n          <div class=\"tc2-infoCell\">\r\n            <div class=\"tc2-infoLabel\">Current Destination<\/div>\r\n            <div id=\"tc2CurrentDestination\" class=\"tc2-infoValue\">MedaYork \u00b7 Medell\u00edn<\/div>\r\n          <\/div>\r\n          <div class=\"tc2-infoCell\">\r\n            <div class=\"tc2-infoLabel\">Next Experience<\/div>\r\n            <div id=\"tc2NextExperience\" class=\"tc2-infoValue\">Waiting for selection<\/div>\r\n          <\/div>\r\n          <div class=\"tc2-infoCell\">\r\n            <div class=\"tc2-infoLabel\">Travelers<\/div>\r\n            <div id=\"tc2Travelers\" class=\"tc2-infoValue\">2 Adults<\/div>\r\n          <\/div>\r\n          <div class=\"tc2-infoCell\">\r\n            <div class=\"tc2-infoLabel\">Level \/ Status<\/div>\r\n            <div id=\"tc2LevelStatus\" class=\"tc2-infoValue\">Private Member \u00b7 Pending<\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n<!-- ASTRO TRAVEL RECOMMENDATIONS -->\r\n<section id=\"tc2AstroPage\" class=\"tc2-page\">\r\n  <div class=\"tc2-shell\">\r\n    <div class=\"tc2-glass tc2-section\">\r\n      <h2 class=\"tc2-sectionTitle\">Astro Travel Recommendations<\/h2>\r\n      <p class=\"tc2-sectionCopy\">\r\n        FREE \u00b7 Choose your zodiac sign, then choose your travel style.\r\n      <\/p>\r\n\r\n      <div id=\"astroWheel\" class=\"astro-wheel\"><\/div>\r\n\r\n      <div class=\"astro-selected\">\r\n        <h3 id=\"astroTitle\">Choose Your Sign<\/h3>\r\n        <div id=\"astroStyleGrid\" class=\"astro-styleGrid\"><\/div>\r\n        <div id=\"astroCategoryGrid\" class=\"astro-categoryGrid\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- TRAVEL INTELLIGENCE -->\r\n<section id=\"tc2BrainPage\" class=\"tc2-page\" aria-hidden=\"true\"><\/section>\r\n\r\n    <!-- EXPLORE -->\r\n    <section id=\"tc2ExplorePage\" class=\"tc2-page\">\r\n      <div class=\"tc2-shell\">\r\n        <div class=\"tc2-glass tc2-section\">\r\n          <h2 class=\"tc2-sectionTitle\">Explore Medell\u00edn<\/h2>\r\n          <p class=\"tc2-sectionCopy\">\r\n            The Medell\u00edn Guide is the soul of the Travel Club. Choose a guide path and Travel Brain will help shape the journey around the member's style.\r\n          <\/p>\r\n          <div id=\"tc2GuideGrid\" class=\"tc2-guideGrid\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n   <!-- JOURNEY -->\r\n<section id=\"tc2JourneyPage\" class=\"tc2-page\">\r\n  <div class=\"tc2-shell tc2-mj-shell\">\r\n\r\n    <header class=\"tc2-mj-hero\">\r\n      <div>\r\n        <div class=\"tc2-mj-kicker\">BLISS TRAVEL COMMAND CENTER<\/div>\r\n        <h2 class=\"tc2-mj-title\">My Journey<\/h2>\r\n        <p class=\"tc2-mj-subtitle\">\r\n          Everything Bliss is organizing for your trip, from saved discoveries\r\n          to reservation requests and confirmed experiences.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"tc2-mj-destination\">\r\n        <span>CURRENT DESTINATION<\/span>\r\n        <strong id=\"tc2StatDestination\">MedaYork<\/strong>\r\n        <small>Your Journey is being prepared.<\/small>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <section class=\"tc2-mj-summary\">\r\n      <article><span>Destination<\/span><strong id=\"tc2MjDestination\">MedaYork<\/strong><\/article>\r\n      <article><span>Travelers<\/span><strong id=\"tc2StatTravelers\">2<\/strong><\/article>\r\n      <article><span>Membership<\/span><strong id=\"tc2StatLevel\">Level 2<\/strong><\/article>\r\n      <article><span>Next Experience<\/span><strong id=\"tc2StatNext\">Waiting<\/strong><\/article>\r\n    <\/section>\r\n\r\n    <section class=\"tc2-mj-readiness\">\r\n      <div class=\"tc2-mj-readinessTop\">\r\n        <div>\r\n          <span class=\"tc2-mj-label\">TRIP READINESS<\/span>\r\n          <strong id=\"tc2MjReadinessPercent\">0%<\/strong>\r\n        <\/div>\r\n        <p id=\"tc2MjReadinessMessage\">\r\n          Start saving discoveries and Bliss will organize them here.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"tc2-mj-track\">\r\n        <div id=\"tc2MjProgressBar\" class=\"tc2-mj-bar\"><\/div>\r\n      <\/div>\r\n\r\n      <div id=\"tc2MjChecklist\" class=\"tc2-mj-checklist\"><\/div>\r\n    <\/section>\r\n\r\n    <div class=\"tc2-mj-command\">\r\n      <aside class=\"tc2-mj-sidebar\">\r\n        <button class=\"tc2-mj-nav is-active\" data-mj-view=\"dashboard\" type=\"button\"><span>01<\/span>Dashboard<\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"accommodations\" type=\"button\"><span>02<\/span>Accommodations<b data-mj-count=\"accommodations\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"restaurants\" type=\"button\"><span>03<\/span>Restaurants<b data-mj-count=\"restaurants\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"transportation\" type=\"button\"><span>04<\/span>Transportation<b data-mj-count=\"transportation\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"experiences\" type=\"button\"><span>05<\/span>Tours & Experiences<b data-mj-count=\"experiences\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"services\" type=\"button\"><span>06<\/span>Local Services<b data-mj-count=\"services\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"favorites\" type=\"button\"><span>07<\/span>Favorites<b data-mj-count=\"favorites\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"reservations\" type=\"button\"><span>08<\/span>Reservations<b data-mj-count=\"reservations\">0<\/b><\/button>\r\n        <button class=\"tc2-mj-nav\" data-mj-view=\"concierge\" type=\"button\"><span>09<\/span>Concierge<\/button>\r\n      <\/aside>\r\n\r\n      <main class=\"tc2-mj-workspace\">\r\n        <div class=\"tc2-mj-workspaceTop\">\r\n          <div>\r\n            <span class=\"tc2-mj-label\">ACTIVE VIEW<\/span>\r\n            <h3 id=\"tc2MjViewTitle\">Mission Dashboard<\/h3>\r\n          <\/div>\r\n          <button id=\"tc2MjMobileNav\" class=\"tc2-mj-mobileNav\" type=\"button\">Sections<\/button>\r\n        <\/div>\r\n\r\n        <div id=\"tc2PlanCards\" class=\"tc2-mj-content\"><\/div>\r\n      <\/main>\r\n    <\/div>\r\n\r\n    <section class=\"tc2-mj-actions\">\r\n      <button id=\"tc2SendPlanBtn\" class=\"tc2-btn tc2-btn-gold\" type=\"button\">Send Full Journey Request<\/button>\r\n      <button id=\"tc2SavePlanBtn\" class=\"tc2-btn tc2-btn-outline\" type=\"button\">Save Journey<\/button>\r\n      <button id=\"tc2OpenServicesFromPlan\" class=\"tc2-btn tc2-btn-violet\" type=\"button\">Open Local Services<\/button>\r\n    <\/section>\r\n\r\n  <\/div>\r\n<\/section>\r\n\r\n\r\n    <!-- LOCAL SERVICES -->\r\n    <section id=\"tc2ServicesPage\" class=\"tc2-page\">\r\n      <div class=\"tc2-shell\">\r\n        <div class=\"tc2-serviceControls\">\r\n          <div class=\"tc2-glass tc2-section\">\r\n            <h2 class=\"tc2-sectionTitle\">Local Services<\/h2>\r\n            <p class=\"tc2-sectionCopy\">\r\n              Request trusted local support for anything the member needs in the destination.\r\n            <\/p>\r\n\r\n            <div id=\"tc2ServicesGrid\" class=\"tc2-servicesGrid\"><\/div>\r\n\r\n            <div class=\"tc2-chipRow\">\r\n              <div id=\"tc2ServiceTypeChip\" class=\"tc2-chip\">No Service Selected<\/div>\r\n              <div id=\"tc2ServiceAttachChip\" class=\"tc2-chip\">Attach to My Journey<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-formGrid two\">\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Attach Service To<\/label>\r\n                <select id=\"tc2ServiceAttach\" class=\"tc2-select\">\r\n                  <option value=\"My Journey\">My Journey<\/option>\r\n                  <option value=\"Accommodation\">Accommodation<\/option>\r\n                  <option value=\"Explore Medell\u00edn\">Explore Medell\u00edn<\/option>\r\n                  <option value=\"Restaurant\">Restaurant<\/option>\r\n                  <option value=\"Nightlife\">Nightlife<\/option>\r\n                  <option value=\"VIP Route\">VIP Route<\/option>\r\n                  <option value=\"My Travel Story\">My Travel Story<\/option>\r\n                <\/select>\r\n              <\/div>\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Location \/ Pickup \/ Meeting Point<\/label>\r\n                <input id=\"tc2ServiceLocation\" class=\"tc2-input\" type=\"text\" placeholder=\"Hotel, airport, restaurant, neighborhood...\">\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-formGrid two\">\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Date<\/label>\r\n                <input id=\"tc2ServiceDate\" class=\"tc2-input\" type=\"date\">\r\n              <\/div>\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Time<\/label>\r\n                <input id=\"tc2ServiceTime\" class=\"tc2-input\" type=\"time\">\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-formGrid two\">\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Guests<\/label>\r\n                <select id=\"tc2ServiceGuests\" class=\"tc2-select\">\r\n                  <option value=\"1\">1<\/option>\r\n                  <option value=\"2\" selected>2<\/option>\r\n                  <option value=\"3\">3<\/option>\r\n                  <option value=\"4\">4<\/option>\r\n                  <option value=\"5+\">5+<\/option>\r\n                <\/select>\r\n              <\/div>\r\n              <div class=\"tc2-field\">\r\n                <label class=\"tc2-label\">Quick Notes<\/label>\r\n                <input id=\"tc2ServiceShortNotes\" class=\"tc2-input\" type=\"text\" placeholder=\"Language, luxury level, family needs, stops...\">\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-field\">\r\n              <label class=\"tc2-label\">Service Notes<\/label>\r\n              <textarea id=\"tc2ServiceNotes\" class=\"tc2-textarea\" placeholder=\"Explain the request, route, preferences, special requirements...\"><\/textarea>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-btnRow\">\r\n              <button id=\"tc2AddServiceBtn\" class=\"tc2-btn tc2-btn-gold\" type=\"button\">Add Service to My Journey<\/button>\r\n              <button id=\"tc2ServiceWhatsAppBtn\" class=\"tc2-btn tc2-btn-cyan\" type=\"button\">Send Service to WhatsApp<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"tc2-glass tc2-section\">\r\n            <h2 class=\"tc2-sectionTitle\" style=\"font-size:clamp(1.8rem,5vw,2.8rem)\">Service Preview<\/h2>\r\n            <p id=\"tc2ServicePreview\" class=\"tc2-sectionCopy\">\r\n              Choose a service type: driver, concierge, translator, reservations, security, nightlife help, guide, or VIP custom support.\r\n            <\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- MEMORIES \/ STORY -->\r\n    <section id=\"tc2StoryPage\" class=\"tc2-page\">\r\n      <div class=\"tc2-shell\">\r\n        <div class=\"tc2-glass tc2-section\">\r\n          <h2 class=\"tc2-sectionTitle\">My Travel Story<\/h2>\r\n          <p class=\"tc2-sectionCopy\">\r\n            Not just a journal. This is the emotional archive of each destination: photos, videos, favorite restaurants, favorite experiences, favorite guides, and personal notes.\r\n          <\/p>\r\n          <div id=\"tc2StoryGrid\" class=\"tc2-storyGrid\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <div id=\"tc2Modal\" class=\"tc2-modal\">\r\n      <div class=\"tc2-modalCard tc2-glass\">\r\n        <h3 id=\"tc2ModalTitle\" class=\"tc2-sectionTitle\" style=\"font-size:clamp(1.7rem,5vw,2.4rem)\">Message<\/h3>\r\n        <p id=\"tc2ModalText\" class=\"tc2-sectionCopy\">Ready.<\/p>\r\n        <div class=\"tc2-btnRow\">\r\n          <button id=\"tc2ModalOk\" class=\"tc2-btn tc2-btn-gold\" type=\"button\">OK<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const overlay = document.getElementById('tc2Overlay');\r\n  if(!overlay) return;\r\n\r\n  if(overlay.parentElement !== document.body){\r\n    document.body.appendChild(overlay);\r\n  }\r\n\r\n  const MAILTO_EMAIL = 'edwardraigozallc@gmail.com';\r\n  const WHATSAPP_NUMBER = '573147629693';\r\n  const BACK_URL = 'https:\/\/godsgalaxygame.com\/GGG\/';\r\n  const DEFAULT_IMAGE = 'http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png';\r\n\r\n  const TRAVEL_BRAIN = {\r\n    luxury:true,\r\n    family:true,\r\n    nature:true,\r\n    localCulture:true,\r\n    food:true\r\n  };\r\n\r\n  \r\n  const SERVICES = [\r\n    {key:'Private Driver', type:'Mobility', copy:'Airport pickup, city routes, full day, weekend and VIP custom driver.'},\r\n    {key:'Concierge', type:'Support', copy:'Help coordinating reservations, plans, local details and special requests.'},\r\n    {key:'Translator', type:'Language', copy:'Spanish\/English support for appointments, tours, meetings or local services.'},\r\n    {key:'Reservations', type:'Dining & Access', copy:'Restaurants, rooftops, attractions, private experiences and nightlife.'},\r\n    {key:'Security Support', type:'Safety', copy:'Discreet local support for movement, events or higher-touch travel.'},\r\n    {key:'Nightlife Help', type:'After Dark', copy:'Night routes, table help, drivers, safety planning and local guidance.'},\r\n    {key:'Local Guide', type:'Experience', copy:'Cultural, food, nature, hidden gem or neighborhood guide.'},\r\n    {key:'VIP Custom Support', type:'Private Request', copy:'A custom service request for high-touch member needs.'}\r\n  ];\r\n\r\n  const PLAN_BASE = [\r\n    {\r\n      type:'Accommodation',\r\n      title:'MedaYork Private Stay',\r\n      location:'Medell\u00edn, Colombia',\r\n      time:'Suggested Stay',\r\n      status:'Pending',\r\n      image:DEFAULT_IMAGE,\r\n      description:'A premium base for the member journey.'\r\n    },\r\n    {\r\n      type:'Explore',\r\n      title:'First Time Visitor Guide',\r\n      location:'MedaYork \u00b7 Medell\u00edn',\r\n      time:'Starter Guide',\r\n      status:'Recommended',\r\n      image:DEFAULT_IMAGE,\r\n      description:'A soft landing into Medell\u00edn with the best first route and local orientation.'\r\n    },\r\n    {\r\n      type:'Food',\r\n      title:'Signature Food Experience',\r\n      location:'Medell\u00edn, Colombia',\r\n      time:'Lunch \/ Dinner',\r\n      status:'Pending',\r\n      image:DEFAULT_IMAGE,\r\n      description:'A food experience selected around Travel Brain preferences.'\r\n    }\r\n  ];\r\n\r\n  const STORY_BASE = [\r\n    {\r\n      title:'Medell\u00edn 2026',\r\n      status:'Current Story',\r\n      desc:'Photos, videos, favorite restaurant, favorite experience, favorite guide and personal notes will live here.',\r\n      includes:['Photos','Videos','Favorite Restaurant','Favorite Experience','Favorite Guide','Personal Notes']\r\n    },\r\n    {\r\n      title:'Miami 2027',\r\n      status:'Future Story',\r\n      desc:'A future travel chapter that can be added when the member visits Tokyo.',\r\n      includes:['Trip Memories','Food Highlights','Favorite Moments','Private Notes']\r\n    },\r\n    {\r\n      title:'New York City 2028',\r\n      status:'Future Story',\r\n      desc:'Another chapter in the long-term story of the member\u2019s travels.',\r\n      includes:['Photos','Videos','Favorites','Notes']\r\n    }\r\n  ];\r\n\r\n  const state = {\r\n    currentPage:'home',\r\n    selectedService:null,\r\n    travelPlan:[],\r\n    destination:'MedaYork \u00b7 Medell\u00edn',\r\n    nextExperience:'Waiting for selection',\r\n    travelers:'2 Adults',\r\n    levelStatus:'Private Member \u00b7 Pending',\r\n    travelBrain:TRAVEL_BRAIN\r\n  };\r\n\r\n  const els = {\r\n   pages:{\r\n  home:document.getElementById('tc2HomePage'),\r\n  astro:document.getElementById('tc2AstroPage'),\r\n  brain:document.getElementById('tc2BrainPage'),\r\n  explore:document.getElementById('tc2ExplorePage'),\r\n  journey:document.getElementById('tc2JourneyPage'),\r\n  services:document.getElementById('tc2ServicesPage'),\r\n  story:document.getElementById('tc2StoryPage')\r\n    },\r\n    backBtn:document.getElementById('tc2BackBtn'),\r\nmainBrain:document.getElementById('tc2MainBrain'),\r\nmainExplore:document.getElementById('tc2MainExplore'),\r\n    mainJourney:document.getElementById('tc2MainJourney'),\r\n    mainServices:document.getElementById('tc2MainServices'),\r\n    mainStory:document.getElementById('tc2MainStory'),\r\n    floatExplore:document.getElementById('tc2FloatExplore'),\r\n    floatJourney:document.getElementById('tc2FloatJourney'),\r\n    floatServices:document.getElementById('tc2FloatServices'),\r\n    floatStory:document.getElementById('tc2FloatStory'),\r\n\r\n    currentDestination:document.getElementById('tc2CurrentDestination'),\r\n    nextExperience:document.getElementById('tc2NextExperience'),\r\n    travelers:document.getElementById('tc2Travelers'),\r\n    levelStatus:document.getElementById('tc2LevelStatus'),\r\n\r\n    statDestination:document.getElementById('tc2StatDestination'),\r\n    statNext:document.getElementById('tc2StatNext'),\r\n    statTravelers:document.getElementById('tc2StatTravelers'),\r\n    statLevel:document.getElementById('tc2StatLevel'),\r\n    planCards:document.getElementById('tc2PlanCards'),\r\n    savePlanBtn:document.getElementById('tc2SavePlanBtn'),\r\n    sendPlanBtn:document.getElementById('tc2SendPlanBtn'),\r\n    openServicesFromPlan:document.getElementById('tc2OpenServicesFromPlan'),\r\n\r\n    guideGrid:document.getElementById('tc2GuideGrid'),\r\n    servicesGrid:document.getElementById('tc2ServicesGrid'),\r\n    storyGrid:document.getElementById('tc2StoryGrid'),\r\n\r\n    serviceTypeChip:document.getElementById('tc2ServiceTypeChip'),\r\n    serviceAttachChip:document.getElementById('tc2ServiceAttachChip'),\r\n    serviceAttach:document.getElementById('tc2ServiceAttach'),\r\n    serviceLocation:document.getElementById('tc2ServiceLocation'),\r\n    serviceDate:document.getElementById('tc2ServiceDate'),\r\n    serviceTime:document.getElementById('tc2ServiceTime'),\r\n    serviceGuests:document.getElementById('tc2ServiceGuests'),\r\n    serviceShortNotes:document.getElementById('tc2ServiceShortNotes'),\r\n    serviceNotes:document.getElementById('tc2ServiceNotes'),\r\n    addServiceBtn:document.getElementById('tc2AddServiceBtn'),\r\n    serviceWhatsAppBtn:document.getElementById('tc2ServiceWhatsAppBtn'),\r\n    servicePreview:document.getElementById('tc2ServicePreview'),\r\n\r\n    modal:document.getElementById('tc2Modal'),\r\n    modalTitle:document.getElementById('tc2ModalTitle'),\r\n    modalText:document.getElementById('tc2ModalText'),\r\n    modalOk:document.getElementById('tc2ModalOk'),\r\n    stars:document.getElementById('tc2Stars')\r\n  };\r\n\r\n  function shouldOpen(){\r\n    const url = new URL(window.location.href);\r\n    return url.searchParams.get('travelclub') === '1';\r\n  }\r\n\r\n  function showOverlay(){\r\n    document.documentElement.classList.add('tc2-active');\r\n    document.body.classList.add('tc2-active','tc2Hide');\r\n    document.documentElement.style.overflow = 'hidden';\r\n    document.body.style.overflow = 'hidden';\r\n    overlay.style.display = 'block';\r\n    overlay.setAttribute('aria-hidden','false');\r\n  }\r\n\r\n  function buildStars(){\r\n    if(!els.stars || els.stars.dataset.done === '1') return;\r\n    els.stars.dataset.done = '1';\r\n    for(let i=0;i<72;i++){\r\n      const s = document.createElement('span');\r\n      const size = Math.random()*2 + 1;\r\n      s.style.width = size + 'px';\r\n      s.style.height = size + 'px';\r\n      s.style.left = (Math.random()*100) + '%';\r\n      s.style.top = (Math.random()*100) + '%';\r\n      s.style.animationDuration = (4 + Math.random()*5) + 's';\r\n      els.stars.appendChild(s);\r\n    }\r\n  }\r\n\r\n  function updateHero(){\r\n    if(state.currentPage !== 'home') return;\r\n    const y = overlay.scrollTop || 0;\r\n    const p = Math.min(y \/ (window.innerHeight * 0.95), 1.4);\r\n\r\n    document.documentElement.style.setProperty('--tc2LogoScale', (1 + p*2.8).toFixed(3));\r\n    document.documentElement.style.setProperty('--tc2LogoOpacity', Math.max(0, 1 - p*0.92).toFixed(3));\r\n    document.documentElement.style.setProperty('--tc2CopyY', (p * -50) + 'px');\r\n    document.documentElement.style.setProperty('--tc2CopyScale', Math.max(.78, 1 - p*.18).toFixed(3));\r\n    document.documentElement.style.setProperty('--tc2CopyOpacity', Math.max(0, 1 - p*.88).toFixed(3));\r\n    document.documentElement.style.setProperty('--tc2BgScale', (1 + p*.15).toFixed(3));\r\n    document.documentElement.style.setProperty('--tc2BgShift', (p * 24) + 'px');\r\n    document.documentElement.style.setProperty('--tc2BgBrightness', Math.max(.62, 1 - p*.16).toFixed(3));\r\n  }\r\n\r\nfunction showPage(name){\r\n\r\n  Object.values(els.pages).forEach(function(page){\r\n    if(page){\r\n      page.classList.remove(\"active\");\r\n      page.style.removeProperty(\"display\");\r\n      page.setAttribute(\"aria-hidden\",\"true\");\r\n    }\r\n  });\r\n\r\n  if(els.pages[name]){\r\n    els.pages[name].classList.add(\"active\");\r\n    els.pages[name].style.removeProperty(\"display\");\r\n    els.pages[name].setAttribute(\"aria-hidden\",\"false\");\r\n  }\r\n\r\n  state.currentPage = name;\r\n\r\n  overlay.scrollTo({\r\n    top:0,\r\n    behavior:\"smooth\"\r\n  });\r\n\r\n  updateHero();\r\n}\r\n  function openModal(title, text){\r\n    els.modalTitle.textContent = title;\r\n    els.modalText.textContent = text;\r\n    els.modal.classList.add('open');\r\n  }\r\n\r\n  function closeModal(){\r\n    els.modal.classList.remove('open');\r\n  }\r\n\r\n  function saveJourney(){\r\n    try{\r\n      sessionStorage.setItem('GGG_TRAVEL_CLUB_V3_JOURNEY', JSON.stringify(state.travelPlan));\r\n      sessionStorage.setItem('GGG_TRAVEL_CLUB_V3_META', JSON.stringify({\r\n        destination:state.destination,\r\n        nextExperience:state.nextExperience,\r\n        travelers:state.travelers,\r\n        levelStatus:state.levelStatus,\r\n        travelBrain:state.travelBrain\r\n      }));\r\n    }catch(e){}\r\n    openModal('Journey Saved', 'Your Travel Club journey was saved in this browser session.');\r\n  }\r\n\r\n  function saveSilent(){\r\n    try{\r\n      sessionStorage.setItem('GGG_TRAVEL_CLUB_V3_JOURNEY', JSON.stringify(state.travelPlan));\r\n      sessionStorage.setItem('GGG_TRAVEL_CLUB_V3_META', JSON.stringify({\r\n        destination:state.destination,\r\n        nextExperience:state.nextExperience,\r\n        travelers:state.travelers,\r\n        levelStatus:state.levelStatus,\r\n        travelBrain:state.travelBrain\r\n      }));\r\n    }catch(e){}\r\n  }\r\n\r\n  function loadJourney(){\r\n    try{\r\n      const saved = JSON.parse(sessionStorage.getItem('GGG_TRAVEL_CLUB_V3_JOURNEY') || '[]');\r\n      const meta = JSON.parse(sessionStorage.getItem('GGG_TRAVEL_CLUB_V3_META') || '{}');\r\n\r\n      state.travelPlan = Array.isArray(saved) &#038;&#038; saved.length ? saved : PLAN_BASE.slice();\r\n      if(meta.destination) state.destination = meta.destination;\r\n      if(meta.nextExperience) state.nextExperience = meta.nextExperience;\r\n      if(meta.travelers) state.travelers = meta.travelers;\r\n      if(meta.levelStatus) state.levelStatus = meta.levelStatus;\r\n      if(meta.travelBrain) state.travelBrain = meta.travelBrain;\r\n    }catch(e){\r\n      state.travelPlan = PLAN_BASE.slice();\r\n    }\r\n  }\r\n\r\n  function refreshNextExperience(){\r\n    const first = state.travelPlan[0];\r\n    state.nextExperience = first ? first.title : 'Waiting for selection';\r\n  }\r\n\r\n  function updatePlanSummary(){\r\n    els.currentDestination.textContent = state.destination;\r\n    els.nextExperience.textContent = state.nextExperience;\r\n    els.travelers.textContent = state.travelers;\r\n    els.levelStatus.textContent = state.levelStatus;\r\n\r\n    els.statDestination.textContent = state.destination.split('\u00b7')[0].trim() || state.destination;\r\n    els.statNext.textContent = state.nextExperience;\r\n    els.statTravelers.textContent = state.travelers.replace(' Adults','').replace(' Travelers','');\r\n    els.statLevel.textContent = state.levelStatus;\r\n  }\r\n\r\n  \r\n \r\n  function renderPlanCards(){\r\n    els.planCards.innerHTML = '';\r\n\r\n    if(!state.travelPlan.length){\r\n      els.planCards.innerHTML = `\r\n        <div class=\"tc2-expCard\">\r\n          <div>\r\n            <h3 class=\"tc2-expTitle\">No journey items yet<\/h3>\r\n            <div class=\"tc2-expMeta\">Explore Medell\u00edn, select local services, and add experiences to begin building the journey.<\/div>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      return;\r\n    }\r\n\r\n    state.travelPlan.forEach((item, index)=>{\r\n      const card = document.createElement('div');\r\n      card.className = 'tc2-expCard';\r\n      card.innerHTML = `\r\n        <div class=\"tc2-expMedia\" style=\"background-image:url('${item.image || DEFAULT_IMAGE}')\"><\/div>\r\n        <div>\r\n          <div class=\"tc2-chipRow\">\r\n            <div class=\"tc2-chip\">${escapeHtml(item.type || 'Experience')}<\/div>\r\n            <div class=\"tc2-chip\">${escapeHtml(item.status || 'Pending')}<\/div>\r\n          <\/div>\r\n          <h3 class=\"tc2-expTitle\">${escapeHtml(item.title || 'Selection')}<\/h3>\r\n          <div class=\"tc2-expMeta\">\r\n            ${escapeHtml(item.location || '')}<br>\r\n            ${escapeHtml(item.time || '')}<br>\r\n            ${escapeHtml(item.description || '')}\r\n          <\/div>\r\n          <div class=\"tc2-btnRow\">\r\n            <button class=\"tc2-btn tc2-btn-outline\" type=\"button\" data-attach-service=\"${index}\">Attach Local Service<\/button>\r\n            <button class=\"tc2-btn tc2-btn-danger\" type=\"button\" data-remove-plan=\"${index}\">Remove<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      els.planCards.appendChild(card);\r\n    });\r\n\r\n    els.planCards.querySelectorAll('[data-remove-plan]').forEach(btn=>{\r\n      btn.addEventListener('click', ()=>{\r\n        const idx = Number(btn.getAttribute('data-remove-plan'));\r\n        state.travelPlan.splice(idx, 1);\r\n        refreshNextExperience();\r\n        updatePlanSummary();\r\n        renderPlanCards();\r\n        saveSilent();\r\n      });\r\n    });\r\n\r\n    els.planCards.querySelectorAll('[data-attach-service]').forEach(btn=>{\r\n      btn.addEventListener('click', ()=>{\r\n        const idx = Number(btn.getAttribute('data-attach-service'));\r\n        const item = state.travelPlan[idx];\r\n        showPage('services');\r\n        els.serviceAttach.value = item.type || 'My Journey';\r\n        els.serviceAttachChip.textContent = `Attach to ${item.title || 'Selection'}`;\r\n      });\r\n    });\r\n  }\r\n\r\n  function renderServices(){\r\n    els.servicesGrid.innerHTML = '';\r\n    SERVICES.forEach(opt=>{\r\n      const btn = document.createElement('button');\r\n      btn.type = 'button';\r\n      btn.className = 'tc2-serviceCard';\r\n      btn.innerHTML = `\r\n        <div class=\"tc2-cardBody\">\r\n          <div class=\"tc2-cardType\">${escapeHtml(opt.type)}<\/div>\r\n          <div class=\"tc2-cardTitle\">${escapeHtml(opt.key)}<\/div>\r\n          <div class=\"tc2-cardDesc\">${escapeHtml(opt.copy)}<\/div>\r\n        <\/div>\r\n      `;\r\n      btn.addEventListener('click', ()=>{\r\n        state.selectedService = opt.key;\r\n        [...els.servicesGrid.children].forEach(el=> el.classList.remove('active'));\r\n        btn.classList.add('active');\r\n        els.serviceTypeChip.textContent = opt.key;\r\n        els.servicePreview.textContent = `${opt.key} selected. This service can be attached to ${els.serviceAttach.value || 'My Journey'}.`;\r\n      });\r\n      els.servicesGrid.appendChild(btn);\r\n    });\r\n  }\r\n\r\n  function getServicePayload(){\r\n    if(!state.selectedService){\r\n      openModal('Choose Service Type', 'Please select one local service first.');\r\n      return null;\r\n    }\r\n\r\n    const date = els.serviceDate.value || '';\r\n    const time = els.serviceTime.value || '';\r\n    const guests = els.serviceGuests.value || '2';\r\n    const attach = els.serviceAttach.value || 'My Journey';\r\n    const location = (els.serviceLocation.value || '').trim();\r\n    const shortNotes = (els.serviceShortNotes.value || '').trim();\r\n    const notes = (els.serviceNotes.value || '').trim();\r\n\r\n    return {\r\n      type:'Local Service',\r\n      title:state.selectedService,\r\n      location:location || attach,\r\n      time:date ? (time ? `${date} \u00b7 ${time}` : date) : 'Date Pending',\r\n      status:'Pending',\r\n      image:DEFAULT_IMAGE,\r\n      description:`Attached to ${attach}${shortNotes ? ' \u00b7 ' + shortNotes : ''}${notes ? ' \u00b7 ' + notes : ''}`,\r\n      guests\r\n    };\r\n  }\r\n\r\n  function addServiceToJourney(){\r\n    const payload = getServicePayload();\r\n    if(!payload) return;\r\n    state.travelPlan.push(payload);\r\n    state.travelers = `${payload.guests} Adults`;\r\n    refreshNextExperience();\r\n    updatePlanSummary();\r\n    renderPlanCards();\r\n    saveSilent();\r\n    openModal('Service Added', `${payload.title} was added to My Journey.`);\r\n  }\r\n\r\n  function sendServiceWhatsApp(){\r\n    const payload = getServicePayload();\r\n    if(!payload) return;\r\n\r\n    const lines = [\r\n      'Travel Club Local Service Request',\r\n      '',\r\n      `Service: ${payload.title}`,\r\n      `Attach To: ${els.serviceAttach.value || 'My Journey'}`,\r\n      `Location: ${els.serviceLocation.value || 'Pending'}`,\r\n      `Date\/Time: ${payload.time}`,\r\n      `Guests: ${payload.guests || '2'}`,\r\n      els.serviceShortNotes.value ? `Quick Notes: ${els.serviceShortNotes.value}` : '',\r\n      els.serviceNotes.value ? `Notes: ${els.serviceNotes.value}` : ''\r\n    ].filter(Boolean);\r\n\r\n    const text = encodeURIComponent(lines.join('\\n'));\r\n    window.open(`https:\/\/wa.me\/${WHATSAPP_NUMBER}?text=${text}`, '_blank');\r\n  }\r\n\r\n  function renderStory(){\r\n    els.storyGrid.innerHTML = '';\r\n    STORY_BASE.forEach(story=>{\r\n      const card = document.createElement('div');\r\n      card.className = 'tc2-storyCard';\r\n      card.innerHTML = `\r\n        <div class=\"tc2-cardMedia\" style=\"background-image:url('${DEFAULT_IMAGE}')\"><\/div>\r\n        <div class=\"tc2-cardBody\">\r\n          <div class=\"tc2-cardType\">${escapeHtml(story.status)}<\/div>\r\n          <div class=\"tc2-cardTitle\">${escapeHtml(story.title)}<\/div>\r\n          <div class=\"tc2-cardDesc\">${escapeHtml(story.desc)}<\/div>\r\n          <div class=\"tc2-subList\">\r\n            ${story.includes.map(item => `<div class=\"tc2-subItem\">${escapeHtml(item)}<\/div>`).join('')}\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      els.storyGrid.appendChild(card);\r\n    });\r\n  }\r\n\r\n  function sendFullJourney(){\r\n    if(!state.travelPlan.length){\r\n      openModal('No Journey Yet', 'Add at least one guide, service, or experience first.');\r\n      return;\r\n    }\r\n\r\n    const lines = [\r\n      'Travel Club Full Journey Request',\r\n      '',\r\n      `Current Destination: ${state.destination}`,\r\n      `Next Experience: ${state.nextExperience}`,\r\n      `Travelers: ${state.travelers}`,\r\n      `Level \/ Status: ${state.levelStatus}`,\r\n      '',\r\n      'Travel Brain:',\r\n      '- Loves luxury',\r\n      '- Travels with family',\r\n      '- Likes nature',\r\n      '- Likes local culture',\r\n      '- Likes good food',\r\n      ''\r\n    ];\r\n\r\n    state.travelPlan.forEach((item, i)=>{\r\n      lines.push(`${i + 1}. ${item.title}`);\r\n      lines.push(`Type: ${item.type || 'Experience'}`);\r\n      if(item.location) lines.push(`Location: ${item.location}`);\r\n      if(item.time) lines.push(`Time: ${item.time}`);\r\n      if(item.status) lines.push(`Status: ${item.status}`);\r\n      if(item.description) lines.push(`Description: ${item.description}`);\r\n      lines.push('');\r\n    });\r\n\r\n    const subject = encodeURIComponent('Travel Club Full Journey Request');\r\n    const body = encodeURIComponent(lines.join('\\n'));\r\n    window.location.href = `mailto:${MAILTO_EMAIL}?subject=${subject}&body=${body}`;\r\n  }\r\n\r\n  function bindUI(){\r\n   els.backBtn.addEventListener(\"click\", function(event){\r\n\r\n  event.preventDefault();\r\n  event.stopPropagation();\r\n\r\n  \/*\r\n   * EXPLORE MEDELL\u00cdN INTERNAL BACK\r\n   *\r\n   * Hosts \u2192 Suboptions\r\n   * Suboptions \u2192 Options\r\n   * Options \u2192 Guides\r\n   * Guides \u2192 Travel Club Home\r\n   *\/\r\n  if(\r\n    state.currentPage === \"explore\" &&\r\n    window.tc2ExploreV6 &&\r\n    typeof window.tc2ExploreV6.goBack === \"function\"\r\n  ){\r\n\r\n    const movedInsideExplore =\r\n      window.tc2ExploreV6.goBack();\r\n\r\n    if(movedInsideExplore){\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * goBack() returned false.\r\n     * That means the user was already on the\r\n     * main Explore Medell\u00edn guide screen.\r\n     *\/\r\n    showPage(\"home\");\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Travel Club home \u2192 Gods Galaxy page\r\n   *\/\r\n  if(state.currentPage === \"home\"){\r\n\r\n    window.location.href =\r\n      BACK_URL;\r\n\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * All other Travel Club pages\r\n   * \u2192 return to Travel Club home.\r\n   *\/\r\n  showPage(\"home\");\r\n\r\n});\r\n\r\nconst astroBtn = document.getElementById('tc2MainAstro');\r\n\r\nif (astroBtn) {\r\n  astroBtn.addEventListener('click', function(){\r\n    showPage('astro');\r\n    buildAstroWheel();\r\n  });\r\n}\r\n\r\nif (els.mainBrain) {\r\n  els.mainBrain.addEventListener(\r\n    'click',\r\n    function(){\r\n      showPage('brain');\r\n    },\r\n    true\r\n  );\r\n}\r\n\r\n    els.mainExplore.addEventListener('click', ()=> showPage('explore'));\r\n    els.mainJourney.addEventListener('click', ()=> showPage('journey'));\r\n    els.mainServices.addEventListener('click', ()=> showPage('services'));\r\n    els.mainStory.addEventListener('click', ()=> showPage('story'));\r\n\r\n    els.floatExplore.addEventListener('click', ()=> showPage('explore'));\r\n    els.floatJourney.addEventListener('click', ()=> showPage('journey'));\r\n    els.floatServices.addEventListener('click', ()=> showPage('services'));\r\n    els.floatStory.addEventListener('click', ()=> showPage('story'));\r\n\r\n    els.openServicesFromPlan.addEventListener('click', ()=> showPage('services'));\r\n    els.savePlanBtn.addEventListener('click', saveJourney);\r\n    els.sendPlanBtn.addEventListener('click', sendFullJourney);\r\n\r\n    els.addServiceBtn.addEventListener('click', addServiceToJourney);\r\n    els.serviceWhatsAppBtn.addEventListener('click', sendServiceWhatsApp);\r\n\r\n    els.serviceAttach.addEventListener('change', ()=>{\r\n      els.serviceAttachChip.textContent = `Attach to ${els.serviceAttach.value}`;\r\n      if(state.selectedService){\r\n        els.servicePreview.textContent = `${state.selectedService} selected. This service can be attached to ${els.serviceAttach.value}.`;\r\n      }\r\n    });\r\n\r\n    els.modalOk.addEventListener('click', closeModal);\r\n    els.modal.addEventListener('click', (e)=>{\r\n      if(e.target === els.modal) closeModal();\r\n    });\r\n\r\n    overlay.addEventListener('scroll', updateHero, { passive:true });\r\n    window.addEventListener('resize', updateHero, { passive:true });\r\n\r\n    bindMenu();\r\n  }\r\n\r\n  function bindMenu(){\r\n    const btn = document.getElementById('tc2MenuBtn');\r\n    const panel = document.getElementById('tc2MenuPanel');\r\n    const links = document.querySelectorAll('[data-tc2]');\r\n    const blocks = document.querySelectorAll('.tc2-legalBlock');\r\n\r\n    if(!btn || !panel) return;\r\n\r\n    btn.addEventListener('click', (e)=>{\r\n      e.stopPropagation();\r\n      panel.classList.toggle('open');\r\n    });\r\n\r\n    links.forEach(link=>{\r\n      link.addEventListener('click', (e)=>{\r\n        e.stopPropagation();\r\n        blocks.forEach(b=>b.classList.remove('open'));\r\n        const key = link.getAttribute('data-tc2');\r\n        const target = document.getElementById('tc2Block-' + key);\r\n        if(target) target.classList.add('open');\r\n      });\r\n    });\r\n\r\n    document.addEventListener('click', (e)=>{\r\n      if(panel.classList.contains('open') && !panel.contains(e.target) && !btn.contains(e.target)){\r\n        panel.classList.remove('open');\r\n      }\r\n    });\r\n  }\r\n\r\n  function init(){\r\n    if(!shouldOpen()) return;\r\n    showOverlay();\r\n    buildStars();\r\n    loadJourney();\r\n    refreshNextExperience();\r\n    updatePlanSummary();\r\n    renderPlanCards();\r\n    renderServices();\r\n    renderStory();\r\n    bindUI();\r\n    updateHero();\r\n  }\r\n\r\n  function escapeHtml(str){\r\n    return String(str)\r\n      .replaceAll('&','&amp;')\r\n      .replaceAll('<','&lt;')\r\n      .replaceAll('>','&gt;')\r\n      .replaceAll('\"','&quot;')\r\n      .replaceAll(\"'\",\"&#39;\");\r\n  \r\n  }\r\n\r\n  init();\r\n})();\r\n<\/script>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function(){\r\n\r\n  const astroBtn = document.getElementById(\"tc2MainAstro\");\r\n  const evolutionBtn = document.getElementById(\"tc2MainEvolution\");\r\n\r\n  if (astroBtn) {\r\n    astroBtn.addEventListener(\"click\", function(){\r\n      if (typeof showPage === \"function\") {\r\n        showPage(\"tc2AstroPage\");\r\n      } else {\r\n        alert(\"Astro Travel Recommendations page is not connected yet.\");\r\n      }\r\n    });\r\n  }\r\n\r\n  if (evolutionBtn) {\r\n    evolutionBtn.addEventListener(\"click\", function(){\r\n      alert(\"Personal Evolution is Level 4. Unlock Level 4 to Go Beyond the Destination.\");\r\n    });\r\n  }\r\n\r\n});\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 DIRECT SERVER INVENTORY CONNECTION\r\nENP-STYLE CONNECTION\r\n========================================================= -->\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  const TC_AJAX_URL =\r\n    \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\n  \/*\r\n   * This is the one inventory array used by the entire\r\n   * Travel Club page.\r\n   *\/\r\n  window.travelClubInventory = [];\r\n\r\n  \/*\r\n   * Downloads the hosts that were saved by the\r\n   * Bliss Travel Club Control Panel.\r\n   *\/\r\n  window.loadTravelClubInventory =\r\n    function loadTravelClubInventory() {\r\n\r\n      const formData = new FormData();\r\n\r\n      formData.append(\r\n        \"action\",\r\n        \"ggg_tc_get_inventory\"\r\n      );\r\n\r\n      return fetch(TC_AJAX_URL, {\r\n        method: \"POST\",\r\n        credentials: \"same-origin\",\r\n        cache: \"no-store\",\r\n        body: formData\r\n      })\r\n      .then(function (response) {\r\n        if (!response.ok) {\r\n          throw new Error(\r\n            \"Inventory request failed: \" +\r\n            response.status\r\n          );\r\n        }\r\n\r\n        return response.json();\r\n      })\r\n      .then(function (response) {\r\n        if (\r\n          !response ||\r\n          response.success !== true ||\r\n          !response.data ||\r\n          !Array.isArray(response.data.items)\r\n        ) {\r\n          throw new Error(\r\n            response &&\r\n            response.data &&\r\n            response.data.message\r\n              ? response.data.message\r\n              : \"Travel Club inventory could not be loaded.\"\r\n          );\r\n        }\r\n\r\n        window.travelClubInventory =\r\n          response.data.items;\r\n\r\n        console.log(\r\n          \"[Bliss Travel Club] Hosts loaded:\",\r\n          window.travelClubInventory.length,\r\n          window.travelClubInventory\r\n        );\r\n\r\n        \/*\r\n         * Notify all Travel Club host sections that the\r\n         * server inventory is ready.\r\n         *\/\r\n        window.dispatchEvent(\r\n          new CustomEvent(\r\n            \"travelClubInventoryReady\",\r\n            {\r\n              detail: {\r\n                items:\r\n                  window.travelClubInventory,\r\n                count:\r\n                  window.travelClubInventory.length\r\n              }\r\n            }\r\n          )\r\n        );\r\n\r\n        return window.travelClubInventory;\r\n      })\r\n      .catch(function (error) {\r\n        console.error(\r\n          \"[Bliss Travel Club] Inventory failed:\",\r\n          error\r\n        );\r\n\r\n        window.travelClubInventory = [];\r\n\r\n        throw error;\r\n      });\r\n    };\r\n\r\n  \/*\r\n   * This is the boot function.\r\n   * It belongs directly underneath the loader,\r\n   * inside this same script block.\r\n   *\/\r\n  function bootTravelClubHosts() {\r\n    window.loadTravelClubInventory()\r\n      .then(function () {\r\n\r\n        \/*\r\n         * Refresh Explore Medell\u00edn after the hosts arrive.\r\n         *\/\r\n        if (\r\n          window.tc2ExploreV6 &&\r\n          typeof window.tc2ExploreV6.renderGuides\r\n            === \"function\"\r\n        ) {\r\n          window.tc2ExploreV6.renderGuides();\r\n        }\r\n\r\n        \/*\r\n         * Refresh an already-open Astro selection.\r\n         *\/\r\n        const activeAstroButton =\r\n          document.querySelector(\r\n            \"#tc2AstroPage .astro-styleBtn.active\"\r\n          );\r\n\r\n        if (activeAstroButton) {\r\n          activeAstroButton.click();\r\n        }\r\n\r\n        \/*\r\n         * Refresh Local Services when its public\r\n         * renderer exists.\r\n         *\/\r\n        if (\r\n          window.tc2LocalServices &&\r\n          typeof window.tc2LocalServices.render\r\n            === \"function\"\r\n        ) {\r\n          window.tc2LocalServices.render();\r\n        }\r\n      })\r\n      .catch(function (error) {\r\n        console.error(\r\n          \"[Bliss Travel Club] Boot failed:\",\r\n          error\r\n        );\r\n      });\r\n  }\r\n\r\n  \/*\r\n   * Automatically load the Control Panel inventory\r\n   * when the Travel Club page opens.\r\n   *\/\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      bootTravelClubHosts,\r\n      { once: true }\r\n    );\r\n  } else {\r\n    bootTravelClubHosts();\r\n  }\r\n\r\n  \/*\r\n   * Reload after returning to the Travel Club tab.\r\n   *\/\r\n  window.addEventListener(\r\n    \"focus\",\r\n    function () {\r\n      window.loadTravelClubInventory()\r\n        .then(function () {\r\n          const activeAstroButton =\r\n            document.querySelector(\r\n              \"#tc2AstroPage .astro-styleBtn.active\"\r\n            );\r\n\r\n          if (activeAstroButton) {\r\n            activeAstroButton.click();\r\n          }\r\n\r\n          if (\r\n            window.tc2ExploreV6 &&\r\n            typeof window.tc2ExploreV6.renderGuides\r\n              === \"function\"\r\n          ) {\r\n            window.tc2ExploreV6.renderGuides();\r\n          }\r\n        })\r\n        .catch(function () {});\r\n    }\r\n  );\r\n})();\r\n<\/script>\r\n\r\n\r\n<!-- ===== BLISS TRAVEL CLUB \u2014 CLEAN ONE-SCREEN CITY GATE ===== -->\r\n\r\n<style>\r\n\r\n#tcCityGate{\r\n\r\n  position:fixed;\r\n\r\n  inset:0;\r\n\r\n  z-index:999999999;\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  overflow:hidden;\r\n\r\n  color:#f7fbff;\r\n\r\n  font-family:Arial,Helvetica,sans-serif;\r\n\r\n  background:\r\n\r\n    radial-gradient(circle at 50% 18%, rgba(0,220,255,.20), transparent 28%),\r\n\r\n    radial-gradient(circle at 12% 78%, rgba(0,80,255,.16), transparent 32%),\r\n\r\n    radial-gradient(circle at 88% 72%, rgba(255,255,255,.08), transparent 28%),\r\n\r\n    linear-gradient(180deg,#00030a 0%,#020814 52%,#000106 100%);\r\n\r\n  isolation:isolate;\r\n\r\n}\r\n\r\n#tcCityGate.tcCityGateHidden{display:none!important;}\r\n\r\n#tcCityGate *{box-sizing:border-box;}\r\n\r\n\r\n\r\n#tcCityGate::before{\r\n\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n\r\n  inset:0;\r\n\r\n  background:\r\n\r\n    linear-gradient(rgba(255,255,255,.025) 1px, transparent 1px),\r\n\r\n    linear-gradient(90deg, rgba(255,255,255,.025) 1px, transparent 1px);\r\n\r\n  background-size:44px 44px;\r\n\r\n  mask-image:radial-gradient(circle at 50% 55%, black 0%, transparent 76%);\r\n\r\n  animation:blissGateGrid 16s linear infinite;\r\n\r\n  z-index:-3;\r\n\r\n}\r\n\r\n\r\n\r\n#tcCityGate::after{\r\n\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n\r\n  inset:-18%;\r\n\r\n  background:\r\n\r\n    conic-gradient(from 200deg at 50% 50%,\r\n\r\n      transparent,\r\n\r\n      rgba(0,210,255,.16),\r\n\r\n      transparent,\r\n\r\n      rgba(255,255,255,.08),\r\n\r\n      transparent);\r\n\r\n  filter:blur(18px);\r\n\r\n  opacity:.75;\r\n\r\n  animation:blissGateSpin 24s linear infinite;\r\n\r\n  z-index:-2;\r\n\r\n}\r\n\r\n\r\n\r\n.blissGateShell{\r\n\r\n  width:min(96vw,980px);\r\n\r\n  height:100vh;\r\n\r\n  max-height:900px;\r\n\r\n  padding:22px 14px;\r\n\r\n  text-align:center;\r\n\r\n  display:flex;\r\n\r\n  flex-direction:column;\r\n\r\n  justify-content:center;\r\n\r\n  align-items:center;\r\n\r\n  position:relative;\r\n\r\n}\r\n\r\n\r\n\r\n.blissTitle{\r\n\r\n  margin:0;\r\n\r\n  font-size:clamp(4rem,14vw,10rem);\r\n\r\n  line-height:.78;\r\n\r\n  letter-spacing:-.085em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  font-weight:1000;\r\n\r\n  color:#fff;\r\n\r\n  text-shadow:\r\n\r\n    0 0 16px rgba(255,255,255,.72),\r\n\r\n    0 0 46px rgba(0,190,255,.55),\r\n\r\n    0 0 100px rgba(0,90,255,.38);\r\n\r\n}\r\n\r\n\r\n\r\n.blissTitle span{\r\n\r\n  display:block;\r\n\r\n  margin-top:16px;\r\n\r\n  font-size:clamp(1.1rem,4.4vw,3rem);\r\n\r\n  line-height:1;\r\n\r\n  letter-spacing:.36em;\r\n\r\n  padding-left:.36em;\r\n\r\n  color:rgba(240,250,255,.94);\r\n\r\n  text-shadow:\r\n\r\n    0 0 14px rgba(255,255,255,.42),\r\n\r\n    0 0 34px rgba(0,210,255,.42);\r\n\r\n}\r\n\r\n\r\n\r\n.blissPrompt{\r\n\r\n  margin:18px auto 12px;\r\n\r\n  color:rgba(210,242,255,.78);\r\n\r\n  font-size:clamp(.72rem,2.2vw,.9rem);\r\n\r\n  letter-spacing:.2em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  font-weight:900;\r\n\r\n}\r\n\r\n\r\n\r\n\/* PROJECTOR STAGE *\/\r\n\r\n.blissStage{\r\n\r\n  position:relative;\r\n\r\n  width:min(96vw,820px);\r\n\r\n  height:390px;\r\n\r\n  margin:0 auto;\r\n\r\n  perspective:1000px;\r\n\r\n}\r\n\r\n\r\n\r\n.blissBeam{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  bottom:92px;\r\n\r\n  width:min(74vw,430px);\r\n\r\n  height:280px;\r\n\r\n  transform:translateX(-50%);\r\n\r\n  clip-path:polygon(50% 0,100% 100%,0 100%);\r\n\r\n  background:linear-gradient(180deg,rgba(255,255,255,.26),rgba(0,210,255,.16),rgba(0,80,255,.02));\r\n\r\n  opacity:0;\r\n\r\n  transition:opacity .55s ease;\r\n\r\n  pointer-events:none;\r\n\r\n}\r\n\r\n\r\n\r\n.blissGateActive .blissBeam{\r\n\r\n  opacity:.92;\r\n\r\n  animation:blissBeamGlow 2.8s ease-in-out infinite;\r\n\r\n}\r\n\r\n\r\n\r\n.blissProjectorDeck{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  bottom:18px;\r\n\r\n  width:min(90vw,620px);\r\n\r\n  height:150px;\r\n\r\n  transform:translateX(-50%) rotateX(64deg);\r\n\r\n  transform-origin:center bottom;\r\n\r\n  border-radius:50%;\r\n\r\n  background:\r\n\r\n    radial-gradient(circle at 50% 50%, rgba(0,229,255,.38), rgba(0,80,255,.10) 44%, rgba(255,255,255,.05) 62%, transparent 74%),\r\n\r\n    repeating-radial-gradient(circle at 50% 50%, rgba(255,255,255,.20) 0 2px, transparent 2px 26px);\r\n\r\n  border:2px solid rgba(175,238,255,.38);\r\n\r\n  box-shadow:\r\n\r\n    0 0 44px rgba(0,200,255,.48),\r\n\r\n    0 0 100px rgba(0,90,255,.30),\r\n\r\n    inset 0 0 40px rgba(255,255,255,.13);\r\n\r\n  cursor:pointer;\r\n\r\n  animation:blissDeckPulse 2.6s ease-in-out infinite;\r\n\r\n}\r\n\r\n\r\n\r\n.blissProjectorCore{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  bottom:56px;\r\n\r\n  width:min(64vw,360px);\r\n\r\n  height:70px;\r\n\r\n  transform:translateX(-50%);\r\n\r\n  border-radius:32px 32px 16px 16px;\r\n\r\n  background:\r\n\r\n    linear-gradient(180deg, rgba(255,255,255,.28), rgba(255,255,255,.04)),\r\n\r\n    linear-gradient(135deg, rgba(0,210,255,.15), rgba(0,40,120,.38));\r\n\r\n  border:1px solid rgba(210,245,255,.34);\r\n\r\n  box-shadow:\r\n\r\n    0 0 42px rgba(0,210,255,.30),\r\n\r\n    inset 0 0 22px rgba(255,255,255,.13);\r\n\r\n  pointer-events:none;\r\n\r\n}\r\n\r\n\r\n\r\n.blissProjectorCore::before{\r\n\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  top:12px;\r\n\r\n  width:42%;\r\n\r\n  height:9px;\r\n\r\n  transform:translateX(-50%);\r\n\r\n  border-radius:999px;\r\n\r\n  background:#fff;\r\n\r\n  box-shadow:\r\n\r\n    0 0 16px #fff,\r\n\r\n    0 0 34px rgba(0,210,255,.95);\r\n\r\n}\r\n\r\n\r\n\r\n.blissActivate{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  bottom:135px;\r\n\r\n  transform:translateX(-50%);\r\n\r\n  z-index:9;\r\n\r\n  min-height:50px;\r\n\r\n  padding:0 22px;\r\n\r\n  border-radius:999px;\r\n\r\n  border:1px solid rgba(210,245,255,.48);\r\n\r\n  background:linear-gradient(135deg,#ffffff,#7eeeff,#008cff);\r\n\r\n  color:#001018;\r\n\r\n  font-size:.74rem;\r\n\r\n  font-weight:1000;\r\n\r\n  letter-spacing:.16em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:\r\n\r\n    0 0 28px rgba(255,255,255,.36),\r\n\r\n    0 0 56px rgba(0,210,255,.34);\r\n\r\n  transition:opacity .3s ease, transform .2s ease;\r\n\r\n}\r\n\r\n\r\n\r\n.blissActivate:hover{transform:translateX(-50%) translateY(-3px);}\r\n\r\n.blissGateActive .blissActivate{opacity:0;pointer-events:none;}\r\n\r\n\r\n\r\n\/* ONE CITY AT A TIME *\/\r\n\r\n.blissHoloViewer{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  bottom:150px;\r\n\r\n  width:min(86vw,430px);\r\n\r\n  height:205px;\r\n\r\n  transform:translateX(-50%) translateY(14px) scale(.94);\r\n\r\n  opacity:0;\r\n\r\n  transition:opacity .55s ease, transform .55s ease;\r\n\r\n  pointer-events:none;\r\n\r\n  touch-action:pan-y;\r\n\r\n}\r\n\r\n\r\n\r\n.blissGateActive .blissHoloViewer{\r\n\r\n  opacity:1;\r\n\r\n  transform:translateX(-50%) translateY(0) scale(1);\r\n\r\n  pointer-events:auto;\r\n\r\n}\r\n\r\n\r\n\r\n.blissCitySlide{\r\n\r\n  position:absolute;\r\n\r\n  inset:0;\r\n\r\n  opacity:0;\r\n\r\n  transform:translateX(48px) scale(.92);\r\n\r\n  pointer-events:none;\r\n\r\n  transition:opacity .36s ease, transform .36s ease, filter .36s ease;\r\n\r\n}\r\n\r\n\r\n\r\n.blissCitySlide.active{\r\n\r\n  opacity:1;\r\n\r\n  transform:translateX(0) scale(1);\r\n\r\n  pointer-events:auto;\r\n\r\n}\r\n\r\n\r\n\r\n.blissCitySlide.offline{\r\n\r\n  filter:saturate(.28) brightness(.52);\r\n\r\n}\r\n\r\n\r\n\r\n.blissMiniMountain{\r\n\r\n  position:absolute;\r\n\r\n  left:50%;\r\n\r\n  top:52px;\r\n\r\n  width:260px;\r\n\r\n  height:60px;\r\n\r\n  transform:translateX(-50%);\r\n\r\n  clip-path:polygon(0 100%,16% 44%,30% 100%,50% 20%,68% 100%,84% 48%,100% 100%);\r\n\r\n  background:linear-gradient(135deg, rgba(255,255,255,.50), rgba(0,210,255,.18));\r\n\r\n  opacity:.62;\r\n\r\n  filter:drop-shadow(0 0 16px rgba(0,210,255,.28));\r\n\r\n}\r\n\r\n\r\n\r\n.blissMiniSkyline{\r\n\r\n  height:98px;\r\n\r\n  display:flex;\r\n\r\n  align-items:flex-end;\r\n\r\n  justify-content:center;\r\n\r\n  gap:7px;\r\n\r\n  margin:0 auto;\r\n\r\n  filter:\r\n\r\n    drop-shadow(0 0 10px rgba(120,235,255,.95))\r\n\r\n    drop-shadow(0 0 24px rgba(0,130,255,.45));\r\n\r\n}\r\n\r\n\r\n\r\n.blissMiniBuilding{\r\n\r\n  width:19px;\r\n\r\n  border:1px solid rgba(185,245,255,.86);\r\n\r\n  background:\r\n\r\n    repeating-linear-gradient(180deg, rgba(255,255,255,.48) 0 4px, rgba(0,210,255,.16) 4px 8px),\r\n\r\n    linear-gradient(180deg, rgba(0,229,255,.14), rgba(0,80,255,.06));\r\n\r\n  box-shadow:\r\n\r\n    inset 0 0 10px rgba(255,255,255,.20),\r\n\r\n    0 0 14px rgba(0,210,255,.32);\r\n\r\n}\r\n\r\n\r\n\r\n.blissMiniBuilding:nth-child(1){height:42%;}\r\n\r\n.blissMiniBuilding:nth-child(2){height:74%;}\r\n\r\n.blissMiniBuilding:nth-child(3){height:58%;}\r\n\r\n.blissMiniBuilding:nth-child(4){height:100%;}\r\n\r\n.blissMiniBuilding:nth-child(5){height:70%;}\r\n\r\n.blissMiniBuilding:nth-child(6){height:86%;}\r\n\r\n.blissMiniBuilding:nth-child(7){height:52%;}\r\n\r\n\r\n\r\n.blissCityName{\r\n\r\n  margin-top:12px;\r\n\r\n  font-size:clamp(1.4rem,5vw,2.4rem);\r\n\r\n  font-weight:1000;\r\n\r\n  letter-spacing:.10em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  color:#fff;\r\n\r\n  text-shadow:\r\n\r\n    0 0 18px rgba(255,255,255,.55),\r\n\r\n    0 0 38px rgba(0,210,255,.42);\r\n\r\n}\r\n\r\n\r\n\r\n.blissCityStatus{\r\n\r\n  margin-top:5px;\r\n\r\n  font-size:.7rem;\r\n\r\n  font-weight:900;\r\n\r\n  letter-spacing:.24em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  color:#6feaff;\r\n\r\n  text-shadow:0 0 14px rgba(0,210,255,.8);\r\n\r\n}\r\n\r\n\r\n\r\n.offline .blissCityStatus{\r\n\r\n  color:rgba(230,244,255,.55);\r\n\r\n  text-shadow:none;\r\n\r\n}\r\n\r\n\r\n\r\n\/* CONTROLS + ENTER *\/\r\n\r\n.blissCityControls{\r\n\r\n  display:flex;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  gap:14px;\r\n\r\n  height:44px;\r\n\r\n  margin-top:-4px;\r\n\r\n  opacity:0;\r\n\r\n  pointer-events:none;\r\n\r\n  transition:opacity .35s ease;\r\n\r\n}\r\n\r\n\r\n\r\n.blissGateActive .blissCityControls{\r\n\r\n  opacity:1;\r\n\r\n  pointer-events:auto;\r\n\r\n}\r\n\r\n\r\n\r\n.blissArrow{\r\n\r\n  width:42px;\r\n\r\n  height:42px;\r\n\r\n  border-radius:50%;\r\n\r\n  border:1px solid rgba(180,238,255,.44);\r\n\r\n  background:rgba(255,255,255,.045);\r\n\r\n  color:#fff;\r\n\r\n  font-size:1.35rem;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:0 0 20px rgba(0,210,255,.18);\r\n\r\n}\r\n\r\n\r\n\r\n.blissDots{display:flex;gap:8px;}\r\n\r\n.blissDot{\r\n\r\n  width:8px;\r\n\r\n  height:8px;\r\n\r\n  border-radius:50%;\r\n\r\n  background:rgba(230,244,255,.22);\r\n\r\n}\r\n\r\n.blissDot.active{\r\n\r\n  background:#70eaff;\r\n\r\n  box-shadow:0 0 14px rgba(0,210,255,.9);\r\n\r\n}\r\n\r\n\r\n\r\n.blissEnterBtn{\r\n\r\n  min-height:52px;\r\n\r\n  padding:0 28px;\r\n\r\n  border:none;\r\n\r\n  border-radius:999px;\r\n\r\n  background:linear-gradient(135deg,#ffffff,#7eeeff,#008cff);\r\n\r\n  color:#001018;\r\n\r\n  font-weight:1000;\r\n\r\n  letter-spacing:.15em;\r\n\r\n  text-transform:uppercase;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:\r\n\r\n    0 0 30px rgba(255,255,255,.30),\r\n\r\n    0 0 64px rgba(0,190,255,.32);\r\n\r\n  opacity:0;\r\n\r\n  pointer-events:none;\r\n\r\n  transform:translateY(6px);\r\n\r\n  transition:opacity .35s ease, transform .35s ease;\r\n\r\n}\r\n\r\n\r\n\r\n.blissGateActive .blissEnterBtn{\r\n\r\n  opacity:1;\r\n\r\n  pointer-events:auto;\r\n\r\n  transform:translateY(0);\r\n\r\n}\r\n\r\n\r\n\r\n.blissEnterBtn.disabled{\r\n\r\n  opacity:.34!important;\r\n\r\n  cursor:not-allowed;\r\n\r\n}\r\n\r\n\r\n\r\n.tcEnterFlash{\r\n\r\n  position:fixed;\r\n\r\n  inset:0;\r\n\r\n  z-index:1000000000;\r\n\r\n  display:none;\r\n\r\n  align-items:center;\r\n\r\n  justify-content:center;\r\n\r\n  text-align:center;\r\n\r\n  padding:24px;\r\n\r\n  background:\r\n\r\n    radial-gradient(circle at 50% 45%, rgba(255,255,255,.24), transparent 24%),\r\n\r\n    radial-gradient(circle at 50% 56%, rgba(0,210,255,.22), transparent 44%),\r\n\r\n    rgba(0,3,10,.96);\r\n\r\n  color:#fff;\r\n\r\n  font-size:clamp(2rem,8vw,5.4rem);\r\n\r\n  font-weight:1000;\r\n\r\n  text-transform:uppercase;\r\n\r\n  letter-spacing:.02em;\r\n\r\n  text-shadow:\r\n\r\n    0 0 22px rgba(255,255,255,.82),\r\n\r\n    0 0 60px rgba(0,210,255,.55);\r\n\r\n}\r\n\r\n\r\n\r\n.tcEnterFlash.show{\r\n\r\n  display:flex;\r\n\r\n  animation:blissFlash 1.8s ease both;\r\n\r\n}\r\n\r\n\r\n\r\n@media(max-width:620px){\r\n\r\n  .blissGateShell{padding:16px 10px;}\r\n\r\n  .blissTitle{font-size:clamp(3.5rem,18vw,6rem);}\r\n\r\n  .blissTitle span{letter-spacing:.26em;padding-left:.26em;}\r\n\r\n  .blissPrompt{font-size:.63rem;letter-spacing:.15em;}\r\n\r\n  .blissStage{height:380px;width:100vw;}\r\n\r\n  .blissHoloViewer{bottom:150px;height:190px;}\r\n\r\n  .blissMiniSkyline{height:82px;gap:5px;}\r\n\r\n  .blissMiniBuilding{width:15px;}\r\n\r\n  .blissMiniMountain{width:220px;height:52px;top:48px;}\r\n\r\n  .blissActivate{bottom:132px;font-size:.66rem;padding:0 18px;}\r\n\r\n}\r\n\r\n\r\n\r\n@media(max-height:720px){\r\n\r\n  .blissTitle{font-size:clamp(3rem,11vw,7.2rem);}\r\n\r\n  .blissTitle span{margin-top:10px;}\r\n\r\n  .blissPrompt{margin-top:12px;}\r\n\r\n  .blissStage{height:340px;}\r\n\r\n  .blissHoloViewer{bottom:132px;}\r\n\r\n  .blissProjectorDeck{height:130px;}\r\n\r\n  .blissActivate{bottom:120px;}\r\n\r\n}\r\n\r\n\r\n\r\n@keyframes blissGateGrid{\r\n\r\n  from{background-position:0 0,0 0;}\r\n\r\n  to{background-position:0 88px,88px 0;}\r\n\r\n}\r\n\r\n@keyframes blissGateSpin{to{transform:rotate(360deg);}}\r\n\r\n@keyframes blissDeckPulse{\r\n\r\n  0%,100%{box-shadow:0 0 44px rgba(0,200,255,.48),0 0 100px rgba(0,90,255,.30),inset 0 0 40px rgba(255,255,255,.13);}\r\n\r\n  50%{box-shadow:0 0 66px rgba(255,255,255,.38),0 0 130px rgba(0,190,255,.44),inset 0 0 54px rgba(0,210,255,.20);}\r\n\r\n}\r\n\r\n@keyframes blissBeamGlow{\r\n\r\n  0%,100%{filter:brightness(1);}\r\n\r\n  50%{filter:brightness(1.55);}\r\n\r\n}\r\n\r\n@keyframes blissFlash{\r\n\r\n  0%{opacity:0;transform:scale(.96);}\r\n\r\n  20%{opacity:1;transform:scale(1);}\r\n\r\n  78%{opacity:1;transform:scale(1);}\r\n\r\n  100%{opacity:0;transform:scale(1.08);}\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<div id=\"tcCityGate\">\r\n\r\n  <div class=\"blissGateShell\">\r\n\r\n    <h1 class=\"blissTitle\">\r\n\r\n      BLISS\r\n\r\n      <span>Travel Club<\/span>\r\n\r\n    <\/h1>\r\n\r\n\r\n\r\n    <p class=\"blissPrompt\">Click the hologram projector<\/p>\r\n\r\n\r\n\r\n    <section id=\"blissGateStage\" class=\"blissStage\">\r\n\r\n      <div class=\"blissBeam\"><\/div>\r\n\r\n\r\n\r\n      <div id=\"blissHoloViewer\" class=\"blissHoloViewer\">\r\n\r\n        <div class=\"blissCitySlide active\" data-city=\"MedaYork\" data-active=\"true\">\r\n\r\n          <div class=\"blissMiniMountain\"><\/div>\r\n\r\n          <div class=\"blissMiniSkyline\">\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n          <\/div>\r\n\r\n          <div class=\"blissCityName\">MedaYork<\/div>\r\n\r\n          <div class=\"blissCityStatus\">Medell\u00edn \u00b7 Active<\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n\r\n        <div class=\"blissCitySlide offline\" data-city=\"Miami\" data-active=\"false\">\r\n\r\n          <div class=\"blissMiniSkyline\">\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n          <\/div>\r\n\r\n          <div class=\"blissCityName\">Miami<\/div>\r\n\r\n          <div class=\"blissCityStatus\">Coming Soon<\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n\r\n        <div class=\"blissCitySlide offline\" data-city=\"Orlando\" data-active=\"false\">\r\n\r\n          <div class=\"blissMiniSkyline\">\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n          <\/div>\r\n\r\n          <div class=\"blissCityName\">Orlando<\/div>\r\n\r\n          <div class=\"blissCityStatus\">Coming Soon<\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n\r\n        <div class=\"blissCitySlide offline\" data-city=\"New York City\" data-active=\"false\">\r\n\r\n          <div class=\"blissMiniSkyline\">\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n            <div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div><div class=\"blissMiniBuilding\"><\/div>\r\n\r\n          <\/div>\r\n\r\n          <div class=\"blissCityName\">New York City<\/div>\r\n\r\n          <div class=\"blissCityStatus\">Coming Soon<\/div>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n\r\n\r\n      <button id=\"blissActivateHolo\" class=\"blissActivate\" type=\"button\">Activate Hologram<\/button>\r\n\r\n\r\n\r\n      <div id=\"blissProjectorDeck\" class=\"blissProjectorDeck\"><\/div>\r\n\r\n      <div class=\"blissProjectorCore\"><\/div>\r\n\r\n    <\/section>\r\n\r\n\r\n\r\n    <div class=\"blissCityControls\">\r\n\r\n      <button id=\"blissPrevCity\" class=\"blissArrow\" type=\"button\">\u2039<\/button>\r\n\r\n      <div id=\"blissDots\" class=\"blissDots\"><\/div>\r\n\r\n      <button id=\"blissNextCity\" class=\"blissArrow\" type=\"button\">\u203a<\/button>\r\n\r\n    <\/div>\r\n\r\n\r\n\r\n    <button id=\"tcEnterCity\" class=\"blissEnterBtn\" type=\"button\">Enter Bliss MedaYork<\/button>\r\n\r\n  <\/div>\r\n\r\n\r\n\r\n  <div id=\"tcEnterFlash\" class=\"tcEnterFlash\">Welcome to Bliss<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n\r\n<script>\r\n\r\n(function(){\r\n\r\n  const gate = document.getElementById('tcCityGate');\r\n\r\n  const overlay = document.getElementById('tc2Overlay');\r\n\r\n  const stage = document.getElementById('blissGateStage');\r\n\r\n  const activate = document.getElementById('blissActivateHolo');\r\n\r\n  const deck = document.getElementById('blissProjectorDeck');\r\n\r\n  const slides = Array.from(document.querySelectorAll('.blissCitySlide'));\r\n\r\n  const prev = document.getElementById('blissPrevCity');\r\n\r\n  const next = document.getElementById('blissNextCity');\r\n\r\n  const dotsWrap = document.getElementById('blissDots');\r\n\r\n  const enterBtn = document.getElementById('tcEnterCity');\r\n\r\n  const flash = document.getElementById('tcEnterFlash');\r\n\r\n  const viewer = document.getElementById('blissHoloViewer');\r\n\r\n\r\n\r\n  if(!gate || !stage || !slides.length || !enterBtn) return;\r\n\r\n\r\n\r\n  if(overlay && gate.parentElement !== overlay){\r\n\r\n    overlay.appendChild(gate);\r\n\r\n  }\r\n\r\n\r\n\r\n  const url = new URL(window.location.href);\r\n\r\n\r\n\r\n  if(url.searchParams.get('travelclub') === '1' && url.searchParams.get('city') === 'medayork'){\r\n\r\n    gate.classList.add('tcCityGateHidden');\r\n\r\n    return;\r\n\r\n  }\r\n\r\n\r\n\r\n  let index = 0;\r\n\r\n  let startX = 0;\r\n\r\n\r\n\r\n  function activateHologram(){\r\n\r\n    gate.classList.add('blissGateActive');\r\n\r\n    stage.classList.add('blissGateActive');\r\n\r\n  }\r\n\r\n\r\n\r\n  function showSlide(i){\r\n\r\n    index = (i + slides.length) % slides.length;\r\n\r\n\r\n\r\n    slides.forEach((slide, n)=>{\r\n\r\n      slide.classList.toggle('active', n === index);\r\n\r\n    });\r\n\r\n\r\n\r\n    Array.from(dotsWrap.children).forEach((dot, n)=>{\r\n\r\n      dot.classList.toggle('active', n === index);\r\n\r\n    });\r\n\r\n\r\n\r\n    const current = slides[index];\r\n\r\n    const city = current.dataset.city || '';\r\n\r\n    const isActive = current.dataset.active === 'true';\r\n\r\n\r\n\r\n    enterBtn.textContent = isActive ? 'Enter Bliss ' + city : city + ' Coming Soon';\r\n\r\n    enterBtn.classList.toggle('disabled', !isActive);\r\n\r\n  }\r\n\r\n\r\n\r\n  slides.forEach((_, i)=>{\r\n\r\n    const dot = document.createElement('span');\r\n\r\n    dot.className = 'blissDot' + (i === 0 ? ' active' : '');\r\n\r\n    dot.addEventListener('click', ()=>{\r\n\r\n      activateHologram();\r\n\r\n      showSlide(i);\r\n\r\n    });\r\n\r\n    dotsWrap.appendChild(dot);\r\n\r\n  });\r\n\r\n\r\n\r\n  if(activate) activate.addEventListener('click', activateHologram);\r\n\r\n  if(deck) deck.addEventListener('click', activateHologram);\r\n\r\n\r\n\r\n  if(prev) prev.addEventListener('click', ()=>showSlide(index - 1));\r\n\r\n  if(next) next.addEventListener('click', ()=>showSlide(index + 1));\r\n\r\n\r\n\r\n  if(viewer){\r\n\r\n    viewer.addEventListener('touchstart', e=>{\r\n\r\n      startX = e.touches[0].clientX;\r\n\r\n    }, {passive:true});\r\n\r\n\r\n\r\n    viewer.addEventListener('touchend', e=>{\r\n\r\n      const endX = e.changedTouches[0].clientX;\r\n\r\n      const diff = endX - startX;\r\n\r\n      if(Math.abs(diff) > 45){\r\n\r\n        if(diff < 0) showSlide(index + 1);\r\n\r\n        else showSlide(index - 1);\r\n\r\n      }\r\n\r\n    }, {passive:true});\r\n\r\n  }\r\n\r\n\r\n\r\n  enterBtn.addEventListener('click', ()=>{\r\n\r\n    const current = slides[index];\r\n\r\n    if(current.dataset.active !== 'true') return;\r\n\r\n\r\n\r\n    if(flash) flash.classList.add('show');\r\n\r\n\r\n\r\n    setTimeout(()=>{\r\n\r\n      url.searchParams.set('travelclub','1');\r\n\r\n      url.searchParams.set('city','medayork');\r\n\r\n      window.location.href = url.toString();\r\n\r\n    },1800);\r\n\r\n  });\r\n\r\n\r\n\r\n  showSlide(0);\r\n\r\n})();\r\n\r\n<\/script>\r\n\r\n<!-- ===== END BLISS TRAVEL CLUB \u2014 CLEAN ONE-SCREEN CITY GATE ===== -->\r\n\r\n<!-- ================== BOTTOM FIX \u2014 ASTRO WHEEL CENTERED + SAFE FLOW ================== -->\r\n<style>\r\n#astroWheel{\r\n  width:min(92vw,680px)!important;\r\n  height:min(92vw,680px)!important;\r\n  margin:30px auto 24px!important;\r\n  position:relative!important;\r\n  left:auto!important;\r\n  right:auto!important;\r\n  transform:translateX(-16px)!important;\r\n  border-radius:50%!important;\r\n  overflow:visible!important;\r\n  background:\r\n    radial-gradient(circle,rgba(244,210,122,.15) 0 9%,transparent 10%),\r\n    radial-gradient(circle,rgba(83,243,255,.12) 0 30%,transparent 31%),\r\n    radial-gradient(circle,rgba(255,255,255,.06) 0 46%,transparent 47%),\r\n    radial-gradient(circle,rgba(139,92,246,.20),rgba(2,5,13,.15) 64%,transparent 65%)!important;\r\n  box-shadow:\r\n    0 0 34px rgba(83,243,255,.18),\r\n    inset 0 0 80px rgba(139,92,246,.18)!important;\r\n}\r\n\r\n#astroWheel::before{\r\n  content:\"BLISS\"!important;\r\n  position:absolute!important;\r\n  left:50%!important;\r\n  top:50%!important;\r\n  width:118px!important;\r\n  height:118px!important;\r\n  transform:translate(-50%,-50%)!important;\r\n  border-radius:50%!important;\r\n  display:flex!important;\r\n  align-items:center!important;\r\n  justify-content:center!important;\r\n  color:#fff6cf!important;\r\n  font-weight:900!important;\r\n  letter-spacing:.18em!important;\r\n  font-size:.86rem!important;\r\n  background:radial-gradient(circle,rgba(244,210,122,.30),rgba(2,5,13,.96))!important;\r\n  border:1px solid rgba(244,210,122,.55)!important;\r\n  box-shadow:0 0 26px rgba(244,210,122,.38),0 0 60px rgba(83,243,255,.18)!important;\r\n  z-index:3!important;\r\n}\r\n\r\n.astro-signBtn{\r\n  position:absolute!important;\r\n  width:96px!important;\r\n  height:96px!important;\r\n  transform:translate(-50%,-50%)!important;\r\n  border-radius:26px!important;\r\n  border:1px solid rgba(255,255,255,.16)!important;\r\n  background:linear-gradient(180deg,rgba(12,20,48,.96),rgba(2,5,13,.98))!important;\r\n  color:#fff!important;\r\n  cursor:pointer!important;\r\n  box-shadow:0 0 20px rgba(83,243,255,.18)!important;\r\n}\r\n\r\n.astro-signBtn.active{\r\n  border-color:#f4d27a!important;\r\n  box-shadow:0 0 30px rgba(244,210,122,.48)!important;\r\n}\r\n\r\n.astro-symbol{display:block;font-size:2rem;}\r\n.astro-name{display:block;font-size:.62rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;}\r\n\r\n.astro-flowBox,\r\n.astro-stylePanel,\r\n.astro-resultBox{\r\n  max-width:920px;\r\n  margin:18px auto 0;\r\n  padding:20px;\r\n  border-radius:30px;\r\n}\r\n\r\n.astro-flowBox{\r\n  background:rgba(255,255,255,.045);\r\n  border:1px solid rgba(255,255,255,.12);\r\n}\r\n\r\n.astro-stylePanel{\r\n  background:rgba(0,0,0,.28);\r\n  border:1px solid var(--astroLine);\r\n  box-shadow:0 0 24px var(--astroShadow);\r\n}\r\n\r\n.astro-flowStep,\r\n.astro-stylePanelTitle{\r\n  color:#fff0c4;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.astro-stylePanelTitle{\r\n  color:var(--astroColor);\r\n}\r\n\r\n.astro-categoryGrid,\r\n.astro-styleGrid{\r\n  display:grid!important;\r\n  grid-template-columns:repeat(2,minmax(0,1fr))!important;\r\n  gap:14px!important;\r\n  margin:0!important;\r\n}\r\n\r\n.astro-catBtn,\r\n.astro-styleBtn{\r\n  min-height:92px!important;\r\n  border-radius:24px!important;\r\n  color:#fff!important;\r\n  text-align:left!important;\r\n  padding:18px!important;\r\n  cursor:pointer!important;\r\n  background:\r\n    radial-gradient(circle at top right,var(--astroGlow),transparent 36%),\r\n    linear-gradient(180deg,rgba(12,20,44,.96),rgba(5,8,18,.99))!important;\r\n  border:1px solid var(--astroLine)!important;\r\n  box-shadow:0 0 18px var(--astroShadow)!important;\r\n}\r\n\r\n.astro-catBtn.active,\r\n.astro-styleBtn.active{\r\n  border-color:var(--astroColor)!important;\r\n  box-shadow:0 0 30px var(--astroActive)!important;\r\n}\r\n\r\n.astro-btnTitle{\r\n  display:block;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n}\r\n\r\n.astro-btnCopy{\r\n  display:block;\r\n  margin-top:8px;\r\n  color:rgba(248,251,255,.72);\r\n  line-height:1.45;\r\n  font-size:.9rem;\r\n}\r\n\r\n.astro-resultBox{\r\n  background:rgba(0,0,0,.38);\r\n  border:1px solid var(--astroLine);\r\n  color:#fff;\r\n}\r\n\r\n@media(max-width:720px){\r\n  #astroWheel{\r\n    width:340px!important;\r\n    height:340px!important;\r\n    transform:translateX(-16px)!important;\r\n  }\r\n\r\n  #astroWheel::before{\r\n    width:84px!important;\r\n    height:84px!important;\r\n    font-size:.65rem!important;\r\n  }\r\n\r\n  .astro-signBtn{\r\n    width:72px!important;\r\n    height:72px!important;\r\n  }\r\n\r\n  .astro-symbol{font-size:1.45rem;}\r\n  .astro-name{font-size:.5rem;}\r\n\r\n  .astro-categoryGrid,\r\n  .astro-styleGrid{\r\n    grid-template-columns:1fr!important;\r\n  }\r\n}\r\n\r\n\/* ASTRO HOST RESULTS \u2014 CONTROL PANEL CONNECTION *\/\r\n.astro-host-results{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:18px;\r\n  margin-top:20px;\r\n}\r\n\r\n.astro-host-card{\r\n  overflow:hidden;\r\n  border-radius:28px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(83,243,255,.10),transparent 36%),\r\n    linear-gradient(180deg,rgba(12,20,44,.97),rgba(3,7,17,.99));\r\n  border:1px solid rgba(83,243,255,.22);\r\n  box-shadow:\r\n    0 0 22px rgba(83,243,255,.12),\r\n    inset 0 0 28px rgba(139,92,246,.05);\r\n}\r\n\r\n.astro-host-image{\r\n  width:100%;\r\n  min-height:320px;\r\n  background-color:#050b18;\r\n  background-position:center;\r\n  background-size:contain;\r\n  background-repeat:no-repeat;\r\n}\r\n\r\n.astro-host-content{padding:20px;}\r\n\r\n.astro-host-type{\r\n  color:#fff0c4;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.astro-host-name{\r\n  margin:8px 0 0;\r\n  color:#fff;\r\n  font-size:1.6rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.astro-host-location{\r\n  margin-top:9px;\r\n  color:#9eefff;\r\n  font-weight:800;\r\n}\r\n\r\n.astro-host-price{\r\n  display:inline-flex;\r\n  margin-top:10px;\r\n  padding:6px 10px;\r\n  border-radius:999px;\r\n  background:rgba(244,210,122,.10);\r\n  border:1px solid rgba(244,210,122,.28);\r\n  color:#fff0c4;\r\n  font-weight:900;\r\n}\r\n\r\n.astro-host-description{\r\n  margin:14px 0 0;\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.7;\r\n}\r\n\r\n.astro-empty{\r\n  padding:18px;\r\n  border-radius:20px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.10);\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.7;\r\n}\r\n\r\n@media(min-width:850px){\r\n  .astro-host-results{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  var SIGNS=[\r\n    {name:\"Aries\",symbol:\"\u2648\",styles:[\"Romantic\",\"Views\",\"Wild\",\"Exotic\"]},\r\n    {name:\"Taurus\",symbol:\"\u2649\",styles:[\"Discover\",\"Archeology\",\"Gastronomic\",\"Savage\"]},\r\n    {name:\"Gemini\",symbol:\"\u264a\",styles:[\"Futuristic\",\"Relax\",\"Spa\",\"Nature\"]},\r\n    {name:\"Cancer\",symbol:\"\u264b\",styles:[\"Nite\",\"Relax\",\"Elegant\",\"Nature\"]},\r\n    {name:\"Leo\",symbol:\"\u264c\",styles:[\"Vibrant\",\"Mystery\",\"Gastronomic\",\"Nature\"]},\r\n    {name:\"Virgo\",symbol:\"\u264d\",styles:[\"Organized\",\"Mystery\",\"Artistic\",\"Luxury\"]},\r\n    {name:\"Libra\",symbol:\"\u264e\",styles:[\"Romantic\",\"Relax\",\"Organized\",\"Luxury\"]},\r\n    {name:\"Scorpio\",symbol:\"\u264f\",styles:[\"Discover\",\"Archeology\",\"Organized\",\"Gastronomic\"]},\r\n    {name:\"Sagittarius\",symbol:\"\u2650\",styles:[\"Discover\",\"Archeology\",\"Gastronomic\",\"Savage\"]},\r\n    {name:\"Capricorn\",symbol:\"\u2651\",styles:[\"Vibrant\",\"Relax\",\"Elegant\",\"Luxury\"]},\r\n    {name:\"Aquarius\",symbol:\"\u2652\",styles:[\"Discover\",\"Archeology\",\"Gastronomic\",\"Savage\"]},\r\n    {name:\"Pisces\",symbol:\"\u2653\",styles:[\"Artistic\",\"Relax\",\"Spa\",\"Nature\"]}\r\n  ];\r\n\r\n  var CATS=[\r\n  {\r\n    name:\"Accommodations\",\r\n    copy:\"Choose an accommodation host matched to your sign and travel style.\",\r\n    color:\"#53f3ff\"\r\n  },\r\n  {\r\n    name:\"Restaurants\",\r\n    copy:\"Choose a restaurant host matched to your sign and travel style.\",\r\n    color:\"#f4d27a\"\r\n  },\r\n  {\r\n    name:\"Entertainment\",\r\n    copy:\"Choose an entertainment host matched to your sign and travel style.\",\r\n    color:\"#cf56ff\"\r\n  },\r\n  {\r\n    name:\"VIP\",\r\n    copy:\"Choose a VIP host matched to your sign and travel style.\",\r\n    color:\"#70f7a2\"\r\n  }\r\n];\r\n  var currentSign=null;\r\n  var currentCat=null;\r\n\r\n  var ASTRO_STORAGE_KEYS=[\r\n    \"BLISS_TRAVEL_CLUB_HOSTS_V5\",\r\n    \"BLISS_TRAVEL_CLUB_HOSTS_V4\",\r\n    \"BLISS_TRAVEL_CLUB_ITEMS_V3\"\r\n  ];\r\n\r\n  function astroEscape(value){\r\n    return String(value||\"\").replace(\/[&<>\"']\/g,function(char){\r\n      return {\r\n        \"&\":\"&amp;\",\r\n        \"<\":\"&lt;\",\r\n        \">\":\"&gt;\",\r\n        '\"':\"&quot;\",\r\n        \"'\":\"&#039;\"\r\n      }[char];\r\n    });\r\n  }\r\n\r\n  function astroNormalize(value){\r\n    return String(value||\"\").trim().toLowerCase();\r\n  }\r\n\r\n function astroGetHosts() {\r\n  return Array.isArray(\r\n    window.travelClubInventory\r\n  )\r\n    ? window.travelClubInventory\r\n    : [];\r\n}\r\n\r\n function astroFindHosts(\r\n  sign,\r\n  style,\r\n  category\r\n) {\r\n  return astroGetHosts()\r\n    .filter(function (host) {\r\n      if (!host) {\r\n        return false;\r\n      }\r\n\r\n      const isActive =\r\n        host.active !== false &&\r\n        host.active !== 0 &&\r\n        host.active !== \"0\";\r\n\r\n      if (!isActive) {\r\n        return false;\r\n      }\r\n\r\n      const hostSection =\r\n        astroNormalize(\r\n          host.section ||\r\n          host.mainSection ||\r\n          \"\"\r\n        );\r\n\r\n      const hostSign =\r\n        astroNormalize(\r\n          host.sign ||\r\n          \"\"\r\n        );\r\n\r\n      const hostStyle =\r\n        astroNormalize(\r\n          host.style ||\r\n          host.suboption ||\r\n          host.astroSuboption ||\r\n          \"\"\r\n        );\r\n\r\n      const hostCategory =\r\n        astroNormalize(\r\n          host.category ||\r\n          host.option ||\r\n          host.astroOption ||\r\n          \"\"\r\n        );\r\n\r\n      return (\r\n        hostSection === \"astro\" &&\r\n        hostSign === astroNormalize(sign) &&\r\n        hostStyle === astroNormalize(style) &&\r\n        hostCategory ===\r\n          astroNormalize(category)\r\n      );\r\n    })\r\n    .sort(function (a, b) {\r\n      return Number(a.order || 10) -\r\n        Number(b.order || 10);\r\n    });\r\n}\r\n  function astroFindHost(hostId){\r\n    return astroGetHosts().find(function(host){\r\n      return String(host.id)===String(hostId);\r\n    });\r\n  }\r\n\r\n  function astroOpenWebsite(hostId){\r\n    var host=astroFindHost(hostId);\r\n    if(!host){\r\n      alert(\"Host information was not found.\");\r\n      return;\r\n    }\r\n\r\n    var url=host.websiteUrl||host.url||\"\";\r\n    if(!url){\r\n      alert(\"This host does not have a direct website yet.\");\r\n      return;\r\n    }\r\n\r\n    window.open(url,\"_blank\");\r\n  }\r\n\r\n  function astroSaveToJourney(hostId){\r\n    var host=astroFindHost(hostId);\r\n    if(!host){\r\n      alert(\"Host information was not found.\");\r\n      return;\r\n    }\r\n\r\n    var journey=[];\r\n    try{\r\n      journey=JSON.parse(sessionStorage.getItem(\"GGG_TRAVEL_CLUB_V3_JOURNEY\")||\"[]\");\r\n      if(!Array.isArray(journey)) journey=[];\r\n    }catch(error){\r\n      journey=[];\r\n    }\r\n\r\n    var exists=journey.some(function(item){\r\n      return String(item.hostId||\"\")===String(host.id);\r\n    });\r\n\r\n    if(exists){\r\n      alert(\"This host is already saved in My Journey.\");\r\n      return;\r\n    }\r\n\r\n    journey.push({\r\n      hostId:host.id,\r\n      type:host.type||host.category||\"Astro Host\",\r\n      title:host.name||host.title||\"Astro Host\",\r\n      location:host.location||\"Medell\u00edn, Colombia\",\r\n      time:\"Astro Recommendation\",\r\n      status:\"Saved\",\r\n      image:host.image||\"\",\r\n      description:host.description||host.desc||\"\",\r\n      websiteUrl:host.websiteUrl||host.url||\"\",\r\n      reserveUrl:host.reserveUrl||\"\",\r\n      sign:host.sign||\"\",\r\n      style:host.style||\"\",\r\n      category:host.category||\"\"\r\n    });\r\n\r\n    sessionStorage.setItem(\r\n      \"GGG_TRAVEL_CLUB_V3_JOURNEY\",\r\n      JSON.stringify(journey)\r\n    );\r\n\r\n    alert(\"Host saved to My Journey.\");\r\n  }\r\n\r\n  function astroReserve(hostId){\r\n    var host=astroFindHost(hostId);\r\n    if(!host){\r\n      alert(\"Host information was not found.\");\r\n      return;\r\n    }\r\n\r\n    var pms=window.gggPmsData||{};\r\n    var owned=pms.owned||{};\r\n    var loggedIn=!!pms.loggedIn;\r\n\r\n    if(!loggedIn){\r\n      window.location.href=(pms.urls&&pms.urls.login)\r\n        ? pms.urls.login\r\n        : \"\/GGG\/login\/\";\r\n      return;\r\n    }\r\n\r\n    if(!owned[2]){\r\n      window.location.href=host.buyLevel2Url||\"\/GGG\/responsable-reservations\/\";\r\n      return;\r\n    }\r\n\r\n    if(host.reserveUrl){\r\n      window.location.href=host.reserveUrl;\r\n      return;\r\n    }\r\n\r\n    if(host.checkoutUrl){\r\n      window.location.href=host.checkoutUrl;\r\n      return;\r\n    }\r\n\r\n    if(typeof window.openReservePopup===\"function\"){\r\n      window.openReservePopup();\r\n      return;\r\n    }\r\n\r\n    alert(\"This host is ready, but its reservation URL has not been added yet.\");\r\n  }\r\n\r\n  function E(){\r\n    return{\r\n      overlay:document.getElementById(\"tc2Overlay\"),\r\n      page:document.getElementById(\"tc2AstroPage\"),\r\n      card:document.getElementById(\"tc2MainAstro\"),\r\n      wheel:document.getElementById(\"astroWheel\"),\r\n      title:document.getElementById(\"astroTitle\"),\r\n      cats:document.getElementById(\"astroCategoryGrid\"),\r\n      styles:document.getElementById(\"astroStyleGrid\")\r\n    };\r\n  }\r\n\r\n  function setColor(el,color){\r\n    el.style.setProperty(\"--astroColor\",color);\r\n    el.style.setProperty(\"--astroLine\",color+\"99\");\r\n    el.style.setProperty(\"--astroGlow\",color+\"33\");\r\n    el.style.setProperty(\"--astroShadow\",color+\"22\");\r\n    el.style.setProperty(\"--astroActive\",color+\"66\");\r\n  }\r\n\r\n  function openAstro(){\r\n    var e=E();\r\n    if(!e.page || !e.overlay) return;\r\n\r\n    document.querySelectorAll(\"#tc2Overlay .tc2-page\").forEach(function(p){\r\n      p.classList.remove(\"active\");\r\n      p.style.display=\"none\";\r\n    });\r\n\r\n    e.page.classList.add(\"active\");\r\n    e.page.style.display=\"block\";\r\n    e.overlay.style.display=\"block\";\r\n    e.overlay.scrollTop=0;\r\n  }\r\n\r\n  function clearDynamic(){\r\n    document.querySelectorAll(\".astro-flowBox,.astro-stylePanel,.astro-resultBox\").forEach(function(x){\r\n      x.remove();\r\n    });\r\n  }\r\n\r\n  function scrollToElement(el){\r\n    setTimeout(function(){\r\n      if(el){el.scrollIntoView({behavior:\"smooth\",block:\"start\"});}\r\n    },80);\r\n  }\r\n\r\n  function renderSigns(){\r\n    var e=E();\r\n    if(!e.wheel||!e.title||!e.cats||!e.styles)return;\r\n\r\n    currentSign=null;\r\n    currentCat=null;\r\n\r\n    e.title.textContent=\"Choose Your Sign\";\r\n    e.wheel.innerHTML=\"\";\r\n    e.cats.innerHTML=\"\";\r\n    e.styles.innerHTML=\"\";\r\n    clearDynamic();\r\n\r\n    var size=e.wheel.offsetWidth||680;\r\n    var center=size\/2;\r\n    var radius=window.innerWidth<=720?136:286;\r\n\r\n    SIGNS.forEach(function(sign,i){\r\n      var angle=((i\/SIGNS.length)*Math.PI*2)-Math.PI\/2;\r\n      var btn=document.createElement(\"button\");\r\n      btn.type=\"button\";\r\n      btn.className=\"astro-signBtn\";\r\n      btn.style.left=(center+Math.cos(angle)*radius)+\"px\";\r\n      btn.style.top=(center+Math.sin(angle)*radius)+\"px\";\r\n      btn.innerHTML='<span class=\"astro-symbol\">'+sign.symbol+'<\/span><span class=\"astro-name\">'+sign.name+'<\/span>';\r\n      btn.onclick=function(){selectSign(sign,btn);};\r\n      e.wheel.appendChild(btn);\r\n    });\r\n  }\r\n\r\n  function selectSign(sign,btn){\r\n    var e=E();\r\n    if(!e.title || !e.cats || !e.styles) return;\r\n\r\n    currentSign=sign;\r\n    currentCat=null;\r\n\r\n    document.querySelectorAll(\".astro-signBtn\").forEach(function(x){\r\n      x.classList.remove(\"active\");\r\n    });\r\n    btn.classList.add(\"active\");\r\n\r\n    e.title.textContent=sign.symbol+\" \"+sign.name+\" Travel Portal\";\r\n    e.cats.innerHTML=\"\";\r\n    e.styles.innerHTML=\"\";\r\n    clearDynamic();\r\n\r\n    var box=document.createElement(\"div\");\r\n    box.className=\"astro-flowBox\";\r\n    box.innerHTML='<div class=\"astro-flowStep\">Step 2 \u00b7 Choose one main option<\/div>';\r\n\r\n    var grid=document.createElement(\"div\");\r\n    grid.className=\"astro-categoryGrid\";\r\n\r\n    CATS.forEach(function(cat){\r\n      var b=document.createElement(\"button\");\r\n      b.type=\"button\";\r\n      b.className=\"astro-catBtn\";\r\n      setColor(b,cat.color);\r\n      b.innerHTML='<span class=\"astro-btnTitle\">'+cat.name+'<\/span><span class=\"astro-btnCopy\">'+cat.copy+'<\/span>';\r\n      b.onclick=function(){selectCat(cat,b,box);};\r\n      grid.appendChild(b);\r\n    });\r\n\r\n    box.appendChild(grid);\r\n    e.title.insertAdjacentElement(\"afterend\",box);\r\n    scrollToElement(box);\r\n  }\r\n\r\n  function selectCat(cat,btn,catBox){\r\n    if(!currentSign || !catBox) return;\r\n\r\n    currentCat=cat;\r\n\r\n    catBox.querySelectorAll(\".astro-catBtn\").forEach(function(x){\r\n      x.classList.remove(\"active\");\r\n    });\r\n    btn.classList.add(\"active\");\r\n\r\n    document.querySelectorAll(\".astro-stylePanel,.astro-resultBox\").forEach(function(x){\r\n      x.remove();\r\n    });\r\n\r\n    var panel=document.createElement(\"div\");\r\n    panel.className=\"astro-stylePanel\";\r\n    setColor(panel,cat.color);\r\n    panel.innerHTML='<div class=\"astro-stylePanelTitle\">Step 3 \u00b7 Choose one '+currentSign.name+' suboption for '+cat.name+'<\/div>';\r\n\r\n    var styleGrid=document.createElement(\"div\");\r\n    styleGrid.className=\"astro-styleGrid\";\r\n\r\n    currentSign.styles.forEach(function(style){\r\n      var b=document.createElement(\"button\");\r\n      b.type=\"button\";\r\n      b.className=\"astro-styleBtn\";\r\n      setColor(b,cat.color);\r\n      b.innerHTML='<span class=\"astro-btnTitle\">'+style+'<\/span><span class=\"astro-btnCopy\">'+cat.name+\" \u00b7 \"+style+'<\/span>';\r\n      b.onclick=function(){showResult(style,b,panel);};\r\n      styleGrid.appendChild(b);\r\n    });\r\n\r\n    panel.appendChild(styleGrid);\r\n    catBox.insertAdjacentElement(\"afterend\",panel);\r\n    scrollToElement(panel);\r\n  }\r\n\r\n  function showResult(style,btn,panel){\r\n    if(!currentSign || !currentCat || !panel) return;\r\n\r\n    panel.querySelectorAll(\".astro-styleBtn\").forEach(function(x){\r\n      x.classList.remove(\"active\");\r\n    });\r\n    btn.classList.add(\"active\");\r\n\r\n    panel.querySelectorAll(\".astro-resultBox\").forEach(function(x){\r\n      x.remove();\r\n    });\r\n\r\n    var result=document.createElement(\"div\");\r\n    result.className=\"astro-resultBox\";\r\n    setColor(result,currentCat.color);\r\n\r\n    var hosts=astroFindHosts(\r\n      currentSign.name,\r\n      style,\r\n      currentCat.name\r\n    );\r\n\r\n    var heading=\r\n      astroEscape(currentSign.symbol)+\" \"+\r\n      astroEscape(currentSign.name)+\" \u00b7 \"+\r\n      astroEscape(currentCat.name)+\" \u00b7 \"+\r\n      astroEscape(style);\r\n\r\n    if(!hosts.length){\r\n      result.innerHTML=\r\n        \"<h3>\"+heading+\"<\/h3>\"+\r\n        '<div class=\"astro-empty\">'+\r\n          \"<strong>No active hosts are saved for this exact path yet.<\/strong><br>\"+\r\n          \"Control panel path: Astro \u2192 \"+\r\n          astroEscape(currentSign.name)+\" \u2192 \"+\r\n          astroEscape(style)+\" \u2192 \"+\r\n          astroEscape(currentCat.name)+\r\n        \"<\/div>\";\r\n\r\n      panel.appendChild(result);\r\n      scrollToElement(result);\r\n      return;\r\n    }\r\n\r\n    result.innerHTML=\r\n      \"<h3>\"+heading+\"<\/h3>\"+\r\n      '<div class=\"astro-host-results\">'+\r\n      hosts.map(function(host){\r\n        var image=host.image||\r\n          \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n\r\n        return (\r\n          '<article class=\"astro-host-card\">'+\r\n            '<div class=\"astro-host-image\" style=\"background-image:url(\\''+\r\n              astroEscape(image)+\r\n            '\\')\"><\/div>'+\r\n            '<div class=\"astro-host-content\">'+\r\n              '<div class=\"astro-host-type\">'+\r\n                astroEscape(host.type||currentCat.name)+\r\n              '<\/div>'+\r\n              '<h4 class=\"astro-host-name\">'+\r\n                astroEscape(host.name||host.title||\"Astro Host\")+\r\n              '<\/h4>'+\r\n              (host.location\r\n                ? '<div class=\"astro-host-location\">\ud83d\udccd '+astroEscape(host.location)+'<\/div>'\r\n                : '')+\r\n              (host.price\r\n                ? '<div class=\"astro-host-price\">'+astroEscape(host.price)+'<\/div>'\r\n                : '')+\r\n              '<p class=\"astro-host-description\">'+\r\n                astroEscape(host.description||host.desc||\"\")+\r\n              '<\/p>'+\r\n              '<div class=\"tc2-btnRow\">'+\r\n                '<button class=\"tc2-btn tc2-btn-cyan astro-website-btn\" type=\"button\" data-host-id=\"'+\r\n                  astroEscape(host.id)+\r\n                '\">Visit Host Website<\/button>'+\r\n                '<button class=\"tc2-btn tc2-btn-gold astro-reserve-btn\" type=\"button\" data-host-id=\"'+\r\n                  astroEscape(host.id)+\r\n                '\">Reserve With Bliss<\/button>'+\r\n              '<\/div>'+\r\n            '<\/div>'+\r\n          '<\/article>'\r\n        );\r\n      }).join(\"\")+\r\n      \"<\/div>\";\r\n\r\n    panel.appendChild(result);\r\n\r\n    result.querySelectorAll(\".astro-website-btn\").forEach(function(button){\r\n      button.addEventListener(\"click\",function(){\r\n        astroOpenWebsite(button.getAttribute(\"data-host-id\"));\r\n      });\r\n    });\r\n\r\n\r\n    result.querySelectorAll(\".astro-reserve-btn\").forEach(function(button){\r\n      button.addEventListener(\"click\",function(){\r\n        astroReserve(button.getAttribute(\"data-host-id\"));\r\n      });\r\n    });\r\n\r\n    scrollToElement(result);\r\n  }\r\n\r\n  window.buildAstroWheel=renderSigns;\r\n\r\n  function connect(){\r\n    var e=E();\r\n    if(!e.card||!e.page||!e.wheel){\r\n      setTimeout(connect,300);\r\n      return;\r\n    }\r\n\r\n    e.card.addEventListener(\"click\",function(ev){\r\n      ev.preventDefault();\r\n      ev.stopImmediatePropagation();\r\n      openAstro();\r\n      renderSigns();\r\n    },true);\r\n\r\n    renderSigns();\r\n  }\r\n\r\n  if(document.readyState===\"loading\"){\r\n    document.addEventListener(\"DOMContentLoaded\",connect);\r\n  }else{\r\n    connect();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function(){\r\n  \"use strict\";\r\n\r\n  const GGG_HOME_URL =\r\n    \"https:\/\/godsgalaxygame.com\/GGG\/\";\r\n\r\n  \/*\r\n   * Cleanly changes Travel Club pages.\r\n   *\r\n   * IMPORTANT:\r\n   * Astro previously added inline display:none to every page.\r\n   * Those inline styles prevented Explore Medell\u00edn, Journey,\r\n   * Services, and Story from reopening without refreshing.\r\n   *\/\r\n  function forcePage(pageId){\r\n    const overlay =\r\n      document.getElementById(\"tc2Overlay\");\r\n\r\n    const pages =\r\n      document.querySelectorAll(\r\n        \"#tc2Overlay .tc2-page\"\r\n      );\r\n\r\n    pages.forEach(function(page){\r\n      page.classList.remove(\"active\");\r\n\r\n      \/*\r\n       * Remove the inline display value left by Astro.\r\n       * Normal .tc2-page CSS will control visibility again.\r\n       *\/\r\n      page.style.removeProperty(\"display\");\r\n    });\r\n\r\n    const target =\r\n      document.getElementById(pageId);\r\n\r\n    if(target){\r\n  target.classList.add(\"active\");\r\n  target.style.removeProperty(\"display\");\r\n}\r\n\r\n\/*\r\n * EXPLORE MEDELL\u00cdN:\r\n * Open the real orbit only after the Explore page\r\n * has been activated and made visible.\r\n *\/\r\nif(pageId === \"tc2ExplorePage\"){\r\n\r\n  let exploreAttempts = 0;\r\n\r\n  function startExploreOrbit(){\r\n\r\n    exploreAttempts++;\r\n\r\n    const guideGrid =\r\n      document.getElementById(\r\n        \"tc2GuideGrid\"\r\n      );\r\n\r\n    const rendererReady =\r\n      window.tc2ExploreV6 &&\r\n      typeof window.tc2ExploreV6\r\n        .renderGuides === \"function\";\r\n\r\n    if(\r\n      guideGrid &&\r\n      rendererReady\r\n    ){\r\n      window.tc2ExploreV6\r\n        .renderGuides();\r\n\r\n      requestAnimationFrame(\r\n        function(){\r\n          window.dispatchEvent(\r\n            new Event(\"resize\")\r\n          );\r\n        }\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * The renderer may appear slightly later because\r\n     * this page contains many large scripts.\r\n     *\/\r\n    if(exploreAttempts < 50){\r\n      setTimeout(\r\n        startExploreOrbit,\r\n        100\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\n  startExploreOrbit();\r\n\r\n} \/\/ closes if(pageId === \"tc2ExplorePage\")\r\n  \/*\r\n   * Clean all Astro inline page styles.\r\n   *\/\r\n  function cleanAstroPageStyles(){\r\n    document\r\n      .querySelectorAll(\r\n        \"#tc2Overlay .tc2-page\"\r\n      )\r\n      .forEach(function(page){\r\n        page.style.removeProperty(\r\n          \"display\"\r\n        );\r\n      });\r\n  }\r\n\r\n  const astroBtn =\r\n    document.getElementById(\r\n      \"tc2MainAstro\"\r\n    );\r\n\r\n  if(astroBtn){\r\n    astroBtn.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n        event.preventDefault();\r\n        event.stopImmediatePropagation();\r\n\r\n        forcePage(\r\n          \"tc2AstroPage\"\r\n        );\r\n\r\n        if(\r\n          typeof window.buildAstroWheel ===\r\n          \"function\"\r\n        ){\r\n          window.buildAstroWheel();\r\n        }\r\n\r\n        if(\r\n          typeof window.renderSigns ===\r\n          \"function\"\r\n        ){\r\n          window.renderSigns();\r\n        }\r\n      },\r\n      true\r\n    );\r\n  }\r\n\r\n  \r\n  \/*\r\n   * Extra protection for all main and floating navigation.\r\n   * This ensures every section can open after visiting Astro.\r\n   *\/\r\n  const pageButtons = [\r\n    {\r\n      selectors:[\r\n        \"#tc2MainExplore\",\r\n        \"#tc2FloatExplore\"\r\n      ],\r\n      pageId:\"tc2ExplorePage\"\r\n    },\r\n    {\r\n      selectors:[\r\n        \"#tc2MainJourney\",\r\n        \"#tc2FloatJourney\"\r\n      ],\r\n      pageId:\"tc2JourneyPage\"\r\n    },\r\n    {\r\n      selectors:[\r\n        \"#tc2MainServices\",\r\n        \"#tc2FloatServices\"\r\n      ],\r\n      pageId:\"tc2ServicesPage\"\r\n    },\r\n    {\r\n      selectors:[\r\n        \"#tc2MainStory\",\r\n        \"#tc2FloatStory\"\r\n      ],\r\n      pageId:\"tc2StoryPage\"\r\n    }\r\n  ];\r\n\r\n  pageButtons.forEach(function(config){\r\n    config.selectors.forEach(\r\n      function(selector){\r\n        const button =\r\n          document.querySelector(\r\n            selector\r\n          );\r\n\r\n        if(!button){\r\n          return;\r\n        }\r\n\r\n        button.addEventListener(\r\n          \"click\",\r\n          function(){\r\n            \/*\r\n             * Do not interfere with a locked membership card.\r\n             *\/\r\n            const locked =\r\n              button.classList.contains(\r\n                \"is-locked\"\r\n              ) ||\r\n              button.classList.contains(\r\n                \"tc2-vault-locked\"\r\n              ) ||\r\n              button.getAttribute(\r\n                \"aria-disabled\"\r\n              ) === \"true\";\r\n\r\n            if(locked){\r\n              return;\r\n            }\r\n\r\n            cleanAstroPageStyles();\r\n\r\n            \/*\r\n             * Let the normal Travel Club click handler run,\r\n             * then make certain the destination is visible.\r\n             *\/\r\n            setTimeout(function(){\r\n              forcePage(\r\n                config.pageId\r\n              );\r\n            },0);\r\n          },\r\n          false\r\n        );\r\n      }\r\n    );\r\n  });\r\n\r\n  console.log(\r\n    \"[Bliss Travel Club] Astro back navigation repaired.\"\r\n  );\r\n});\r\n<\/script>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n if(\r\n  window.tc2ExploreV6 &&\r\n  typeof window.tc2ExploreV6.renderGuides === \"function\"\r\n){\r\n  return;\r\n}\r\n\r\n  const leaf=(id,label,level,guide,option,suboption,legacy,copy,icon)=>({\r\n    id,label,level,icon:icon||\"\u2726\",copy:copy||\"Open connected Medell\u00edn hosts and experiences.\",\r\n    connection:{guide,option,suboption:suboption||\"Featured\"},\r\n    legacyConnections:Array.isArray(legacy)?legacy:[]\r\n  });\r\n\r\n  const group=(id,label,level,icon,type,copy,children)=>({\r\n    id,label,level,icon,type,copy,children\r\n  });\r\n\r\n  const L=(guide,option,suboption)=>({guide,option,suboption:suboption||\"Featured\"});\r\n\r\n  const STRUCTURE={\r\n    id:\"explore-medellin\",\r\n    label:\"Explore Medell\u00edn\",\r\n    levels:{\r\n      2:[\r\n        group(\"first-time-visitor\",\"First Time Visitor\",2,\"\ud83d\ude80\",\"Arrival & Orientation\",\"Practical city guidance for a confident first experience in Medell\u00edn.\",[\r\n          leaf(\"city-conditions\",\"City Conditions\",2,\"First Time Visitor\",\"City Conditions\",\"Featured\",[L(\"First Time Visitor\",\"Start Here \/ Before You Arrive\"),L(\"First Time Visitor\",\"Quick Tips\")],\"Current conditions, basic orientation and what to know before exploring.\"),\r\n          leaf(\"getting-around\",\"Getting Around\",2,\"First Time Visitor\",\"Getting Around\",\"Featured\",[L(\"First Time Visitor\",\"Maps\"),L(\"First Time Visitor\",\"Arrival Information\")],\"Maps, airport information and simple ways to move around the city.\"),\r\n          leaf(\"safety\",\"Safety\",2,\"First Time Visitor\",\"Safety\",\"Featured\",[L(\"First Time Visitor\",\"Quick Tips\")],\"Local awareness, practical precautions and safer travel decisions.\"),\r\n          leaf(\"travel-essentials\",\"Travel Essentials\",2,\"First Time Visitor\",\"Travel Essentials\",\"Featured\",[L(\"First Time Visitor\",\"Start Here \/ Before You Arrive\"),L(\"First Time Visitor\",\"Arrival Information\")],\"The essential information needed before and during the trip.\")\r\n        ]),\r\n\r\n        group(\"accommodations\",\"Accommodations\",2,\"\ud83c\udfe8\",\"Places to Stay\",\"Choose a Medell\u00edn stay style, then open connected properties and hosts.\",[\r\n          group(\"high-rise\",\"High-Rise\",2,\"\ud83c\udfd9\ufe0f\",\"Urban Stays\",\"Modern towers, city views and premium urban stays.\",[\r\n            leaf(\"high-rise-1-3\",\"1\u20133 Days\",2,\"Accommodations\",\"High-Rise\",\"1\u20133 Days\",[],\"Short high-rise stays.\"),\r\n            leaf(\"high-rise-4-6\",\"4\u20136 Days\",2,\"Accommodations\",\"High-Rise\",\"4\u20136 Days\",[],\"Mid-length high-rise stays.\"),\r\n            leaf(\"high-rise-7\",\"7 Days\",2,\"Accommodations\",\"High-Rise\",\"7 Days\",[],\"One-week high-rise stays.\"),\r\n            leaf(\"high-rise-month\",\"1 Month\",2,\"Accommodations\",\"High-Rise\",\"1 Month\",[],\"Monthly high-rise stays.\")\r\n          ]),\r\n          group(\"historic-stays\",\"Historic\",2,\"\ud83c\udfdb\ufe0f\",\"Character Stays\",\"Character-rich lodging connected to local history.\",[\r\n            leaf(\"historic-1-3\",\"1\u20133 Days\",2,\"Accommodations\",\"Historic\",\"1\u20133 Days\"),leaf(\"historic-4-6\",\"4\u20136 Days\",2,\"Accommodations\",\"Historic\",\"4\u20136 Days\"),leaf(\"historic-7\",\"7 Days\",2,\"Accommodations\",\"Historic\",\"7 Days\"),leaf(\"historic-month\",\"1 Month\",2,\"Accommodations\",\"Historic\",\"1 Month\")\r\n          ]),\r\n          group(\"eco-stay\",\"Eco-Stay\",2,\"\ud83c\udf31\",\"Nature Stays\",\"Nature-connected lodging and responsible stays.\",[\r\n            leaf(\"eco-1-3\",\"1\u20133 Days\",2,\"Accommodations\",\"Eco-Stay\",\"1\u20133 Days\"),leaf(\"eco-4-6\",\"4\u20136 Days\",2,\"Accommodations\",\"Eco-Stay\",\"4\u20136 Days\"),leaf(\"eco-7\",\"7 Days\",2,\"Accommodations\",\"Eco-Stay\",\"7 Days\"),leaf(\"eco-month\",\"1 Month\",2,\"Accommodations\",\"Eco-Stay\",\"1 Month\")\r\n          ]),\r\n          group(\"mansions\",\"Mansions\",2,\"\ud83c\udfe1\",\"Private Luxury\",\"Large-format private stays for elevated group experiences.\",[\r\n            leaf(\"mansions-1-3\",\"1\u20133 Days\",2,\"Accommodations\",\"Mansions\",\"1\u20133 Days\"),leaf(\"mansions-4-6\",\"4\u20136 Days\",2,\"Accommodations\",\"Mansions\",\"4\u20136 Days\"),leaf(\"mansions-7\",\"7 Days\",2,\"Accommodations\",\"Mansions\",\"7 Days\"),leaf(\"mansions-month\",\"1 Month\",2,\"Accommodations\",\"Mansions\",\"1 Month\")\r\n          ])\r\n        ]),\r\n\r\n        group(\"transportation\",\"Transportation\",2,\"\ud83d\ude98\",\"Mobility & Arrival\",\"Choose a transportation type and the purpose of the trip.\",[\r\n          group(\"heli\",\"Heli\",2,\"\ud83d\ude81\",\"Air Mobility\",\"Helicopter transportation and aerial mobility.\",[\r\n            leaf(\"heli-around\",\"Around\",2,\"Transportation\",\"Heli\",\"Around\"),leaf(\"heli-goto\",\"Go-To\",2,\"Transportation\",\"Heli\",\"Go-To\"),leaf(\"heli-emergency\",\"Emergency\",2,\"Transportation\",\"Heli\",\"Emergency\"),leaf(\"heli-adventure\",\"Adventure\",2,\"Transportation\",\"Heli\",\"Adventure\")\r\n          ]),\r\n          group(\"yacht\",\"Yacht\",2,\"\ud83d\udee5\ufe0f\",\"Water Mobility\",\"Private water transportation and destination routes.\",[\r\n            leaf(\"yacht-around\",\"Around\",2,\"Transportation\",\"Yacht\",\"Around\"),leaf(\"yacht-goto\",\"Go-To\",2,\"Transportation\",\"Yacht\",\"Go-To\"),leaf(\"yacht-emergency\",\"Emergency\",2,\"Transportation\",\"Yacht\",\"Emergency\"),leaf(\"yacht-adventure\",\"Adventure\",2,\"Transportation\",\"Yacht\",\"Adventure\")\r\n          ]),\r\n          group(\"car\",\"Car\",2,\"\ud83d\ude97\",\"Independent Mobility\",\"Vehicle options for independent movement.\",[\r\n            leaf(\"car-around\",\"Around\",2,\"Transportation\",\"Car\",\"Around\"),leaf(\"car-goto\",\"Go-To\",2,\"Transportation\",\"Car\",\"Go-To\"),leaf(\"car-emergency\",\"Emergency\",2,\"Transportation\",\"Car\",\"Emergency\"),leaf(\"car-adventure\",\"Adventure\",2,\"Transportation\",\"Car\",\"Adventure\")\r\n          ]),\r\n          group(\"driver\",\"Driver\",2,\"\ud83e\uddd1\u200d\u2708\ufe0f\",\"Private Mobility\",\"Private drivers and coordinated transportation.\",[\r\n            leaf(\"driver-around\",\"Around\",2,\"Transportation\",\"Driver\",\"Around\"),leaf(\"driver-goto\",\"Go-To\",2,\"Transportation\",\"Driver\",\"Go-To\"),leaf(\"driver-emergency\",\"Emergency\",2,\"Transportation\",\"Driver\",\"Emergency\"),leaf(\"driver-adventure\",\"Adventure\",2,\"Transportation\",\"Driver\",\"Adventure\")\r\n          ])\r\n        ]),\r\n\r\n        group(\"local-culture\",\"Local Culture\",2,\"\ud83c\udfdb\ufe0f\",\"People & Heritage\",\"Meet Medell\u00edn through language, neighborhoods, food and local customs.\",[\r\n          leaf(\"language-expressions\",\"Language & Expressions\",2,\"Local Culture\",\"Language & Expressions\",\"Featured\",[L(\"Know Locals\",\"Language Exchange\")]),\r\n          leaf(\"neighborhood-life\",\"Neighborhood Life\",2,\"Local Culture\",\"Neighborhood Life\",\"Featured\",[L(\"Know Locals\",\"Community\"),L(\"Know Locals\",\"Meetups\")]),\r\n          leaf(\"food-markets\",\"Food & Markets\",2,\"Local Culture\",\"Food & Markets\",\"Featured\",[L(\"Food Guide\",\"Restaurant Recommendations\"),L(\"Shop\",\"Artisan Markets\")]),\r\n          leaf(\"customs-etiquette\",\"Customs & Etiquette\",2,\"Local Culture\",\"Customs & Etiquette\",\"Featured\",[L(\"Local Culture\",\"Local Recommendations\")])\r\n        ]),\r\n\r\n        group(\"nature-guide\",\"Nature Guide\",2,\"\ud83c\udf3f\",\"Nature & Outdoors\",\"Discover landscapes, rivers, parks and viewpoints.\",[\r\n          leaf(\"mountain-adventures\",\"Mountain Adventures\",2,\"Nature Guide\",\"Mountain Adventures\",\"Featured\",[L(\"Nature Guide\",\"Sacred Nature\")]),\r\n          leaf(\"river-experiences\",\"River Experiences\",2,\"Nature Guide\",\"River Experiences\",\"Featured\",[L(\"Nature Guide\",\"River Experiences\"),L(\"Nature Guide\",\"Water Adventures\")]),\r\n          leaf(\"parks-gardens\",\"Parks & Gardens\",2,\"Nature Guide\",\"Parks & Gardens\",\"Featured\",[L(\"Respect Nature\",\"Protected Areas\")]),\r\n          leaf(\"sunset-viewpoints\",\"Sunset Viewpoints\",2,\"Nature Guide\",\"Sunset Viewpoints\",\"Featured\",[L(\"Nature Guide\",\"Sky Adventures\")])\r\n        ]),\r\n\r\n        group(\"sustainability\",\"Sustainability\",2,\"\u267b\ufe0f\",\"Responsible Travel\",\"Connect travel with conservation, agriculture and clean energy.\",[\r\n          leaf(\"recycling\",\"Recycling\",2,\"Sustainability\",\"Recycling\",\"Featured\",[L(\"Maximize Conservation\",\"Recycling Opportunities\")]),\r\n          leaf(\"rivers-canals\",\"Rivers & Canals\",2,\"Sustainability\",\"Rivers & Canals\",\"Featured\",[L(\"Maximize Conservation\",\"Canal Cleanups\")]),\r\n          leaf(\"sustainable-agriculture\",\"Sustainable Agriculture\",2,\"Sustainability\",\"Sustainable Agriculture\",\"Featured\",[L(\"Food Guide\",\"Farm & Tasting Tours\"),L(\"Food Guide\",\"Fruit Farms\")]),\r\n          leaf(\"clean-energy\",\"Clean Energy\",2,\"Sustainability\",\"Clean Energy\",\"Featured\",[L(\"Maximize Conservation\",\"Learn to Make Energy\")])\r\n        ]),\r\n\r\n        group(\"legacy\",\"Legacy\",2,\"\ud83d\udcab\",\"Creative Growth\",\"Transform travel into ideas, connections, records and opportunities.\",[\r\n          leaf(\"imagine\",\"Imagine\",2,\"Legacy\",\"Imagine\",\"Featured\",[L(\"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\"Dream\")]),\r\n          leaf(\"exchange\",\"Exchange\",2,\"Legacy\",\"Exchange\",\"Featured\",[L(\"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\"Connect\")]),\r\n          leaf(\"record\",\"Record\",2,\"Legacy\",\"Record\",\"Featured\",[L(\"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\"Create\")]),\r\n          leaf(\"franchise\",\"Franchise\",2,\"Legacy\",\"Franchise\",\"Featured\",[L(\"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\"Grow\")])\r\n        ])\r\n      ],\r\n\r\n      3:[\r\n        group(\"discover\",\"Discover\",3,\"\ud83e\udded\",\"Premium Discovery\",\"Go deeper into adventure, ancestry, culture and history.\",[\r\n          group(\"adventure\",\"Adventure\",3,\"\ud83e\ude82\",\"Premium Adventure\",\"Air, water, horseback and extreme experiences.\",[\r\n            leaf(\"air-adventures\",\"Air Adventures\",3,\"Discover\",\"Adventure\",\"Air Adventures\",[L(\"Nature Guide\",\"Sky Adventures\")]),\r\n            leaf(\"water-sports\",\"Water Sports\",3,\"Discover\",\"Adventure\",\"Water Sports\",[L(\"Nature Guide\",\"Water Adventures\")]),\r\n            leaf(\"horseback-experiences\",\"Horseback Experiences\",3,\"Discover\",\"Adventure\",\"Horseback Experiences\",[L(\"Nature Guide\",\"Horseback Experiences\")]),\r\n            leaf(\"extreme-adventures\",\"Extreme Adventures\",3,\"Discover\",\"Adventure\",\"Extreme Adventures\",[L(\"Nature Guide\",\"Extreme Adventures\")])\r\n          ]),\r\n          group(\"ancestral\",\"Ancestral\",3,\"\ud83d\udd2e\",\"Roots & Meaning\",\"Explore sacred places, heritage and regional stories.\",[\r\n            leaf(\"spiritual-heritage\",\"Spiritual Heritage\",3,\"Discover\",\"Ancestral\",\"Spiritual Heritage\",[L(\"Nature Guide\",\"Sacred Nature\")]),\r\n            leaf(\"sacred-waters\",\"Sacred Waters\",3,\"Discover\",\"Ancestral\",\"Sacred Waters\",[L(\"Nature Guide\",\"River Experiences\")]),\r\n            leaf(\"indigenous-heritage\",\"Indigenous Heritage\",3,\"Discover\",\"Ancestral\",\"Indigenous Heritage\",[L(\"Local Culture\",\"Indigenous Heritage\")]),\r\n            leaf(\"legends-mysteries\",\"Legends & Mysteries\",3,\"Discover\",\"Ancestral\",\"Legends & Mysteries\",[L(\"Local Culture\",\"Legends & Folklore\")])\r\n          ]),\r\n          group(\"cultural\",\"Cultural\",3,\"\ud83c\udfa8\",\"Creative Medell\u00edn\",\"Art, farms, river culture and local identity.\",[\r\n            leaf(\"art-creativity\",\"Art & Creativity\",3,\"Discover\",\"Cultural\",\"Art & Creativity\",[L(\"Local Culture\",\"Art & Creativity\")]),\r\n            leaf(\"river-culture\",\"River Culture\",3,\"Discover\",\"Cultural\",\"River Culture\",[L(\"Nature Guide\",\"River Experiences\")]),\r\n            leaf(\"farms-flavors\",\"Farms & Flavors\",3,\"Discover\",\"Cultural\",\"Farms & Flavors\",[L(\"Food Guide\",\"Farm & Tasting Tours\"),L(\"Food Guide\",\"Coffee\")]),\r\n            leaf(\"medellin-identity\",\"Medell\u00edn Identity\",3,\"Discover\",\"Cultural\",\"Medell\u00edn Identity\",[L(\"Local Culture\",\"Local Recommendations\")])\r\n          ]),\r\n          group(\"historic\",\"Historic\",3,\"\ud83d\udcdc\",\"History & Transformation\",\"Trace Antioquia, city development and local history.\",[\r\n            leaf(\"antioquia-origins\",\"Antioquia Origins\",3,\"Discover\",\"Historic\",\"Antioquia Origins\",[L(\"Local Culture\",\"Historical Antioquia\")]),\r\n            leaf(\"city-development\",\"City Development\",3,\"Discover\",\"Historic\",\"City Development\",[L(\"First Time Visitor\",\"Building Modern Medell\u00edn\")]),\r\n            leaf(\"medellin-transformation\",\"Medell\u00edn Transformation\",3,\"Discover\",\"Historic\",\"Medell\u00edn Transformation\",[L(\"First Time Visitor\",\"The Medell\u00edn Story\")]),\r\n            leaf(\"sports-history\",\"Sports History\",3,\"Discover\",\"Historic\",\"Sports History\",[L(\"Entertainment Guide\",\"Sports History\")])\r\n          ])\r\n        ]),\r\n\r\n        group(\"entertainment\",\"Entertainment\",3,\"\ud83c\udfad\",\"Events & Experiences\",\"Concerts, fashion, comedy and sports experiences.\",[\r\n          leaf(\"concert-experiences\",\"Concert Experiences\",3,\"Entertainment\",\"Concert Experiences\",\"Featured\",[L(\"Entertainment Guide\",\"Concert Experiences\")]),\r\n          leaf(\"fashion\",\"Fashion\",3,\"Entertainment\",\"Fashion\",\"Featured\",[L(\"Entertainment Guide\",\"Fashion Experiences\")]),\r\n          leaf(\"comedy\",\"Comedy\",3,\"Entertainment\",\"Comedy\",\"Featured\",[L(\"Entertainment Guide\",\"Comedy Experiences\")]),\r\n          leaf(\"sports\",\"Sports\",3,\"Entertainment\",\"Sports\",\"Featured\",[L(\"Entertainment Guide\",\"Sports Experiences\")])\r\n        ]),\r\n\r\n        group(\"medical-tourism\",\"Medical Tourism\",3,\"\ud83e\ude7a\",\"Health & Wellness\",\"Connect with trusted health and wellness providers.\",[\r\n          leaf(\"vision-care\",\"Vision Care\",3,\"Medical Tourism\",\"Vision Care\",\"Featured\",[L(\"Medical Tourism\",\"Vision Care\")]),\r\n          leaf(\"dental-care\",\"Dental Care\",3,\"Medical Tourism\",\"Dental Care\",\"Featured\",[L(\"Medical Tourism\",\"Dental Care\")]),\r\n          leaf(\"aesthetic-care\",\"Aesthetic Care\",3,\"Medical Tourism\",\"Aesthetic Care\",\"Featured\",[L(\"Medical Tourism\",\"Aesthetic Procedures\")]),\r\n          leaf(\"physical-therapy\",\"Physical Therapy\",3,\"Medical Tourism\",\"Physical Therapy\",\"Featured\",[L(\"Medical Tourism\",\"Regenerative Medicine\")])\r\n        ])\r\n      ]\r\n    }\r\n  };\r\n\r\n  window.BLISS_EXPLORE_STRUCTURE=STRUCTURE;\r\n\r\n  const state={ready:false,loggedIn:false,owned:{1:true},path:[]};\r\n  let noticeTimer=null;\r\n\r\n  const esc=v=>String(v==null?\"\":v).replace(\/[&<>\"']\/g,c=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"}[c]));\r\n  const norm=v=>String(v==null?\"\":v).trim().toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\").replace(\/\u2082\/g,\"2\").replace(\/[^a-z0-9]+\/g,\" \").trim();\r\n  const grid=()=>document.getElementById(\"tc2GuideGrid\");\r\n  const owns=level=>level<=1||Boolean(state.loggedIn&#038;&#038;state.owned&#038;&#038;(state.owned[level]||state.owned[String(level)]));\r\n  const allRoots=()=>[...(STRUCTURE.levels[2]||[]),...(STRUCTURE.levels[3]||[])];\r\n\r\n  function showNotice(title,message){\r\n    let notice=document.getElementById(\"bxExploreNoticeV3\");\r\n    if(!notice){\r\n      notice=document.createElement(\"div\");\r\n      notice.id=\"bxExploreNoticeV3\";\r\n      (document.getElementById(\"tc2Overlay\")||document.body).appendChild(notice);\r\n    }\r\n    notice.innerHTML=\"<strong>\"+esc(title)+\"<\/strong><div style='margin-top:5px;color:rgba(255,255,255,.72);font-size:13px'>\"+esc(message)+\"<\/div>\";\r\n    notice.classList.add(\"show\");\r\n    clearTimeout(noticeTimer);\r\n    noticeTimer=setTimeout(()=>notice.classList.remove(\"show\"),3200);\r\n  }\r\n\r\n  function loadMembership(){\r\n    const apply=result=>{\r\n      const data=result&&result.success&&result.data?result.data:{};\r\n      state.loggedIn=Boolean(data.logged_in||data.loggedIn);\r\n      state.owned=data.owned||{1:true};\r\n      state.ready=true;\r\n      renderCurrent();\r\n    };\r\n\r\n    if(window.BlissMembershipRequest&&typeof window.BlissMembershipRequest.load===\"function\"){\r\n      window.BlissMembershipRequest.load(\"\/GGG\/wp-admin\/admin-ajax.php\",\"ggg_get_current_user_vault_levels\").then(apply).catch(()=>{state.ready=true;renderCurrent();});\r\n    }else{\r\n      state.ready=true;\r\n      renderCurrent();\r\n    }\r\n  }\r\n\r\n  function nodeConnections(node){\r\n    return [node&&node.connection,...(Array.isArray(node&&node.legacyConnections)?node.legacyConnections:[])].filter(Boolean);\r\n  }\r\n\r\n  function hostMatchesConnection(host,connection){\r\n    const guide=host.guide||host.category||host.parent||\"\";\r\n    const option=host.option||host.exploreOption||\"\";\r\n    const sub=host.suboption||host.exploreSuboption||host.style||\"Featured\";\r\n    return (!connection.guide||norm(guide)===norm(connection.guide))&&(!connection.option||norm(option)===norm(connection.option))&&(!connection.suboption||norm(sub)===norm(connection.suboption));\r\n  }\r\n\r\n  function activeHosts(node){\r\n    const all=Array.isArray(window.travelClubInventory)?window.travelClubInventory:[];\r\n    const connections=nodeConnections(node);\r\n    return all.filter(host=>{\r\n      if(!host||host.active===false||host.active===0||host.active===\"0\") return false;\r\n      const status=norm(host.status||\"active\");\r\n      if(status===\"hidden\"||status===\"inactive\") return false;\r\n      const section=norm(host.section||host.mainSection||host.source||\"\");\r\n      if(section&&section!==\"explore\"&&section!==\"explore medellin\") return false;\r\n      return connections.some(connection=>hostMatchesConnection(host,connection));\r\n    }).sort((a,b)=>Number(Boolean(b.featured))-Number(Boolean(a.featured))||Number(a.order||10)-Number(b.order||10));\r\n  }\r\n\r\n  function currentNode(){\r\n    let nodes=allRoots();\r\n    let found=null;\r\n    for(const id of state.path){\r\n      found=nodes.find(node=>node.id===id)||null;\r\n      if(!found) return null;\r\n      nodes=Array.isArray(found.children)?found.children:[];\r\n    }\r\n    return found;\r\n  }\r\n\r\n  function parentNode(){\r\n    if(state.path.length<2) return null;\r\n    const saved=state.path.slice();\r\n    state.path=state.path.slice(0,-1);\r\n    const parent=currentNode();\r\n    state.path=saved;\r\n    return parent;\r\n  }\r\n\r\n  function shell(content){return '<div class=\"bx3-app\" data-bx3-owner=\"v3\">'+content+'<\/div>';}\r\n\r\n function routeCardHTML(node){\r\n  const locked=!owns(node.level||2);\r\n\r\n  const count=\r\n    Array.isArray(node.children)\r\n      ? node.children.length\r\n      : activeHosts(node).length;\r\n\r\n  const countText=\r\n    Array.isArray(node.children)\r\n      ? count+\" Options\"\r\n      : count+\" Hosts\";\r\n\r\n  return `\r\n    <button\r\n      class=\"bx5-routeCard${locked?\" is-locked\":\"\"}\"\r\n      data-bx3-open=\"${esc(node.id)}\"\r\n      type=\"button\">\r\n\r\n      <div class=\"bx5-routeIcon\">\r\n        ${node.icon||\"\u2022\"}\r\n      <\/div>\r\n\r\n      <div class=\"bx5-routeLevel\">\r\n        ${\r\n          locked\r\n            ? \"Level \"+node.level+\" Locked\"\r\n            : \"Level \"+(node.level||2)+\" Route\"\r\n        }\r\n      <\/div>\r\n\r\n      <h3 class=\"bx5-routeCardTitle\">\r\n        ${esc(node.label)}\r\n      <\/h3>\r\n\r\n      <div class=\"bx5-routeMeta\">\r\n        ${esc(node.copy||countText)}\r\n      <\/div>\r\n\r\n    <\/button>`;\r\n}\r\n\r\nfunction routeGridHTML(title,copy,nodes,showBack){\r\n  return `\r\n    <section class=\"bx5-routeStage\">\r\n\r\n      <div class=\"bx5-routeHead\">\r\n\r\n        <div class=\"bx5-routeKicker\">\r\n          Bliss Explore Medell\u00edn\r\n        <\/div>\r\n\r\n        <h2 class=\"bx5-routeTitle\">\r\n          ${esc(title)}\r\n        <\/h2>\r\n\r\n        <p class=\"bx5-routeCopy\">\r\n          ${esc(copy||\"Choose a route to continue.\")}\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bx5-routeGrid\">\r\n        ${nodes.map(routeCardHTML).join(\"\")}\r\n      <\/div>\r\n\r\n      <div class=\"bx5-routeFooter\">\r\n\r\n        ${\r\n          showBack\r\n            ? '<button class=\"bx3-back\" data-bx3-back type=\"button\">\u2190 Back<\/button>'\r\n            : \"\"\r\n        }\r\n\r\n        <div class=\"bx5-routeHint\">\r\n          Choose a route\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/section>`;\r\n}\r\n\r\nfunction breadcrumbHTML(node){\r\n  const crumbs=[\"Explore Medell\u00edn\"];\r\n  let nodes=allRoots();\r\n\r\n  for(const id of state.path){\r\n    const found=nodes.find(n=>n.id===id);\r\n\r\n    if(!found){\r\n      break;\r\n    }\r\n\r\n    crumbs.push(found.label);\r\n    nodes=found.children||[];\r\n  }\r\n\r\n  if(\r\n    node &&\r\n    crumbs[crumbs.length-1]!==node.label\r\n  ){\r\n    crumbs.push(node.label);\r\n  }\r\n\r\n  return `\r\n    <div class=\"bx3-route\">\r\n      ${crumbs\r\n        .map(function(crumb){\r\n          return \"<span>\"+esc(crumb)+\"<\/span>\";\r\n        })\r\n        .join(\"\")}\r\n    <\/div>\r\n  `;\r\n}\r\n\r\nfunction renderRoots(){\r\n  const g=grid();\r\n\r\n  if(!g){\r\n    return;\r\n  }\r\n\r\n  state.path=[];\r\n\r\n  const nodes=allRoots();\r\n\r\n  g.innerHTML=shell(\r\n    routeGridHTML(\r\n      \"Explore Medell\u00edn\",\r\n      \"Build the Medell\u00edn experience through stays, transportation, culture, nature, sustainability, premium discovery, entertainment and medical tourism.\",\r\n      nodes,\r\n      false\r\n    )\r\n  );\r\n}\r\n\r\nfunction renderBranch(node){\r\n  const g=grid();\r\n\r\n  if(!g||!node){\r\n    return;\r\n  }\r\n\r\n  if(!owns(node.level||2)){\r\n    showNotice(\r\n      \"Level \"+node.level+\" Required\",\r\n      \"Upgrade to Level \"+node.level+\" to open \"+node.label+\".\"\r\n    );\r\n\r\n    state.path.pop();\r\n    return;\r\n  }\r\n\r\n  const children=\r\n    Array.isArray(node.children)\r\n      ? node.children\r\n      : [];\r\n\r\n  g.innerHTML=shell(\r\n    routeGridHTML(\r\n      node.label,\r\n      node.copy||\"Choose a connected Medell\u00edn route.\",\r\n      children,\r\n      true\r\n    )\r\n  );\r\n}\r\n\r\n\r\n\r\n  function hostCard(host,node){\r\n    const id=String(host.id||host.hostId||\"\");\r\n    const image=host.image||host.imageUrl||(Array.isArray(host.images)?host.images[0]:\"\")||\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n    const website=host.websiteUrl||host.url||\"\";\r\n    return `\r\n      <article class=\"bx3-host\">\r\n        <div class=\"bx3-hostImage\" style=\"background-image:url('${esc(image)}')\"><\/div>\r\n        <div class=\"bx3-hostBody\">\r\n          <div class=\"bx3-hostType\">${host.featured?\"Featured \u00b7 \":\"\"}${esc(host.type||node.label)}<\/div>\r\n          <h3 class=\"bx3-hostTitle\">${esc(host.name||host.title||\"Explore Medell\u00edn Host\")}<\/h3>\r\n          ${host.location?`<div style=\"margin-top:8px;color:#8fefff\">${esc(host.location)}<\/div>`:\"\"}\r\n          ${host.price?`<div style=\"margin-top:6px;color:#fff0c4\">${esc(host.price)}<\/div>`:\"\"}\r\n          <p class=\"bx3-hostCopy\">${esc(host.description||host.desc||\"\")}<\/p>\r\n          <div class=\"bx3-actions\">\r\n            <button class=\"bx3-action\" data-bx3-save-host=\"${esc(id)}\" type=\"button\">Save to My Journey<\/button>\r\n            <button class=\"bx3-action primary\" data-bx3-request-host=\"${esc(id)}\" type=\"button\">Request With Bliss<\/button>\r\n            ${website?`<button class=\"bx3-action\" data-bx3-site=\"${esc(id)}\" type=\"button\">Visit Website<\/button>`:\"\"}\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>`;\r\n  }\r\n\r\n  function renderLeaf(node){\r\n    const g=grid();\r\n    if(!g||!node) return;\r\n    if(!owns(node.level||2)){\r\n      showNotice(\"Level \"+node.level+\" Required\",\"Upgrade to Level \"+node.level+\" to open \"+node.label+\".\");\r\n      state.path.pop();\r\n      return;\r\n    }\r\n    const hosts=activeHosts(node);\r\n    const hostCards=hosts.length?hosts.map(host=>hostCard(host,node)).join(\"\"):`<div class=\"bx3-empty\">No active hosts are connected yet for this route.<br><br><strong>${esc(node.connection.guide)} \u2192 ${esc(node.connection.option)} \u2192 ${esc(node.connection.suboption||\"Featured\")}<\/strong><br><br>Add a host from the Bliss Control Panel using that exact route.<\/div>`;\r\n    g.innerHTML=shell(`\r\n      <section class=\"bx3-screen\">\r\n        <div class=\"bx3-topline\">\r\n          <div>\r\n            <div class=\"bx3-eyebrow\">${esc((node.level||2)===3?\"Level 3 Premium Route\":\"Level 2 Explore Route\")}<\/div>\r\n            <h2 class=\"bx3-sectionTitle\">${node.icon||\"\u2726\"} ${esc(node.label)}<\/h2>\r\n            <p class=\"bx3-lead\">${esc(node.copy||\"\")}<\/p>\r\n            ${breadcrumbHTML(node)}\r\n            <div class=\"bx3-actions\">\r\n              <button class=\"bx3-action primary\" data-bx3-save-route type=\"button\">Add Experience to My Journey<\/button>\r\n            <\/div>\r\n          <\/div>\r\n          <button class=\"bx3-back\" data-bx3-back type=\"button\">\u2190 Back<\/button>\r\n        <\/div>\r\n        <div class=\"bx3-hostGrid\">${hostCards}<\/div>\r\n      <\/section>`);\r\n  }\r\n\r\n  function renderCurrent(){\r\n    if(!state.path.length){renderRoots();return;}\r\n    const node=currentNode();\r\n    if(!node){renderRoots();return;}\r\n    if(Array.isArray(node.children)&&node.children.length) renderBranch(node); else renderLeaf(node);\r\n  }\r\n\r\n  function findChildById(id){\r\n    const parent=currentNode();\r\n    const nodes=parent&&Array.isArray(parent.children)?parent.children:allRoots();\r\n    return nodes.find(node=>node.id===id)||null;\r\n  }\r\n\r\n  function hostById(id){\r\n    return (Array.isArray(window.travelClubInventory)?window.travelClubInventory:[]).find(host=>String(host.id||host.hostId||\"\")===String(id));\r\n  }\r\n\r\n  function journeyItem(base,status,node){\r\n    const route=node&&node.connection?node.connection:{};\r\n    const hostId=String(base.id||base.hostId||[route.guide,route.option,route.suboption].join(\"|\"));\r\n    return {\r\n      journeyId:\"explore|\"+hostId,\r\n      hostId,\r\n      source:\"explore-medellin\",\r\n      category:\"experiences\",\r\n      type:\"Explore Medell\u00edn\",\r\n      title:base.name||base.title||(node&&node.label)||\"Explore Medell\u00edn\",\r\n      name:base.name||base.title||(node&&node.label)||\"Explore Medell\u00edn\",\r\n      location:base.location||\"Medell\u00edn, Colombia\",\r\n      time:[route.guide,route.option,route.suboption].filter(Boolean).join(\" \u00b7 \"),\r\n      status,\r\n      favorite:false,\r\n      image:base.image||base.imageUrl||(Array.isArray(base.images)?base.images[0]:\"\")||\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\",\r\n      images:Array.isArray(base.images)?base.images.filter(Boolean):[],\r\n      description:base.description||base.desc||(node&&node.copy)||\"\",\r\n      websiteUrl:base.websiteUrl||base.url||\"\",\r\n      guide:route.guide||\"\",\r\n      option:route.option||\"\",\r\n      suboption:route.suboption||\"Featured\"\r\n    };\r\n  }\r\n\r\n  async function saveJourney(base,status,node){\r\n    if(!window.BlissJourneyAccount||typeof window.BlissJourneyAccount.addItem!==\"function\"){\r\n      showNotice(\"Journey Not Ready\",\"The customer Journey connection has not finished loading yet.\");\r\n      return;\r\n    }\r\n    try{\r\n      const result=await window.BlissJourneyAccount.addItem(journeyItem(base,status,node));\r\n      showNotice(result&&result.duplicate?\"Already in My Journey\":\"Saved to My Journey\",(base.name||base.title||(node&&node.label)||\"Experience\")+\" is now connected to My Journey.\");\r\n    }catch(error){showNotice(\"Could Not Save\",\"Please try again.\");}\r\n  }\r\n\r\n  window.addEventListener(\"click\",function(event){\r\n    const target=event.target&&event.target.closest?event.target.closest(\"[data-bx3-open],[data-bx3-back],[data-bx3-save-route],[data-bx3-save-host],[data-bx3-request-host],[data-bx3-site]\"):null;\r\n    if(!target) return;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    if(event.stopImmediatePropagation) event.stopImmediatePropagation();\r\n\r\n    if(target.dataset.bx3Open){\r\n      const node=findChildById(target.dataset.bx3Open);\r\n      if(!node) return;\r\n      if(!owns(node.level||2)){\r\n        showNotice(\"Level \"+node.level+\" Required\",\"Upgrade to Level \"+node.level+\" to open \"+node.label+\".\");\r\n        return;\r\n      }\r\n      state.path.push(node.id);\r\n      renderCurrent();\r\n      return;\r\n    }\r\n\r\n    if(target.hasAttribute(\"data-bx3-back\")){\r\n      state.path.pop();\r\n      renderCurrent();\r\n      return;\r\n    }\r\n\r\n    const node=currentNode();\r\n    if(target.hasAttribute(\"data-bx3-save-route\")&&node){\r\n      saveJourney({title:node.label,description:node.copy||\"\"},\"Saved\",node);\r\n      return;\r\n    }\r\n\r\n    if(target.dataset.bx3SaveHost){\r\n      const host=hostById(target.dataset.bx3SaveHost);\r\n      if(host&&node) saveJourney(host,\"Saved\",node);\r\n      return;\r\n    }\r\n\r\n    if(target.dataset.bx3RequestHost){\r\n      const host=hostById(target.dataset.bx3RequestHost);\r\n      if(host&&node) saveJourney(host,\"Requested\",node);\r\n      return;\r\n    }\r\n\r\n    if(target.dataset.bx3Site){\r\n      const host=hostById(target.dataset.bx3Site);\r\n      const url=host&&(host.websiteUrl||host.url);\r\n      if(url) window.open(url,\"_blank\",\"noopener\");\r\n    }\r\n  },true);\r\n\r\n window.tc2ExploreV6 = {\r\n  renderGuides: function(){\r\n    renderRoots();\r\n  },\r\n\r\n  renderOptions: function(){\r\n    renderCurrent();\r\n  },\r\n\r\n  goBack: function(){\r\n    state.path.pop();\r\n    renderCurrent();\r\n  }\r\n};\r\n\r\nfunction install(){\r\n  const g = grid();\r\n\r\n  if(!g){\r\n    return false;\r\n  }\r\n\r\n  renderCurrent();\r\n  return true;\r\n}\r\n\r\n  function boot(){\r\n    loadMembership();\r\n    if(install()) return;\r\n    let attempts=0;\r\n    const timer=setInterval(()=>{attempts++;if(install()||attempts>30) clearInterval(timer);},200);\r\n  }\r\n\r\n \r\n  window.addEventListener(\"travelClubInventoryReady\",renderCurrent);\r\n  document.addEventListener(\"click\",function(event){\r\n    const openExplore=event.target&&event.target.closest?event.target.closest(\"#tc2MainExplore,#tc2FloatExplore,[data-page='explore']\"):null;\r\n    if(openExplore){setTimeout(renderCurrent,20);setTimeout(renderCurrent,180);}\r\n  },true);\r\n\r\n  if(document.readyState===\"loading\") document.addEventListener(\"DOMContentLoaded\",boot,{once:true}); else boot();\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nMY JOURNEY + LOCAL SERVICES HOST CONNECTION V7\r\n\r\nREPLACE THE OLD:\r\n- MY JOURNEY BUTTON FIX + EMPTY JOURNEY STATE\r\n- LOCAL SERVICES RENDER + BUTTON FIX\r\n- STORY BUTTON SCRIPT\r\n\r\nWITH THIS ENTIRE BLOCK\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================\r\n   EMPTY \/ INFORMATION STATE\r\n========================= *\/\r\n.tc2-emptyJourney{\r\n  margin-top:22px;\r\n  padding:22px;\r\n  border-radius:28px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(83,243,255,.18);\r\n  color:#fff;\r\n}\r\n\r\n.tc2-emptyJourney h3{\r\n  margin:0;\r\n  font-size:1.5rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-emptyJourney p{\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.7;\r\n}\r\n\r\n\/* =========================\r\n   LOCAL SERVICE TYPE CARDS\r\n========================= *\/\r\n.tc2-localServiceCard{\r\n  width:100%;\r\n  min-height:180px;\r\n  padding:18px;\r\n  border-radius:24px;\r\n  background:\r\n    radial-gradient(circle at top left,rgba(112,247,162,.08),transparent 35%),\r\n    linear-gradient(180deg,rgba(10,18,40,.96),rgba(2,5,13,.98));\r\n  border:1px solid rgba(112,247,162,.22);\r\n  color:#fff;\r\n  text-align:left;\r\n  cursor:pointer;\r\n  transition:\r\n    transform .22s ease,\r\n    border-color .22s ease,\r\n    box-shadow .22s ease;\r\n}\r\n\r\n.tc2-localServiceCard:hover{\r\n  border-color:rgba(112,247,162,.75);\r\n  box-shadow:0 0 22px rgba(112,247,162,.16);\r\n  transform:translateY(-3px);\r\n}\r\n\r\n.tc2-localServiceCard.is-selected{\r\n  border-color:rgba(112,247,162,.95);\r\n  box-shadow:\r\n    0 0 26px rgba(112,247,162,.24),\r\n    inset 0 0 0 1px rgba(112,247,162,.30);\r\n}\r\n\r\n.tc2-localServiceCard h3{\r\n  margin:0;\r\n  font-size:1.25rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-localServiceCard p{\r\n  color:rgba(248,251,255,.75);\r\n  line-height:1.6;\r\n}\r\n\r\n.tc2-serviceCount{\r\n  display:inline-flex;\r\n  margin-top:14px;\r\n  min-height:34px;\r\n  padding:0 12px;\r\n  align-items:center;\r\n  border-radius:999px;\r\n  background:rgba(112,247,162,.08);\r\n  border:1px solid rgba(112,247,162,.18);\r\n  color:#baffd0;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\/* =========================\r\n   SERVICE HOST RESULTS\r\n========================= *\/\r\n.tc2-serviceHostResults{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:16px;\r\n  margin-top:18px;\r\n}\r\n\r\n.tc2-serviceHostCard{\r\n  overflow:hidden;\r\n  border-radius:28px;\r\n  background:\r\n    radial-gradient(circle at top left,rgba(83,243,255,.07),transparent 30%),\r\n    linear-gradient(180deg,rgba(10,18,40,.98),rgba(2,5,13,.99));\r\n  border:1px solid rgba(83,243,255,.18);\r\n  color:#fff;\r\n}\r\n\r\n.tc2-serviceHostImage{\r\n  width:100%;\r\n  height:210px;\r\n  background-color:#08101d;\r\n  background-position:center;\r\n  background-repeat:no-repeat;\r\n  background-size:cover;\r\n}\r\n\r\n.tc2-serviceHostBody{\r\n  padding:20px;\r\n}\r\n\r\n.tc2-serviceHostMeta{\r\n  color:#9fffc1;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-serviceHostTitle{\r\n  margin:9px 0 0;\r\n  color:#fff;\r\n  font-size:1.55rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-serviceHostLocation,\r\n.tc2-serviceHostPrice{\r\n  margin-top:9px;\r\n  color:rgba(248,251,255,.72);\r\n  line-height:1.5;\r\n}\r\n\r\n.tc2-serviceHostDescription{\r\n  margin:13px 0 0;\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.7;\r\n}\r\n\r\n\/* =========================\r\n   JOURNEY CARDS\r\n========================= *\/\r\n.tc2-journeyConnectedCard{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:15px;\r\n  padding:16px;\r\n  border-radius:28px;\r\n  background:\r\n    radial-gradient(circle at top left,rgba(83,243,255,.06),transparent 35%),\r\n    rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.09);\r\n}\r\n\r\n.tc2-journeyConnectedMedia{\r\n  min-height:190px;\r\n  border-radius:22px;\r\n  background-color:#08101d;\r\n  background-position:center;\r\n  background-repeat:no-repeat;\r\n  background-size:cover;\r\n}\r\n\r\n.tc2-journeyConnectedType{\r\n  color:#9eefff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-journeyConnectedTitle{\r\n  margin:8px 0 0;\r\n  font-size:1.5rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-journeyConnectedMeta{\r\n  margin-top:9px;\r\n  color:rgba(248,251,255,.68);\r\n  line-height:1.6;\r\n}\r\n\r\n.tc2-journeyConnectedDescription{\r\n  margin-top:11px;\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.7;\r\n}\r\n\r\n@media(min-width:800px){\r\n  .tc2-serviceHostResults{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  .tc2-journeyConnectedCard{\r\n    grid-template-columns:280px minmax(0,1fr);\r\n  }\r\n}\r\n\r\n@media(min-width:1200px){\r\n  .tc2-serviceHostResults{\r\n    grid-template-columns:repeat(3,minmax(0,1fr));\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* =====================================================\r\n     STORAGE\r\n\r\n     HOST_STORAGE_KEYS:\r\n     Reads hosts saved by the current Control Panel.\r\n\r\n     JOURNEY_SESSION_KEY:\r\n     Same key already used by the original Travel Club and\r\n     Explore Medell\u00edn V6.\r\n\r\n     JOURNEY_PERMANENT_KEY:\r\n     Keeps a permanent browser copy so the Journey does not\r\n     disappear when the tab\/browser session closes.\r\n  ===================================================== *\/\r\n  const HOST_STORAGE_KEYS = [\r\n    \"BLISS_TRAVEL_CLUB_HOSTS_V5\",\r\n    \"BLISS_TRAVEL_CLUB_HOSTS_V4\",\r\n    \"BLISS_TRAVEL_CLUB_ITEMS_V3\",\r\n    \"BLISS_TRAVEL_CLUB_HOSTS_V2\"\r\n  ];\r\n\r\n  const JOURNEY_SESSION_KEY = \"GGG_TRAVEL_CLUB_V3_JOURNEY\";\r\n  const JOURNEY_META_KEY = \"GGG_TRAVEL_CLUB_V3_META\";\r\n  const JOURNEY_PERMANENT_KEY = \"BLISS_TRAVEL_CLUB_SAVED_JOURNEY_V1\";\r\n\r\n  const DEFAULT_IMAGE =\r\n    \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n\r\n  const LEVEL_2_URL = \"\/GGG\/responsable-reservations\/\";\r\n\r\n  \/*\r\n    Canonical Local Services names.\r\n\r\n    aliases:\r\n    Allows old names such as Driver, Security and VIP Support\r\n    to continue working while the Control Panel may save the\r\n    fuller names.\r\n  *\/\r\n  const SERVICES = [\r\n    {\r\n      title:\"Private Driver\",\r\n      aliases:[\"Private Driver\",\"Driver\",\"Transportation Driver\"],\r\n      desc:\"Airport pickup, local rides, hourly driver, day routes, and emergency transport.\"\r\n    },\r\n    {\r\n      title:\"Concierge\",\r\n      aliases:[\"Concierge\",\"Local Concierge\"],\r\n      desc:\"Help with reservations, planning, local coordination, and special requests.\"\r\n    },\r\n    {\r\n      title:\"Translator\",\r\n      aliases:[\"Translator\",\"Translation\",\"Spanish Support\"],\r\n      desc:\"Spanish support for appointments, meetings, tours, emergencies, and daily travel.\"\r\n    },\r\n    {\r\n      title:\"Local Guide\",\r\n      aliases:[\"Local Guide\",\"Guide\",\"Tour Guide\"],\r\n      desc:\"Guided Medell\u00edn experiences, neighborhoods, culture, nature, food, and history.\"\r\n    },\r\n    {\r\n      title:\"Nightlife Help\",\r\n      aliases:[\"Nightlife Help\",\"Nightlife\",\"Nightlife Support\"],\r\n      desc:\"Safe nightlife planning, reservations, VIP routes, and trusted local support.\"\r\n    },\r\n    {\r\n      title:\"Reservations\",\r\n      aliases:[\"Reservations\",\"Reservation Support\",\"Booking Support\"],\r\n      desc:\"Restaurants, experiences, accommodations, events, private rooms, and VIP bookings.\"\r\n    },\r\n    {\r\n      title:\"Security Support\",\r\n      aliases:[\"Security Support\",\"Security\",\"Private Security\"],\r\n      desc:\"Private safety support, secure transport, VIP movement, and emergency coordination.\"\r\n    },\r\n    {\r\n      title:\"VIP Custom Support\",\r\n      aliases:[\"VIP Custom Support\",\"VIP Support\",\"VIP\",\"Premium Support\"],\r\n      desc:\"Premium travel handling for luxury experiences, private routes, and special access.\"\r\n    }\r\n  ];\r\n\r\n  let selectedService = \"\";\r\n\r\n  \/* =====================================================\r\n     HELPERS\r\n  ===================================================== *\/\r\n  function escapeHTML(value){\r\n    return String(value == null ? \"\" : value).replace(\r\n      \/[&<>\"']\/g,\r\n      function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      }\r\n    );\r\n  }\r\n\r\n  function normalize(value){\r\n    return String(value || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(\/[_-]+\/g,\" \")\r\n      .replace(\/\\s+\/g,\" \");\r\n  }\r\n\r\n  function safeURL(value){\r\n    const url = String(value || \"\").trim();\r\n\r\n    if(!url){\r\n      return \"\";\r\n    }\r\n\r\n    if(\r\n      url.startsWith(\"\/\") ||\r\n      url.startsWith(\"https:\/\/\") ||\r\n      url.startsWith(\"http:\/\/\")\r\n    ){\r\n      return url;\r\n    }\r\n\r\n    return \"https:\/\/\" + url;\r\n  }\r\n\r\n  function scrollOverlayTop(){\r\n    const overlay = document.getElementById(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    try{\r\n      overlay.scrollTo({\r\n        top:0,\r\n        behavior:\"smooth\"\r\n      });\r\n    }catch(error){\r\n      overlay.scrollTop = 0;\r\n    }\r\n  }\r\n\r\n  function showTC2Page(pageId){\r\n    document.querySelectorAll(\".tc2-page\").forEach(function(page){\r\n      page.classList.remove(\"active\");\r\n    });\r\n\r\n    const target = document.getElementById(pageId);\r\n\r\n    if(target){\r\n      target.classList.add(\"active\");\r\n    }\r\n\r\n    scrollOverlayTop();\r\n  }\r\n\r\n  function showMessage(title,message){\r\n    const modal = document.getElementById(\"tc2Modal\");\r\n    const modalTitle = document.getElementById(\"tc2ModalTitle\");\r\n    const modalText = document.getElementById(\"tc2ModalText\");\r\n\r\n    if(modal && modalTitle && modalText){\r\n      modalTitle.textContent = title;\r\n      modalText.textContent = message;\r\n      modal.classList.add(\"open\");\r\n      return;\r\n    }\r\n\r\n    alert(title + \"\\n\\n\" + message);\r\n  }\r\n\r\n  \/* =====================================================\r\n     HOST STORAGE\r\n  ===================================================== *\/\r\n  function readHosts(){\r\n    const merged = [];\r\n    const seen = new Set();\r\n\r\n    HOST_STORAGE_KEYS.forEach(function(storageKey){\r\n      let items = [];\r\n\r\n      try{\r\n        items = JSON.parse(\r\n          localStorage.getItem(storageKey) || \"[]\"\r\n        );\r\n      }catch(error){\r\n        items = [];\r\n      }\r\n\r\n      if(!Array.isArray(items)){\r\n        return;\r\n      }\r\n\r\n      items.forEach(function(host){\r\n        if(!host || host.active === false){\r\n          return;\r\n        }\r\n\r\n        const fallbackID = [\r\n          host.section,\r\n          host.service,\r\n          host.category,\r\n          host.parent,\r\n          host.name,\r\n          host.title\r\n        ].join(\"|\");\r\n\r\n        const id = String(host.id || fallbackID);\r\n\r\n        if(seen.has(id)){\r\n          return;\r\n        }\r\n\r\n        seen.add(id);\r\n        merged.push(host);\r\n      });\r\n    });\r\n\r\n    return merged.sort(function(a,b){\r\n      if(Boolean(a.featured) !== Boolean(b.featured)){\r\n        return a.featured ? -1 : 1;\r\n      }\r\n\r\n      return Number(a.order || 10) - Number(b.order || 10);\r\n    });\r\n  }\r\n\r\n  function isServicesSection(host){\r\n    const section = normalize(host.section);\r\n\r\n    return (\r\n      section === \"services\" ||\r\n      section === \"service\" ||\r\n      section === \"local services\" ||\r\n      section === \"local service\"\r\n    );\r\n  }\r\n\r\n  function hostServiceName(host){\r\n    \/*\r\n      Accepts all likely Control Panel fields.\r\n\r\n      Preferred:\r\n      host.service\r\n\r\n      Fallbacks:\r\n      category\r\n      parent\r\n      type\r\n      serviceKey\r\n    *\/\r\n    const direct =\r\n      host.service ||\r\n      host.category ||\r\n      host.parent ||\r\n      host.type ||\r\n      \"\";\r\n\r\n    if(direct){\r\n      return String(direct);\r\n    }\r\n\r\n    const key = String(host.serviceKey || \"\");\r\n\r\n    if(key.includes(\"|\")){\r\n      return key.split(\"|\").pop();\r\n    }\r\n\r\n    return key;\r\n  }\r\n\r\n  function getServiceDefinition(serviceName){\r\n    const requested = normalize(serviceName);\r\n\r\n    return SERVICES.find(function(service){\r\n      return service.aliases.some(function(alias){\r\n        return normalize(alias) === requested;\r\n      });\r\n    }) || null;\r\n  }\r\n\r\n  function hostMatchesService(host,serviceName){\r\n    if(!isServicesSection(host)){\r\n      return false;\r\n    }\r\n\r\n    const definition = getServiceDefinition(serviceName);\r\n\r\n    if(!definition){\r\n      return normalize(hostServiceName(host)) === normalize(serviceName);\r\n    }\r\n\r\n    const savedName = normalize(hostServiceName(host));\r\n\r\n    return definition.aliases.some(function(alias){\r\n      return normalize(alias) === savedName;\r\n    });\r\n  }\r\n\r\n  function hostsForService(serviceName){\r\n    return readHosts().filter(function(host){\r\n      return hostMatchesService(host,serviceName);\r\n    });\r\n  }\r\n\r\n  function findHost(hostID){\r\n    return readHosts().find(function(host){\r\n      return String(host.id || \"\") === String(hostID || \"\");\r\n    });\r\n  }\r\n\r\n  \/* =====================================================\r\n     JOURNEY STORAGE\r\n\r\n     Reads the session key used by the original Travel Club.\r\n     If session is empty, restores the permanent local copy.\r\n  ===================================================== *\/\r\n  function readJSON(storage,key){\r\n    try{\r\n      const value = JSON.parse(storage.getItem(key) || \"[]\");\r\n      return Array.isArray(value) ? value : [];\r\n    }catch(error){\r\n      return [];\r\n    }\r\n  }\r\n\r\n function readJourney(){\r\n\r\n  if(\r\n    window.BlissJourneyAccount &&\r\n    typeof window.BlissJourneyAccount.read ===\r\n      \"function\"\r\n  ){\r\n\r\n    return window.BlissJourneyAccount.read();\r\n\r\n  }\r\n\r\n  return [];\r\n\r\n}\r\n\r\n function writeJourney(items){\r\n\r\n  const safeItems =\r\n    Array.isArray(items)\r\n      ? items\r\n      : [];\r\n\r\n  if(\r\n    window.BlissJourneyAccount &&\r\n    typeof window.BlissJourneyAccount.save ===\r\n      \"function\"\r\n  ){\r\n\r\n    window.BlissJourneyAccount\r\n      .save(safeItems)\r\n      .catch(function(error){\r\n\r\n        showMessage(\r\n          \"Journey Not Saved\",\r\n          error.message ||\r\n          \"Your Journey could not be saved to your account.\"\r\n        );\r\n\r\n      });\r\n\r\n  }\r\n\r\n  updateJourneySummary(\r\n    safeItems\r\n  );\r\n\r\n  return safeItems;\r\n\r\n}\r\n\r\n  function journeyItemID(item){\r\n    return String(\r\n      item.journeyId ||\r\n      item.hostId ||\r\n      [\r\n        item.type,\r\n        item.title,\r\n        item.location,\r\n        item.time\r\n      ].join(\"|\")\r\n    );\r\n  }\r\n\r\n function addJourneyItem(item){\r\n\r\n  if(\r\n    !window.BlissJourneyAccount ||\r\n    typeof window.BlissJourneyAccount.addItem !==\r\n      \"function\"\r\n  ){\r\n\r\n    showMessage(\r\n      \"Journey Not Ready\",\r\n      \"Your customer Journey account connection is still loading.\"\r\n    );\r\n\r\n    return false;\r\n\r\n  }\r\n\r\n  window.BlissJourneyAccount\r\n    .addItem(item)\r\n    .then(function(result){\r\n\r\n      if(result.duplicate){\r\n\r\n        showMessage(\r\n          \"Already Saved\",\r\n          (\r\n            item.title ||\r\n            \"This selection\"\r\n          ) +\r\n          \" is already in My Journey.\"\r\n        );\r\n\r\n        return;\r\n\r\n      }\r\n\r\n      renderJourney();\r\n\r\n      showMessage(\r\n        \"Saved to Your Account\",\r\n        (\r\n          item.title ||\r\n          \"Your selection\"\r\n        ) +\r\n          \" was added to My Journey.\"\r\n      );\r\n\r\n    })\r\n    .catch(function(error){\r\n\r\n      showMessage(\r\n        \"Journey Not Saved\",\r\n        error.message ||\r\n        \"This selection could not be saved to your account.\"\r\n      );\r\n\r\n    });\r\n\r\n  return true;\r\n\r\n}\r\n\r\n function removeJourneyItem(itemID){\r\n\r\n  if(\r\n    !window.BlissJourneyAccount ||\r\n    typeof window.BlissJourneyAccount.removeItem !==\r\n      \"function\"\r\n  ){\r\n\r\n    return false;\r\n\r\n  }\r\n\r\n  window.BlissJourneyAccount\r\n    .removeItem(itemID)\r\n    .then(function(){\r\n\r\n      renderJourney();\r\n\r\n      showMessage(\r\n        \"Removed\",\r\n        \"The item was removed from your account Journey.\"\r\n      );\r\n\r\n    })\r\n    .catch(function(error){\r\n\r\n      showMessage(\r\n        \"Could Not Remove\",\r\n        error.message ||\r\n        \"The item could not be removed.\"\r\n      );\r\n\r\n    });\r\n\r\n  return true;\r\n\r\n}\r\n\r\n  function permanentlySaveJourney(){\r\n    const journey = readJourney();\r\n\r\n    writeJourney(journey,true);\r\n\r\n    showMessage(\r\n      \"Journey Saved\",\r\n      journey.length\r\n        ? \"Your Journey was saved permanently in this browser.\"\r\n        : \"Your empty Journey was saved. Add hosts, services, and experiences whenever you are ready.\"\r\n    );\r\n  }\r\n\r\n  \/* =====================================================\r\n     JOURNEY SUMMARY\r\n  ===================================================== *\/\r\n  function updateJourneySummary(journey){\r\n    const items = Array.isArray(journey)\r\n      ? journey\r\n      : readJourney();\r\n\r\n    const first = items[0] || null;\r\n    const nextTitle = first\r\n      ? first.title || \"Saved Experience\"\r\n      : \"Waiting\";\r\n\r\n    const nextExperience =\r\n      document.getElementById(\"tc2NextExperience\");\r\n\r\n    const statNext =\r\n      document.getElementById(\"tc2StatNext\");\r\n\r\n    if(nextExperience){\r\n      nextExperience.textContent = first\r\n        ? nextTitle\r\n        : \"Waiting for selection\";\r\n    }\r\n\r\n    if(statNext){\r\n      statNext.textContent = nextTitle;\r\n    }\r\n  }\r\n\r\n  \/* =====================================================\r\n     JOURNEY RENDERING\r\n  ===================================================== *\/\r\n\r\n   let activeJourneyView = \"dashboard\";\r\n\r\n  const JOURNEY_VIEWS = {\r\n    dashboard:[\"Mission Dashboard\",\"Your Journey is Waiting\",\"Save discoveries and Bliss will organize everything automatically.\"],\r\n    accommodations:[\"Accommodations\",\"No accommodations saved yet\",\"Explore Medell\u00edn or Astro Travel to discover a place to stay.\"],\r\n    restaurants:[\"Restaurants\",\"No restaurants saved yet\",\"Save dining recommendations and request a reservation when ready.\"],\r\n    transportation:[\"Transportation\",\"No transportation selected\",\"Add an airport pickup, private driver, car, helicopter, yacht, or transfer.\"],\r\n    experiences:[\"Tours & Experiences\",\"No experiences saved yet\",\"Save tours, attractions, entertainment, culture, and nature experiences.\"],\r\n    services:[\"Local Services\",\"No local services saved\",\"Add a concierge, translator, photographer, guide, security provider, or other support.\"],\r\n    favorites:[\"Favorites\",\"No favorites yet\",\"Favorite items will remain easy to find here.\"],\r\n    reservations:[\"Reservation Status\",\"No reservation requests yet\",\"Select Request Reservation on a saved item when Bliss should begin.\"],\r\n    concierge:[\"Bliss Concierge\",\"\",\"\"]\r\n  };\r\n\r\n  function journeyText(item){\r\n    return [\r\n      item.category,item.type,item.source,item.service,\r\n      item.title,item.description,item.location,item.time\r\n    ].filter(Boolean).join(\" \").toLowerCase();\r\n  }\r\n\r\n  function journeyCategory(item){\r\n    const explicit = String(item.category || \"\").trim().toLowerCase();\r\n\r\n    if([\"accommodations\",\"restaurants\",\"transportation\",\"experiences\",\"services\"].includes(explicit)){\r\n      return explicit;\r\n    }\r\n\r\n    const text = journeyText(item);\r\n\r\n    if(item.source === \"local-services\" || item.source === \"local-services-request\" || item.service){\r\n      if(\/driver|airport|pickup|transport|car|vehicle|helicopter|yacht|boat|transfer|shuttle\/.test(text)){\r\n        return \"transportation\";\r\n      }\r\n      return \"services\";\r\n    }\r\n\r\n    if(\/hotel|accommodation|stay|suite|resort|hostel|villa|apartment|penthouse|mansion|eco.?stay|high.?rise\/.test(text)){\r\n      return \"accommodations\";\r\n    }\r\n\r\n    if(\/restaurant|dining|dinner|food|cafe|coffee shop|gastronomic|breakfast|lunch|brunch|bar\\b\/.test(text)){\r\n      return \"restaurants\";\r\n    }\r\n\r\n    if(\/driver|airport|pickup|transport|car|vehicle|helicopter|yacht|boat|transfer|shuttle\/.test(text)){\r\n      return \"transportation\";\r\n    }\r\n\r\n    return \"experiences\";\r\n  }\r\n\r\n  function journeyIsReservation(item){\r\n    const status = String(item.status || \"Saved\").toLowerCase();\r\n    return \/request|waiting|working|confirm|complete\/.test(status);\r\n  }\r\n\r\n  function journeyGroups(items){\r\n    const groups = {\r\n      accommodations:[],\r\n      restaurants:[],\r\n      transportation:[],\r\n      experiences:[],\r\n      services:[],\r\n      favorites:[],\r\n      reservations:[]\r\n    };\r\n\r\n    items.forEach(function(item){\r\n      const category = journeyCategory(item);\r\n      if(groups[category]) groups[category].push(item);\r\n      if(item.favorite === true) groups.favorites.push(item);\r\n      if(journeyIsReservation(item)) groups.reservations.push(item);\r\n    });\r\n\r\n    return groups;\r\n  }\r\n\r\n  function setJourneyView(view){\r\n    activeJourneyView = JOURNEY_VIEWS[view] ? view : \"dashboard\";\r\n\r\n    document.querySelectorAll(\"[data-mj-view]\").forEach(function(button){\r\n      button.classList.toggle(\r\n        \"is-active\",\r\n        button.getAttribute(\"data-mj-view\") === activeJourneyView\r\n      );\r\n    });\r\n\r\n    const title = document.getElementById(\"tc2MjViewTitle\");\r\n    if(title) title.textContent = JOURNEY_VIEWS[activeJourneyView][0];\r\n\r\n    renderJourney();\r\n  }\r\n\r\n  function updateJourneyCounts(groups){\r\n    Object.keys(groups).forEach(function(key){\r\n      document.querySelectorAll('[data-mj-count=\"' + key + '\"]').forEach(function(element){\r\n        element.textContent = groups[key].length;\r\n      });\r\n    });\r\n  }\r\n\r\n  function updateJourneyReadiness(groups){\r\n    const checks = [\r\n      [\"Accommodation\",groups.accommodations.length > 0],\r\n      [\"Restaurant\",groups.restaurants.length > 0],\r\n      [\"Transportation\",groups.transportation.length > 0],\r\n      [\"Experience\",groups.experiences.length > 0],\r\n      [\"Local Service\",groups.services.length > 0],\r\n      [\"Reservation Request\",groups.reservations.length > 0]\r\n    ];\r\n\r\n    const ready = checks.filter(function(check){return check[1]}).length;\r\n    const percent = Math.round((ready \/ checks.length) * 100);\r\n\r\n    const number = document.getElementById(\"tc2MjReadinessPercent\");\r\n    const bar = document.getElementById(\"tc2MjProgressBar\");\r\n    const checklist = document.getElementById(\"tc2MjChecklist\");\r\n    const message = document.getElementById(\"tc2MjReadinessMessage\");\r\n\r\n    if(number) number.textContent = percent + \"%\";\r\n    if(bar) bar.style.width = percent + \"%\";\r\n\r\n    if(checklist){\r\n      checklist.innerHTML = checks.map(function(check){\r\n        return '<div class=\"tc2-mj-check ' + (check[1] ? \"is-ready\" : \"\") + '\">' +\r\n          escapeHTML(check[0]) + '<\/div>';\r\n      }).join(\"\");\r\n    }\r\n\r\n    if(message){\r\n      message.textContent =\r\n        percent === 0 ? \"Start saving discoveries and Bliss will organize them here.\" :\r\n        percent < 50 ? \"Your Journey has started. Continue adding the essentials.\" :\r\n        percent < 100 ? \"Your trip is taking shape. Bliss can help complete what is missing.\" :\r\n        \"Your Journey has every essential category and is ready for confirmation.\";\r\n    }\r\n  }\r\n\r\n  function journeyCardHTML(item){\r\n    const id = journeyItemID(item);\r\n    const image = item.image || DEFAULT_IMAGE;\r\n    const website = safeURL(item.websiteUrl || item.url || \"\");\r\n    const status = String(item.status || \"Saved\");\r\n    const category = journeyCategory(item);\r\n\r\n    return `\r\n      <article class=\"tc2-mj-item\">\r\n        <div class=\"tc2-mj-itemMedia\" style=\"background-image:url('${escapeHTML(image)}')\"><\/div>\r\n\r\n        <div class=\"tc2-mj-itemBody\">\r\n          <div class=\"tc2-mj-itemTop\">\r\n            <span class=\"tc2-mj-itemType\">${escapeHTML(category)}<\/span>\r\n            <span class=\"tc2-mj-status\" data-status=\"${escapeHTML(status.toLowerCase())}\">\r\n              ${escapeHTML(status)}\r\n            <\/span>\r\n          <\/div>\r\n\r\n          <h4 class=\"tc2-mj-itemTitle\">${escapeHTML(item.title || \"Saved Experience\")}<\/h4>\r\n\r\n          ${item.location ? `<div class=\"tc2-mj-itemMeta\">Location: ${escapeHTML(item.location)}<\/div>` : \"\"}\r\n          ${item.time ? `<div class=\"tc2-mj-itemMeta\">Schedule: ${escapeHTML(item.time)}<\/div>` : \"\"}\r\n          ${item.description ? `<div class=\"tc2-mj-itemDescription\">${escapeHTML(item.description)}<\/div>` : \"\"}\r\n\r\n          <div class=\"tc2-btnRow\">\r\n            ${website ? `\r\n              <button class=\"tc2-btn tc2-btn-outline\" data-journey-website=\"${escapeHTML(id)}\" type=\"button\">\r\n                Visit Website\r\n              <\/button>` : \"\"}\r\n\r\n            <button class=\"tc2-btn tc2-btn-cyan\" data-journey-reserve=\"${escapeHTML(id)}\" type=\"button\">\r\n              ${journeyIsReservation(item) ? \"Update Request\" : \"Request Reservation\"}\r\n            <\/button>\r\n\r\n            <button class=\"tc2-btn tc2-btn-danger\" data-journey-remove=\"${escapeHTML(id)}\" type=\"button\">\r\n              Remove\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function journeyEmptyHTML(view){\r\n    const config = JOURNEY_VIEWS[view] || JOURNEY_VIEWS.dashboard;\r\n    const action = (view === \"transportation\" || view === \"services\")\r\n      ? `<button id=\"tc2JourneyGoServices\" class=\"tc2-btn tc2-btn-gold\" type=\"button\">Open Local Services<\/button>`\r\n      : `<button id=\"tc2JourneyGoExplore\" class=\"tc2-btn tc2-btn-cyan\" type=\"button\">Open Explore Medell\u00edn<\/button>`;\r\n\r\n    return `\r\n      <div class=\"tc2-mj-empty\">\r\n        <div class=\"tc2-mj-emptyInner\">\r\n          <span class=\"tc2-mj-label\">EMPTY SECTION<\/span>\r\n          <h4>${escapeHTML(config[1])}<\/h4>\r\n          <p>${escapeHTML(config[2])}<\/p>\r\n          <div class=\"tc2-btnRow\">\r\n            ${action}\r\n            <button id=\"tc2JourneyGoBrain\" class=\"tc2-btn tc2-btn-violet\" type=\"button\">\r\n              Open Travel Intelligence\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function dashboardCard(key,index,title,count,text){\r\n    return `\r\n      <button class=\"tc2-mj-dashCard\" data-mj-view=\"${escapeHTML(key)}\" type=\"button\">\r\n        <span class=\"tc2-mj-dashIndex\">${escapeHTML(index)}<\/span>\r\n        <strong class=\"tc2-mj-dashCount\">${count}<\/strong>\r\n        <h4>${escapeHTML(title)}<\/h4>\r\n        <p>${escapeHTML(text)}<\/p>\r\n      <\/button>\r\n    `;\r\n  }\r\n\r\n  function dashboardHTML(groups){\r\n    return `<div class=\"tc2-mj-dashboard\">\r\n      ${dashboardCard(\"accommodations\",\"01\",\"Accommodations\",groups.accommodations.length,\r\n        groups.accommodations.length ? \"Saved stays ready to review.\" : \"No place to stay selected yet.\")}\r\n      ${dashboardCard(\"restaurants\",\"02\",\"Restaurants\",groups.restaurants.length,\r\n        groups.restaurants.length ? \"Dining choices inside your Journey.\" : \"No dining selections saved yet.\")}\r\n      ${dashboardCard(\"transportation\",\"03\",\"Transportation\",groups.transportation.length,\r\n        groups.transportation.length ? \"Your saved movement and pickup options.\" : \"Airport pickup or driver still needed.\")}\r\n      ${dashboardCard(\"experiences\",\"04\",\"Tours & Experiences\",groups.experiences.length,\r\n        groups.experiences.length ? \"Activities waiting inside your Journey.\" : \"No tours or experiences saved yet.\")}\r\n      ${dashboardCard(\"services\",\"05\",\"Local Services\",groups.services.length,\r\n        groups.services.length ? \"Local support selected for your trip.\" : \"No concierge services selected yet.\")}\r\n      ${dashboardCard(\"reservations\",\"06\",\"Reservations\",groups.reservations.length,\r\n        groups.reservations.length ? \"Requests being tracked by Bliss.\" : \"Nothing has been requested yet.\")}\r\n    <\/div>`;\r\n  }\r\n\r\n  function reservationsHTML(items){\r\n    if(!items.length) return journeyEmptyHTML(\"reservations\");\r\n\r\n    return `<div class=\"tc2-mj-reservations\">\r\n      ${items.map(function(item){\r\n        const status = String(item.status || \"Saved\");\r\n        return `\r\n          <div class=\"tc2-mj-reservation\">\r\n            <span class=\"tc2-mj-dot\"><\/span>\r\n            <div>\r\n              <strong>${escapeHTML(item.title || \"Journey Item\")}<\/strong>\r\n              <span>${escapeHTML(journeyCategory(item))}<\/span>\r\n            <\/div>\r\n            <span class=\"tc2-mj-status\" data-status=\"${escapeHTML(status.toLowerCase())}\">\r\n              ${escapeHTML(status)}\r\n            <\/span>\r\n          <\/div>`;\r\n      }).join(\"\")}\r\n    <\/div>`;\r\n  }\r\n\r\n  function conciergeHTML(){\r\n    return `\r\n      <div class=\"tc2-mj-concierge\">\r\n        <section class=\"tc2-mj-conciergeCard\">\r\n          <span class=\"tc2-mj-label\">BLISS CONCIERGE<\/span>\r\n          <h4>Your trip does not have to be handled alone.<\/h4>\r\n          <p>\r\n            Send the complete Journey to Bliss or contact us about an individual item.\r\n            Reservation requests are reviewed and confirmed by a real person.\r\n          <\/p>\r\n          <div class=\"tc2-btnRow\">\r\n            <button id=\"tc2MjWhatsApp\" class=\"tc2-btn tc2-btn-cyan\" type=\"button\">Message Bliss<\/button>\r\n            <button id=\"tc2SendPlanBtnMirror\" class=\"tc2-btn tc2-btn-gold\" type=\"button\">Send Full Journey<\/button>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section class=\"tc2-mj-conciergeCard\">\r\n          <span class=\"tc2-mj-label\">CURRENT SUPPORT<\/span>\r\n          <h4>Human confirmation<\/h4>\r\n          <p>\r\n            Restaurants, transportation, tours, and local services stay requested\r\n            until Bliss or the provider confirms them.\r\n          <\/p>\r\n        <\/section>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function renderJourney(){\r\n    const planCards = document.getElementById(\"tc2PlanCards\");\r\n    if(!planCards) return;\r\n\r\n    const journey = readJourney();\r\n    const groups = journeyGroups(journey);\r\n\r\n    updateJourneySummary(journey);\r\n    updateJourneyCounts(groups);\r\n    updateJourneyReadiness(groups);\r\n\r\n    const destination = document.getElementById(\"tc2MjDestination\");\r\n    if(destination){\r\n      destination.textContent =\r\n        journey[0] && journey[0].location ? journey[0].location : \"MedaYork\";\r\n    }\r\n\r\n    if(activeJourneyView === \"dashboard\"){\r\n      planCards.innerHTML = dashboardHTML(groups);\r\n      return;\r\n    }\r\n\r\n    if(activeJourneyView === \"concierge\"){\r\n      planCards.innerHTML = conciergeHTML();\r\n      return;\r\n    }\r\n\r\n    if(activeJourneyView === \"reservations\"){\r\n      planCards.innerHTML = reservationsHTML(groups.reservations);\r\n      return;\r\n    }\r\n\r\n    const items = groups[activeJourneyView] || [];\r\n\r\n    planCards.innerHTML = items.length\r\n      ? `<div class=\"tc2-mj-list\">${items.map(journeyCardHTML).join(\"\")}<\/div>`\r\n      : journeyEmptyHTML(activeJourneyView);\r\n  }\r\n\r\n  \/*\r\n   * Expose My Journey immediately.\r\n   * This prevents later Local Services code from stopping\r\n   * the Journey renderer from becoming available.\r\n   *\/\r\n  window.tc2JourneyV7 =\r\n    window.tc2JourneyV7 || {};\r\n\r\n  window.tc2JourneyV7.read =\r\n    readJourney;\r\n\r\n  window.tc2JourneyV7.render =\r\n    renderJourney;\r\n\r\n\r\n  \/* =====================================================\r\n     LOCAL SERVICES MAIN CARDS\r\n  ===================================================== *\/\r\n  function serviceCardHTML(service){\r\n    const count = hostsForService(service.title).length;\r\n\r\n    return `\r\n      <button\r\n        class=\"tc2-localServiceCard ${\r\n          normalize(selectedService) === normalize(service.title)\r\n            ? \"is-selected\"\r\n            : \"\"\r\n        }\"\r\n        data-local-service=\"${escapeHTML(service.title)}\"\r\n        type=\"button\">\r\n\r\n        <h3>${escapeHTML(service.title)}<\/h3>\r\n\r\n        <p>${escapeHTML(service.desc)}<\/p>\r\n\r\n        <span class=\"tc2-serviceCount\">\r\n          ${\r\n            count === 1\r\n              ? \"1 Provider\"\r\n              : count + \" Providers\"\r\n          }\r\n        <\/span>\r\n      <\/button>\r\n    `;\r\n  }\r\n\r\n  function renderServices(){\r\n    const grid =\r\n      document.getElementById(\"tc2ServicesGrid\");\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n    grid.innerHTML = SERVICES\r\n      .map(serviceCardHTML)\r\n      .join(\"\");\r\n  }\r\n\r\n  \/* =====================================================\r\n     LOCAL SERVICE HOST RESULTS\r\n  ===================================================== *\/\r\n  function serviceHostHTML(host,serviceName){\r\n    const id = String(host.id || \"\");\r\n    const image = host.image || DEFAULT_IMAGE;\r\n    const title =\r\n      host.name ||\r\n      host.title ||\r\n      serviceName + \" Provider\";\r\n\r\n    const website =\r\n      host.websiteUrl ||\r\n      host.url ||\r\n      \"\";\r\n\r\n    const reservationReady =\r\n      host.reserveUrl ||\r\n      host.checkoutUrl ||\r\n      \"\";\r\n\r\n    return `\r\n      <article class=\"tc2-serviceHostCard\">\r\n        <div\r\n          class=\"tc2-serviceHostImage\"\r\n          style=\"background-image:url('${escapeHTML(image)}')\">\r\n        <\/div>\r\n\r\n        <div class=\"tc2-serviceHostBody\">\r\n          <div class=\"tc2-serviceHostMeta\">\r\n            ${\r\n              host.featured\r\n                ? \"\u2b50 Featured \u00b7 \"\r\n                : \"\"\r\n            }\r\n            ${escapeHTML(serviceName)}\r\n          <\/div>\r\n\r\n          <h3 class=\"tc2-serviceHostTitle\">\r\n            ${escapeHTML(title)}\r\n          <\/h3>\r\n\r\n          ${\r\n            host.location\r\n              ? `\r\n                <div class=\"tc2-serviceHostLocation\">\r\n                  \ud83d\udccd ${escapeHTML(host.location)}\r\n                <\/div>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          ${\r\n            host.price\r\n              ? `\r\n                <div class=\"tc2-serviceHostPrice\">\r\n                  ${escapeHTML(host.price)}\r\n                <\/div>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          ${\r\n            host.description || host.desc\r\n              ? `\r\n                <p class=\"tc2-serviceHostDescription\">\r\n                  ${escapeHTML(\r\n                    host.description ||\r\n                    host.desc ||\r\n                    \"\"\r\n                  )}\r\n                <\/p>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          <div class=\"tc2-btnRow\">\r\n            ${\r\n              website\r\n                ? `\r\n                  <button\r\n                    class=\"tc2-btn tc2-btn-outline\"\r\n                    data-service-website=\"${escapeHTML(id)}\"\r\n                    type=\"button\">\r\n                    Visit Host Website\r\n                  <\/button>\r\n                `\r\n                : \"\"\r\n            }\r\n\r\n            <button\r\n              class=\"tc2-btn tc2-btn-gold\"\r\n              data-service-save=\"${escapeHTML(id)}\"\r\n              type=\"button\">\r\n              Save to My Journey\r\n            <\/button>\r\n\r\n            <button\r\n              class=\"tc2-btn tc2-btn-cyan\"\r\n              data-service-reserve=\"${escapeHTML(id)}\"\r\n              type=\"button\">\r\n              Reserve With Bliss\r\n            <\/button>\r\n\r\n            ${\r\n              reservationReady\r\n                ? `\r\n                  <span class=\"tc2-serviceCount\">\r\n                    Reservation Ready\r\n                  <\/span>\r\n                `\r\n                : \"\"\r\n            }\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function selectService(serviceName){\r\n    selectedService = serviceName;\r\n\r\n    renderServices();\r\n\r\n    const typeChip =\r\n      document.getElementById(\"tc2ServiceTypeChip\");\r\n\r\n    const preview =\r\n      document.getElementById(\"tc2ServicePreview\");\r\n\r\n    const notes =\r\n      document.getElementById(\"tc2ServiceShortNotes\");\r\n\r\n    const hosts = hostsForService(serviceName);\r\n\r\n    if(typeChip){\r\n      typeChip.textContent =\r\n        serviceName + \" Selected\";\r\n    }\r\n\r\n    if(notes && !notes.value){\r\n      notes.value =\r\n        \"I need help with \" + serviceName + \".\";\r\n    }\r\n\r\n    if(!preview){\r\n      return;\r\n    }\r\n\r\n    if(!hosts.length){\r\n      preview.innerHTML = `\r\n        <div class=\"tc2-emptyJourney\">\r\n          <h3>${escapeHTML(serviceName)}<\/h3>\r\n\r\n          <p>\r\n            No active providers are connected to this service yet.\r\n            Add a host in the Control Panel under\r\n            <strong>Local Services \u2192 ${escapeHTML(serviceName)}<\/strong>.\r\n          <\/p>\r\n\r\n          <p>\r\n            The member can still complete the request form and\r\n            send a general service request.\r\n          <\/p>\r\n        <\/div>\r\n      `;\r\n\r\n      return;\r\n    }\r\n\r\n    preview.innerHTML = `\r\n      <div class=\"tc2-emptyJourney\">\r\n        <h3>${escapeHTML(serviceName)} Providers<\/h3>\r\n\r\n        <p>\r\n          Choose a connected provider. The member can visit\r\n          the host website, save the provider to My Journey,\r\n          or continue to the Bliss reservation flow.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"tc2-serviceHostResults\">\r\n        ${hosts.map(function(host){\r\n          return serviceHostHTML(\r\n            host,\r\n            serviceName\r\n          );\r\n        }).join(\"\")}\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  \/* =====================================================\r\n     SAVE LOCAL SERVICE HOST TO JOURNEY\r\n  ===================================================== *\/\r\n  function saveServiceHostToJourney(host){\r\n    if(!host){\r\n      return;\r\n    }\r\n\r\n    const serviceName =\r\n      selectedService ||\r\n      hostServiceName(host) ||\r\n      \"Local Service\";\r\n\r\n    const item = {\r\n      journeyId:\r\n        \"service-host|\" + String(host.id || \"\"),\r\n\r\n      hostId:\r\n        host.id || \"\",\r\n\r\n      source:\r\n        \"local-services\",\r\n\r\n      type:\r\n        \"Local Services \u00b7 \" + serviceName,\r\n\r\n      service:\r\n        serviceName,\r\n\r\n      title:\r\n        host.name ||\r\n        host.title ||\r\n        serviceName + \" Provider\",\r\n\r\n      location:\r\n        host.location ||\r\n        \"MedaYork \u00b7 Medell\u00edn\",\r\n\r\n      time:\r\n        \"Local Service Request\",\r\n\r\n      status:\r\n        \"Saved\",\r\n\r\n      image:\r\n        host.image ||\r\n        DEFAULT_IMAGE,\r\n\r\n      description:\r\n        host.description ||\r\n        host.desc ||\r\n        serviceName + \" provider saved from Local Services.\",\r\n\r\n      websiteUrl:\r\n        host.websiteUrl ||\r\n        host.url ||\r\n        \"\",\r\n\r\n      reserveUrl:\r\n        host.reserveUrl ||\r\n        \"\",\r\n\r\n      checkoutUrl:\r\n        host.checkoutUrl ||\r\n        \"\"\r\n    };\r\n\r\n    const saved = addJourneyItem(item);\r\n\r\n    if(saved){\r\n      showMessage(\r\n        \"Saved to My Journey\",\r\n        item.title +\r\n        \" was added to My Journey.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  \/* =====================================================\r\n     SAVE THE MANUAL SERVICE REQUEST TO JOURNEY\r\n\r\n     This works with the existing Local Services form.\r\n  ===================================================== *\/\r\n  function saveManualServiceRequest(){\r\n    if(!selectedService){\r\n      showMessage(\r\n        \"Choose a Service\",\r\n        \"Select a Local Service before adding the request to My Journey.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const location =\r\n      document.getElementById(\"tc2ServiceLocation\");\r\n\r\n    const date =\r\n      document.getElementById(\"tc2ServiceDate\");\r\n\r\n    const time =\r\n      document.getElementById(\"tc2ServiceTime\");\r\n\r\n    const guests =\r\n      document.getElementById(\"tc2ServiceGuests\");\r\n\r\n    const shortNotes =\r\n      document.getElementById(\"tc2ServiceShortNotes\");\r\n\r\n    const notes =\r\n      document.getElementById(\"tc2ServiceNotes\");\r\n\r\n    const attach =\r\n      document.getElementById(\"tc2ServiceAttach\");\r\n\r\n    const dateValue = date ? date.value : \"\";\r\n    const timeValue = time ? time.value : \"\";\r\n\r\n    const item = {\r\n      journeyId:\r\n        \"manual-service|\" +\r\n        normalize(selectedService) +\r\n        \"|\" +\r\n        dateValue +\r\n        \"|\" +\r\n        timeValue +\r\n        \"|\" +\r\n        Date.now(),\r\n\r\n      source:\r\n        \"local-services-request\",\r\n\r\n      type:\r\n        \"Local Service Request\",\r\n\r\n      service:\r\n        selectedService,\r\n\r\n      title:\r\n        selectedService,\r\n\r\n      location:\r\n        location && location.value\r\n          ? location.value\r\n          : \"MedaYork \u00b7 Medell\u00edn\",\r\n\r\n      time:\r\n        [dateValue,timeValue]\r\n          .filter(Boolean)\r\n          .join(\" \u00b7 \") ||\r\n        \"Schedule Pending\",\r\n\r\n      status:\r\n        \"Request Saved\",\r\n\r\n      image:\r\n        DEFAULT_IMAGE,\r\n\r\n      description:[\r\n        guests && guests.value\r\n          ? \"Guests: \" + guests.value\r\n          : \"\",\r\n\r\n        attach && attach.value\r\n          ? \"Attach to: \" + attach.value\r\n          : \"\",\r\n\r\n        shortNotes && shortNotes.value\r\n          ? shortNotes.value\r\n          : \"\",\r\n\r\n        notes && notes.value\r\n          ? notes.value\r\n          : \"\"\r\n      ].filter(Boolean).join(\" \u00b7 \")\r\n    };\r\n\r\n    const saved = addJourneyItem(item);\r\n\r\n    if(saved){\r\n      showMessage(\r\n        \"Service Added\",\r\n        selectedService +\r\n        \" was added to My Journey.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  \/* =====================================================\r\n     WEBSITE \/ RESERVATION ACTIONS\r\n  ===================================================== *\/\r\n  function openHostWebsite(host){\r\n    if(!host){\r\n      return;\r\n    }\r\n\r\n    const url = safeURL(\r\n      host.websiteUrl ||\r\n      host.url ||\r\n      \"\"\r\n    );\r\n\r\n    if(!url){\r\n      showMessage(\r\n        \"Website Not Added\",\r\n        \"This host does not have a website URL in the Control Panel yet.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    window.open(\r\n      url,\r\n      \"_blank\",\r\n      \"noopener\"\r\n    );\r\n  }\r\n\r\n  \/* =====================================================\r\n   LOCAL SERVICES\r\n   RESERVE WITH BLISS \u2192 CONCIERGE REQUEST V1\r\n===================================================== *\/\r\n\r\nasync function reserveHost(host){\r\n\r\n  if(!host){\r\n    showMessage(\r\n      \"Provider Not Available\",\r\n      \"This Local Service provider could not be found.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const config =\r\n    window.BlissJourneyMemberConfig || {};\r\n\r\n  if(!config.loggedIn){\r\n    showMessage(\r\n      \"Sign In Required\",\r\n      \"Please sign in before requesting a Local Service from Bliss.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(!config.hasLevel2){\r\n    showMessage(\r\n      \"Travel Club Level 2 Required\",\r\n      \"Reserve With Bliss is available with Travel Club Level 2.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(\r\n    !window.BlissJourneyAccount ||\r\n    typeof window.BlissJourneyAccount.addItem !== \"function\"\r\n  ){\r\n    showMessage(\r\n      \"Journey Connection Loading\",\r\n      \"Your Journey account is still connecting. Refresh the page and try again.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const serviceName =\r\n    selectedService ||\r\n    hostServiceName(host) ||\r\n    \"Local Service\";\r\n\r\n  const journeyId =\r\n    \"service-host|\" +\r\n    String(\r\n      host.id ||\r\n      host.hostId ||\r\n      normalize(\r\n        host.name ||\r\n        host.title ||\r\n        serviceName\r\n      )\r\n    );\r\n\r\n  const requestedAt =\r\n    new Date().toISOString();\r\n\r\n  const item = {\r\n\r\n    journeyId:\r\n      journeyId,\r\n\r\n    hostId:\r\n      host.id ||\r\n      host.hostId ||\r\n      \"\",\r\n\r\n    source:\r\n      \"local-services\",\r\n\r\n    requestSource:\r\n      \"local-services-reserve\",\r\n\r\n    type:\r\n      \"Local Services \u00b7 \" +\r\n      serviceName,\r\n\r\n    category:\r\n      \/driver|airport|pickup|transport|car|vehicle|transfer|shuttle\/i\r\n        .test(serviceName)\r\n          ? \"Transportation\"\r\n          : \"Local Services\",\r\n\r\n    service:\r\n      serviceName,\r\n\r\n    title:\r\n      host.name ||\r\n      host.title ||\r\n      serviceName + \" Provider\",\r\n\r\n    location:\r\n      host.location ||\r\n      \"MedaYork \u00b7 Medell\u00edn\",\r\n\r\n    time:\r\n      \"Schedule Pending\",\r\n\r\n    status:\r\n      \"Requested\",\r\n\r\n    reservationStatus:\r\n      \"Requested\",\r\n\r\n    requestedAt:\r\n      requestedAt,\r\n\r\n    customerSubmitted:\r\n      \"1\",\r\n\r\n    image:\r\n      host.image ||\r\n      DEFAULT_IMAGE,\r\n\r\n    images:\r\n      Array.isArray(host.images)\r\n        ? host.images\r\n        : [],\r\n\r\n    description:\r\n      host.description ||\r\n      host.desc ||\r\n      serviceName +\r\n        \" requested through Local Services.\",\r\n\r\n    websiteUrl:\r\n      host.websiteUrl ||\r\n      host.url ||\r\n      \"\",\r\n\r\n    reserveUrl:\r\n      host.reserveUrl ||\r\n      \"\",\r\n\r\n    checkoutUrl:\r\n      host.checkoutUrl ||\r\n      \"\"\r\n  };\r\n\r\n  try{\r\n\r\n    const result =\r\n      await window.BlissJourneyAccount.addItem(\r\n        item\r\n      );\r\n\r\n    \/*\r\n     * If the provider was previously saved, change that\r\n     * existing item from Saved to Requested.\r\n     *\/\r\n    if(\r\n      result &&\r\n      result.duplicate &&\r\n      typeof window.BlissJourneyAccount.updateItem ===\r\n        \"function\"\r\n    ){\r\n      await window.BlissJourneyAccount.updateItem(\r\n        journeyId,\r\n        {\r\n          status:\r\n            \"Requested\",\r\n\r\n          reservationStatus:\r\n            \"Requested\",\r\n\r\n          requestedAt:\r\n            requestedAt,\r\n\r\n          requestSource:\r\n            \"local-services-reserve\",\r\n\r\n          customerSubmitted:\r\n            \"1\"\r\n        }\r\n      );\r\n    }\r\n\r\n    \/*\r\n     * Reload the authoritative WordPress account Journey.\r\n     *\/\r\n    if(\r\n      typeof window.BlissJourneyAccount.load ===\r\n        \"function\"\r\n    ){\r\n      await window.BlissJourneyAccount.load(true);\r\n    }\r\n\r\n    \/*\r\n     * Refresh My Journey so the Requested status\r\n     * appears immediately.\r\n     *\/\r\n    if(\r\n      window.tc2JourneyV7 &&\r\n      typeof window.tc2JourneyV7.render ===\r\n        \"function\"\r\n    ){\r\n      window.tc2JourneyV7.render();\r\n    }\r\n\r\n    window.dispatchEvent(\r\n      new CustomEvent(\r\n        \"blissLocalServiceRequested\",\r\n        {\r\n          detail:{\r\n            item:item,\r\n            service:serviceName,\r\n            host:host\r\n          }\r\n        }\r\n      )\r\n    );\r\n\r\n    showMessage(\r\n      \"Service Request Sent\",\r\n      item.title +\r\n      \" was added to My Journey and sent to Bliss Concierge for review.\"\r\n    );\r\n\r\n  }catch(error){\r\n\r\n    console.error(\r\n      \"[Bliss Local Services] Request failed:\",\r\n      error\r\n    );\r\n\r\n    showMessage(\r\n      \"Request Not Sent\",\r\n      error &&\r\n      error.message\r\n        ? error.message\r\n        : \"This Local Service request could not be sent to Bliss.\"\r\n    );\r\n  }\r\n}\r\n  function findJourneyItem(itemID){\r\n    return readJourney().find(function(item){\r\n      return journeyItemID(item) === String(itemID);\r\n    });\r\n  }\r\n\r\n  function openJourneyWebsite(item){\r\n    if(!item){\r\n      return;\r\n    }\r\n\r\n    const url = safeURL(\r\n      item.websiteUrl ||\r\n      item.url ||\r\n      \"\"\r\n    );\r\n\r\n    if(!url){\r\n      showMessage(\r\n        \"Website Not Added\",\r\n        \"This saved Journey item does not have a website URL.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    window.open(\r\n      url,\r\n      \"_blank\",\r\n      \"noopener\"\r\n    );\r\n  }\r\n\r\n function reserveJourneyItem(item){\r\n    if(!item) return;\r\n\r\n    const journey = readJourney();\r\n    const targetID = journeyItemID(item);\r\n\r\n    const updatedJourney = journey.map(function(savedItem){\r\n      if(journeyItemID(savedItem) !== targetID) return savedItem;\r\n\r\n      return Object.assign({},savedItem,{\r\n        status:\"Requested\",\r\n        requestDate:new Date().toISOString()\r\n      });\r\n    });\r\n\r\n    writeJourney(updatedJourney,true);\r\n    renderJourney();\r\n\r\n    const updatedItem = updatedJourney.find(function(savedItem){\r\n      return journeyItemID(savedItem) === targetID;\r\n    }) || item;\r\n\r\n    const lines = [\r\n      \"Hello Bliss Travel Club,\",\r\n      \"\",\r\n      \"I would like to request help with this Journey item:\",\r\n      \"\",\r\n      \"Name: \" + (updatedItem.title || \"Journey Item\"),\r\n      \"Category: \" + journeyCategory(updatedItem),\r\n      \"Location: \" + (updatedItem.location || \"Not selected\"),\r\n      \"Schedule: \" + (updatedItem.time || \"Not selected\"),\r\n      \"Status: Requested\"\r\n    ];\r\n\r\n    if(updatedItem.description){\r\n      lines.push(\"Details: \" + updatedItem.description);\r\n    }\r\n\r\n    window.open(\r\n      \"https:\/\/wa.me\/573147629693?text=\" +\r\n      encodeURIComponent(lines.join(\"\\n\")),\r\n      \"_blank\",\r\n      \"noopener\"\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SEND FULL JOURNEY\r\n  ===================================================== *\/\r\n  function sendFullJourney(){\r\n    const journey = readJourney();\r\n\r\n    if(!journey.length){\r\n      showMessage(\r\n        \"Journey Is Empty\",\r\n        \"Add at least one host, service, or experience before sending the Journey request.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const lines = [\r\n      \"Hello Bliss Travel Club,\",\r\n      \"\",\r\n      \"I would like help with my saved Journey:\",\r\n      \"\"\r\n    ];\r\n\r\n    journey.forEach(function(item,index){\r\n      lines.push(\r\n        (index + 1) + \". \" +\r\n        (item.title || \"Journey Item\")\r\n      );\r\n\r\n      if(item.type){\r\n        lines.push(\r\n          \"Type: \" + item.type\r\n        );\r\n      }\r\n\r\n      if(item.location){\r\n        lines.push(\r\n          \"Location: \" + item.location\r\n        );\r\n      }\r\n\r\n      if(item.time){\r\n        lines.push(\r\n          \"Date \/ Time: \" + item.time\r\n        );\r\n      }\r\n\r\n      if(item.description){\r\n        lines.push(\r\n          \"Details: \" + item.description\r\n        );\r\n      }\r\n\r\n      lines.push(\"\");\r\n    });\r\n\r\n    const whatsapp =\r\n      \"https:\/\/wa.me\/573147629693?text=\" +\r\n      encodeURIComponent(lines.join(\"\\n\"));\r\n\r\n    window.open(\r\n      whatsapp,\r\n      \"_blank\",\r\n      \"noopener\"\r\n    );\r\n  }\r\n\r\n  \/* =====================================================\r\n     MAIN CLICK CONNECTIONS\r\n\r\n     Capture mode is used so this corrected V7 connection\r\n     runs before older conflicting Local Services handlers.\r\n  ===================================================== *\/\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\nconst journeyViewButton = event.target.closest(\"[data-mj-view]\");\r\n\r\n      if(journeyViewButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        setJourneyView(\r\n          journeyViewButton.getAttribute(\"data-mj-view\")\r\n        );\r\n\r\n        const sidebar = document.querySelector(\"#tc2JourneyPage .tc2-mj-sidebar\");\r\n        if(sidebar && window.innerWidth <= 900){\r\n          sidebar.classList.remove(\"is-open\");\r\n        }\r\n        return;\r\n      }\r\n\r\n      const journeyMobileNav = event.target.closest(\"#tc2MjMobileNav\");\r\n\r\n      if(journeyMobileNav){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        const sidebar = document.querySelector(\"#tc2JourneyPage .tc2-mj-sidebar\");\r\n        if(sidebar) sidebar.classList.toggle(\"is-open\");\r\n        return;\r\n      }\r\n\r\n      const journeyWhatsApp = event.target.closest(\"#tc2MjWhatsApp\");\r\n\r\n      if(journeyWhatsApp){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        window.open(\r\n          \"https:\/\/wa.me\/573147629693?text=\" +\r\n          encodeURIComponent(\"Hello Bliss Travel Club, I need help with My Journey.\"),\r\n          \"_blank\",\r\n          \"noopener\"\r\n        );\r\n        return;\r\n      }\r\n\r\n      const sendJourneyMirror = event.target.closest(\"#tc2SendPlanBtnMirror\");\r\n\r\n      if(sendJourneyMirror){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        sendFullJourney();\r\n        return;\r\n      }\r\n\r\n\r\n      \/* ---------- OPEN JOURNEY ---------- *\/\r\n      const openJourney = event.target.closest(\r\n        \"#tc2MainJourney,#tc2FloatJourney\"\r\n      );\r\n\r\n      if(openJourney){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        showTC2Page(\"tc2JourneyPage\");\r\n        renderJourney();\r\n        return;\r\n      }\r\n\r\n      \/* ---------- OPEN SERVICES ---------- *\/\r\n      const openServices = event.target.closest(\r\n        \"#tc2MainServices,\" +\r\n        \"#tc2FloatServices,\" +\r\n        \"#tc2OpenServicesFromPlan,\" +\r\n        \"#tc2JourneyGoServices\"\r\n      );\r\n\r\n      if(openServices){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        showTC2Page(\"tc2ServicesPage\");\r\n        renderServices();\r\n\r\n        if(selectedService){\r\n          selectService(selectedService);\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- OPEN EXPLORE ---------- *\/\r\n      const openExplore = event.target.closest(\r\n        \"#tc2JourneyGoExplore\"\r\n      );\r\n\r\n      if(openExplore){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        showTC2Page(\"tc2ExplorePage\");\r\n\r\n        if(\r\n          window.tc2ExploreV6 &#038;&#038;\r\n          typeof window.tc2ExploreV6.renderGuides === \"function\"\r\n        ){\r\n          window.tc2ExploreV6.renderGuides();\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- OPEN TRAVEL INTELLIGENCE ---------- *\/\r\n      const openBrain = event.target.closest(\r\n        \"#tc2JourneyGoBrain\"\r\n      );\r\n\r\n      if(openBrain){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        showTC2Page(\"tc2BrainPage\");\r\n        return;\r\n      }\r\n\r\n      \/* ---------- OPEN STORY ---------- *\/\r\n      const openStory = event.target.closest(\r\n        \"#tc2MainStory,#tc2FloatStory\"\r\n      );\r\n\r\n      if(openStory){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        showTC2Page(\"tc2StoryPage\");\r\n        return;\r\n      }\r\n\r\n      \/* ---------- CHOOSE SERVICE ---------- *\/\r\n      const serviceButton = event.target.closest(\r\n        \"[data-local-service]\"\r\n      );\r\n\r\n      if(serviceButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        selectService(\r\n          serviceButton.getAttribute(\r\n            \"data-local-service\"\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* Support the old data-service attribute if present. *\/\r\n      const legacyServiceButton = event.target.closest(\r\n        \"[data-service]\"\r\n      );\r\n\r\n      if(\r\n        legacyServiceButton &#038;&#038;\r\n        legacyServiceButton.classList.contains(\r\n          \"tc2-localServiceCard\"\r\n        )\r\n      ){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        selectService(\r\n          legacyServiceButton.getAttribute(\r\n            \"data-service\"\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- SERVICE HOST WEBSITE ---------- *\/\r\n      const serviceWebsiteButton = event.target.closest(\r\n        \"[data-service-website]\"\r\n      );\r\n\r\n      if(serviceWebsiteButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        openHostWebsite(\r\n          findHost(\r\n            serviceWebsiteButton.getAttribute(\r\n              \"data-service-website\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- SAVE SERVICE HOST ---------- *\/\r\n      const saveServiceButton = event.target.closest(\r\n        \"[data-service-save]\"\r\n      );\r\n\r\n      if(saveServiceButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        saveServiceHostToJourney(\r\n          findHost(\r\n            saveServiceButton.getAttribute(\r\n              \"data-service-save\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- RESERVE SERVICE HOST ---------- *\/\r\n      const reserveServiceButton = event.target.closest(\r\n        \"[data-service-reserve]\"\r\n      );\r\n\r\n      if(reserveServiceButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        reserveHost(\r\n          findHost(\r\n            reserveServiceButton.getAttribute(\r\n              \"data-service-reserve\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- ADD MANUAL SERVICE REQUEST ---------- *\/\r\n      const addServiceButton = event.target.closest(\r\n        \"#tc2AddServiceBtn\"\r\n      );\r\n\r\n      if(addServiceButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        saveManualServiceRequest();\r\n        return;\r\n      }\r\n\r\n      \/* ---------- SAVE JOURNEY PERMANENTLY ---------- *\/\r\n      const saveJourneyButton = event.target.closest(\r\n        \"#tc2SavePlanBtn\"\r\n      );\r\n\r\n      if(saveJourneyButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        permanentlySaveJourney();\r\n        return;\r\n      }\r\n\r\n      \/* ---------- SEND FULL JOURNEY ---------- *\/\r\n      const sendJourneyButton = event.target.closest(\r\n        \"#tc2SendPlanBtn\"\r\n      );\r\n\r\n      if(sendJourneyButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        sendFullJourney();\r\n        return;\r\n      }\r\n\r\n      \/* ---------- REMOVE JOURNEY ITEM ---------- *\/\r\n      const removeJourneyButton = event.target.closest(\r\n        \"[data-journey-remove]\"\r\n      );\r\n\r\n      if(removeJourneyButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        removeJourneyItem(\r\n          removeJourneyButton.getAttribute(\r\n            \"data-journey-remove\"\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- JOURNEY WEBSITE ---------- *\/\r\n      const journeyWebsiteButton = event.target.closest(\r\n        \"[data-journey-website]\"\r\n      );\r\n\r\n      if(journeyWebsiteButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        openJourneyWebsite(\r\n          findJourneyItem(\r\n            journeyWebsiteButton.getAttribute(\r\n              \"data-journey-website\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/* ---------- JOURNEY RESERVATION ---------- *\/\r\n      const journeyReserveButton = event.target.closest(\r\n        \"[data-journey-reserve]\"\r\n      );\r\n\r\n      if(journeyReserveButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        reserveJourneyItem(\r\n          findJourneyItem(\r\n            journeyReserveButton.getAttribute(\r\n              \"data-journey-reserve\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  \/* =====================================================\r\n     STORAGE SYNC\r\n\r\n     Refresh Local Services if hosts are changed in another\r\n     tab\/window. Also refresh Journey after a storage update.\r\n  ===================================================== *\/\r\n  window.addEventListener(\r\n    \"storage\",\r\n    function(event){\r\n      if(HOST_STORAGE_KEYS.includes(event.key)){\r\n        renderServices();\r\n\r\n        if(selectedService){\r\n          selectService(selectedService);\r\n        }\r\n      }\r\n\r\n      if(event.key === JOURNEY_PERMANENT_KEY){\r\n        renderJourney();\r\n      }\r\n    }\r\n  );\r\n\r\n  \/*\r\n    Explore and Astro may save directly into sessionStorage.\r\n    This custom event can also be called by future modules.\r\n  *\/\r\n  window.addEventListener(\r\n    \"tc2JourneyUpdated\",\r\n    function(){\r\n      const journey = readJSON(\r\n        sessionStorage,\r\n        JOURNEY_SESSION_KEY\r\n      );\r\n\r\n      if(journey.length){\r\n        writeJourney(journey,true);\r\n      }\r\n\r\n      renderJourney();\r\n    }\r\n  );\r\n\r\n  \/*\r\n    Public helper for any other Travel Club module.\r\n\r\n    Example:\r\n    window.tc2JourneyV7.addItem({...});\r\n  *\/\r\n\r\n  window.tc2JourneyV7 = {\r\n    read:readJourney,\r\n    write:function(items){\r\n      writeJourney(items,true);\r\n      renderJourney();\r\n    },\r\n    addItem:function(item){\r\n      const result = addJourneyItem(item);\r\n      renderJourney();\r\n      return result;\r\n    },\r\n    removeItem:function(id){\r\n      removeJourneyItem(id);\r\n    },\r\n    render:renderJourney,\r\n    renderServices:renderServices,\r\n    selectService:selectService,\r\n    getHosts:readHosts,\r\n    getServiceHosts:hostsForService\r\n  };\r\n\r\n  function initializeConnection(){\r\n    \/*\r\n      Restore permanent Journey into the session before the\r\n      Journey page is opened.\r\n    *\/\r\n    readJourney();\r\n\r\n    renderServices();\r\n    renderJourney();\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      initializeConnection\r\n    );\r\n  }else{\r\n    initializeConnection();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL INTELLIGENCE V1\r\nADD AT THE BOTTOM OF THE TRAVEL CLUB HIDDEN-PAGE CODE\r\n\r\nSAVES:\r\nBLISS_TRAVEL_INTELLIGENCE_V1\r\n\r\nUSES:\r\n- #tc2MainBrain\r\n- #tc2BrainPage\r\n- Existing avatar elements outside the hidden page\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =====================================================\r\n   TRAVEL INTELLIGENCE LAYOUT\r\n===================================================== *\/\r\n.tc2-ti-wrap{\r\n  display:grid;\r\n  gap:20px;\r\n  margin-top:22px;\r\n}\r\n\r\n.tc2-ti-intro{\r\n  padding:22px;\r\n  border-radius:28px;\r\n  border:1px solid rgba(139,92,246,.24);\r\n  background:\r\n    radial-gradient(circle at top left,rgba(139,92,246,.15),transparent 34%),\r\n    linear-gradient(180deg,rgba(10,18,40,.96),rgba(2,5,13,.99));\r\n}\r\n\r\n.tc2-ti-intro h3{\r\n  margin:0;\r\n  font-size:1.65rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-intro p{\r\n  margin:12px 0 0;\r\n  color:rgba(248,251,255,.78);\r\n  line-height:1.75;\r\n}\r\n\r\n.tc2-ti-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:16px;\r\n}\r\n\r\n.tc2-ti-card{\r\n  padding:19px;\r\n  border-radius:25px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  background:rgba(255,255,255,.035);\r\n}\r\n\r\n.tc2-ti-card h3{\r\n  margin:0 0 7px;\r\n  color:#fff;\r\n  font-size:1.16rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-card p{\r\n  margin:0 0 14px;\r\n  color:rgba(248,251,255,.64);\r\n  line-height:1.55;\r\n  font-size:.9rem;\r\n}\r\n\r\n.tc2-ti-label{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:#b9dfff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.13em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-select,\r\n.tc2-ti-input{\r\n  width:100%;\r\n  min-height:50px;\r\n  padding:0 14px;\r\n  border-radius:17px;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  background:#050b18;\r\n  color:#fff;\r\n  outline:none;\r\n}\r\n\r\n.tc2-ti-select option{\r\n  color:#111;\r\n}\r\n\r\n.tc2-ti-options{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:9px;\r\n}\r\n\r\n.tc2-ti-choice{\r\n  position:relative;\r\n}\r\n\r\n.tc2-ti-choice input{\r\n  position:absolute;\r\n  opacity:0;\r\n  pointer-events:none;\r\n}\r\n\r\n.tc2-ti-choice span{\r\n  min-height:42px;\r\n  padding:0 14px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  border-radius:999px;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  background:rgba(255,255,255,.045);\r\n  color:#eaf5ff;\r\n  cursor:pointer;\r\n  font-size:.76rem;\r\n  font-weight:800;\r\n  letter-spacing:.05em;\r\n  transition:.2s ease;\r\n}\r\n\r\n.tc2-ti-choice input:checked + span{\r\n  border-color:#8b5cf6;\r\n  background:linear-gradient(\r\n    135deg,\r\n    rgba(139,92,246,.45),\r\n    rgba(83,243,255,.20)\r\n  );\r\n  box-shadow:0 0 17px rgba(139,92,246,.20);\r\n}\r\n\r\n.tc2-ti-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:10px;\r\n}\r\n\r\n.tc2-ti-summary{\r\n  padding:22px;\r\n  border-radius:28px;\r\n  border:1px solid rgba(83,243,255,.22);\r\n  background:\r\n    radial-gradient(circle at top left,rgba(83,243,255,.08),transparent 32%),\r\n    rgba(255,255,255,.035);\r\n}\r\n\r\n.tc2-ti-summary h3{\r\n  margin:0;\r\n  font-size:1.5rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-status{\r\n  display:inline-flex;\r\n  margin-top:12px;\r\n  padding:7px 12px;\r\n  border-radius:999px;\r\n  color:#baffd0;\r\n  background:rgba(112,247,162,.10);\r\n  border:1px solid rgba(112,247,162,.24);\r\n  font-size:.7rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-summaryGrid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:10px;\r\n  margin-top:18px;\r\n}\r\n\r\n.tc2-ti-summaryItem{\r\n  padding:13px;\r\n  border-radius:18px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.08);\r\n}\r\n\r\n.tc2-ti-summaryLabel{\r\n  color:rgba(248,251,255,.55);\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-ti-summaryValue{\r\n  margin-top:7px;\r\n  color:#fff;\r\n  font-weight:800;\r\n  line-height:1.5;\r\n}\r\n\r\n.tc2-ti-success{\r\n  display:none;\r\n  margin-top:14px;\r\n  padding:12px 14px;\r\n  border-radius:16px;\r\n  color:#caffd9;\r\n  border:1px solid rgba(112,247,162,.26);\r\n  background:rgba(112,247,162,.08);\r\n}\r\n\r\n.tc2-ti-success.show{\r\n  display:block;\r\n}\r\n\r\n@media(min-width:800px){\r\n  .tc2-ti-grid{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  .tc2-ti-summaryGrid{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media(min-width:1180px){\r\n  .tc2-ti-grid{\r\n    grid-template-columns:repeat(3,minmax(0,1fr));\r\n  }\r\n\r\n  .tc2-ti-summaryGrid{\r\n    grid-template-columns:repeat(3,minmax(0,1fr));\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* =====================================================\r\n     SETTINGS\r\n  ===================================================== *\/\r\n  const PROFILE_KEY =\r\n    \"BLISS_TRAVEL_INTELLIGENCE_V1\";\r\n\r\n  const RECOMMENDATION_KEY =\r\n    \"BLISS_AVATAR_RECOMMENDATION_V1\";\r\n\r\n  const TRAVEL_CLUB_URL =\r\n    \"https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/?travelclub=1\";\r\n\r\n  const DEFAULT_PROFILE = {\r\n    completed:false,\r\n    createdAt:\"\",\r\n    updatedAt:\"\",\r\n\r\n    destination:\"MedaYork \u00b7 Medell\u00edn\",\r\n    travelerName:\"\",\r\n    language:\"English\",\r\n\r\n    travelStyle:\"Balanced\",\r\n    budget:\"$$$\",\r\n    tripLength:\"4\u20136 Days\",\r\n    transportation:\"Private Driver\",\r\n    travelingWith:\"Couple\",\r\n    pace:\"Balanced\",\r\n\r\n    interests:[],\r\n    foodStyle:[],\r\n    preferredTimes:[],\r\n\r\n    accessibility:\"\",\r\n    notes:\"\"\r\n  };\r\n\r\n  let currentAvatarRecommendation = null;\r\n\r\n  \/* =====================================================\r\n     HELPERS\r\n  ===================================================== *\/\r\n  function tiGet(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function tiEscape(value){\r\n    return String(value == null ? \"\" : value)\r\n      .replace(\/[&<>\"']\/g,function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      });\r\n  }\r\n\r\n  function tiReadJSON(key,fallback){\r\n    try{\r\n      const parsed = JSON.parse(\r\n        localStorage.getItem(key) || \"\"\r\n      );\r\n\r\n      return parsed &&\r\n        typeof parsed === \"object\"\r\n          ? parsed\r\n          : fallback;\r\n    }catch(error){\r\n      return fallback;\r\n    }\r\n  }\r\n\r\n  function tiReadProfile(){\r\n    return Object.assign(\r\n      {},\r\n      DEFAULT_PROFILE,\r\n      tiReadJSON(PROFILE_KEY,{})\r\n    );\r\n  }\r\n\r\n  function tiWriteProfile(profile){\r\n    localStorage.setItem(\r\n      PROFILE_KEY,\r\n      JSON.stringify(profile)\r\n    );\r\n\r\n    try{\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissTravelProfileUpdated\",\r\n          {detail:profile}\r\n        )\r\n      );\r\n    }catch(error){}\r\n  }\r\n\r\n  function tiArray(value){\r\n    return Array.isArray(value) ? value : [];\r\n  }\r\n\r\n  function tiNormalize(value){\r\n    return String(value || \"\")\r\n      .trim()\r\n      .toLowerCase();\r\n  }\r\n\r\n  function tiIncludes(array,value){\r\n    const wanted = tiNormalize(value);\r\n\r\n    return tiArray(array).some(function(item){\r\n      return tiNormalize(item) === wanted;\r\n    });\r\n  }\r\n\r\n  function tiShowPage(pageId){\r\n    document\r\n      .querySelectorAll(\"#tc2Overlay .tc2-page\")\r\n      .forEach(function(page){\r\n        page.classList.remove(\"active\");\r\n        page.style.display = \"none\";\r\n      });\r\n\r\n    const target = tiGet(pageId);\r\n\r\n    if(target){\r\n      target.classList.add(\"active\");\r\n      target.style.display = \"block\";\r\n    }\r\n\r\n    const overlay = tiGet(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      overlay.style.display = \"block\";\r\n\r\n      try{\r\n        overlay.scrollTo({\r\n          top:0,\r\n          behavior:\"smooth\"\r\n        });\r\n      }catch(error){\r\n        overlay.scrollTop = 0;\r\n      }\r\n    }\r\n  }\r\n\r\n  function tiChoiceHTML(group,value,label){\r\n    return `\r\n      <label class=\"tc2-ti-choice\">\r\n        <input\r\n          type=\"checkbox\"\r\n          name=\"${tiEscape(group)}\"\r\n          value=\"${tiEscape(value)}\">\r\n        <span>${tiEscape(label || value)}<\/span>\r\n      <\/label>\r\n    `;\r\n  }\r\n\r\n  function tiSelectedValues(group){\r\n    return Array.from(\r\n      document.querySelectorAll(\r\n        'input[name=\"' + group + '\"]:checked'\r\n      )\r\n    ).map(function(input){\r\n      return input.value;\r\n    });\r\n  }\r\n\r\n  function tiSetChecked(group,values){\r\n    const savedValues =\r\n      tiArray(values).map(tiNormalize);\r\n\r\n    document.querySelectorAll(\r\n      'input[name=\"' + group + '\"]'\r\n    ).forEach(function(input){\r\n      input.checked =\r\n        savedValues.includes(\r\n          tiNormalize(input.value)\r\n        );\r\n    });\r\n  }\r\n\r\n  \/* =====================================================\r\n     BUILD TRAVEL INTELLIGENCE PAGE\r\n  ===================================================== *\/\r\n  function tiBuildPage(){\r\n    const page = tiGet(\"tc2BrainPage\");\r\n\r\n    if(!page){\r\n      return false;\r\n    }\r\n\r\n    page.innerHTML = `\r\n      <div class=\"tc2-shell\">\r\n\r\n        <div class=\"tc2-glass tc2-section\">\r\n\r\n          <h2 class=\"tc2-sectionTitle\">\r\n            Travel Intelligence\r\n          <\/h2>\r\n\r\n          <p class=\"tc2-sectionCopy\">\r\n            Build your personal travel profile once.\r\n            Bliss will use it to organize recommendations,\r\n            prioritize hosts, suggest services, and help the\r\n            avatar recommend the right experience at the\r\n            right time.\r\n          <\/p>\r\n\r\n          <div class=\"tc2-ti-wrap\">\r\n\r\n            <div class=\"tc2-ti-intro\">\r\n              <h3>Your Traveler Profile<\/h3>\r\n\r\n              <p>\r\n                These answers stay saved in this browser.\r\n                They do not go into My Journey because they\r\n                describe how you travel, not an individual\r\n                reservation or itinerary item.\r\n              <\/p>\r\n            <\/div>\r\n\r\n            <div class=\"tc2-ti-grid\">\r\n\r\n              <!-- NAME -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Traveler<\/h3>\r\n                <p>Basic information used by Bliss.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Traveler Name\r\n                <\/label>\r\n\r\n                <input\r\n                  id=\"tiTravelerName\"\r\n                  class=\"tc2-ti-input\"\r\n                  placeholder=\"Optional\">\r\n              <\/div>\r\n\r\n              <!-- LANGUAGE -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Language<\/h3>\r\n                <p>Choose your preferred travel language.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Preferred Language\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiLanguage\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>English<\/option>\r\n                  <option>Spanish<\/option>\r\n                  <option>English & Spanish<\/option>\r\n                  <option>French<\/option>\r\n                  <option>Portuguese<\/option>\r\n                  <option>Other<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- STYLE -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Travel Style<\/h3>\r\n                <p>Choose the overall feeling of your trip.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Main Travel Style\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiTravelStyle\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>Balanced<\/option>\r\n                  <option>Luxury<\/option>\r\n                  <option>Local & Authentic<\/option>\r\n                  <option>Adventure<\/option>\r\n                  <option>Relaxation<\/option>\r\n                  <option>Romantic<\/option>\r\n                  <option>Family<\/option>\r\n                  <option>Business<\/option>\r\n                  <option>Wellness<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- BUDGET -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Budget<\/h3>\r\n                <p>Used to rank relevant experiences and hosts.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Preferred Budget\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiBudget\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option value=\"$\">$ \u00b7 Value<\/option>\r\n                  <option value=\"$$\">$$ \u00b7 Comfortable<\/option>\r\n                  <option value=\"$$$\">$$$ \u00b7 Premium<\/option>\r\n                  <option value=\"$$$$\">$$$$ \u00b7 Luxury<\/option>\r\n                  <option value=\"Flexible\">Flexible<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- TRIP LENGTH -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Trip Length<\/h3>\r\n                <p>Helps Bliss create realistic recommendations.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Typical Stay\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiTripLength\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>1\u20133 Days<\/option>\r\n                  <option>4\u20136 Days<\/option>\r\n                  <option>7 Days<\/option>\r\n                  <option>2 Weeks<\/option>\r\n                  <option>1 Month<\/option>\r\n                  <option>Long-Term<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- COMPANIONS -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Traveling With<\/h3>\r\n                <p>Changes the experiences Bliss recommends.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Travel Group\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiTravelingWith\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>Solo<\/option>\r\n                  <option>Couple<\/option>\r\n                  <option>Friends<\/option>\r\n                  <option>Family<\/option>\r\n                  <option>Kids<\/option>\r\n                  <option>Business Group<\/option>\r\n                  <option>Pet<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- TRANSPORT -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Transportation<\/h3>\r\n                <p>Used for driver and route suggestions.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Preferred Transportation\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiTransportation\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>Private Driver<\/option>\r\n                  <option>Ride Share<\/option>\r\n                  <option>Rental Car<\/option>\r\n                  <option>Walking<\/option>\r\n                  <option>Public Transportation<\/option>\r\n                  <option>Luxury Transportation<\/option>\r\n                  <option>Flexible<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- PACE -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Trip Pace<\/h3>\r\n                <p>Controls how active the recommendations feel.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Preferred Pace\r\n                <\/label>\r\n\r\n                <select\r\n                  id=\"tiPace\"\r\n                  class=\"tc2-ti-select\">\r\n                  <option>Slow & Relaxed<\/option>\r\n                  <option>Balanced<\/option>\r\n                  <option>Active<\/option>\r\n                  <option>Full Schedule<\/option>\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <!-- INTERESTS -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Interests<\/h3>\r\n                <p>Select everything that matters to you.<\/p>\r\n\r\n                <div class=\"tc2-ti-options\">\r\n                  ${[\r\n                    \"Food\",\r\n                    \"Coffee\",\r\n                    \"Nature\",\r\n                    \"Nightlife\",\r\n                    \"Local Culture\",\r\n                    \"History\",\r\n                    \"Luxury\",\r\n                    \"Shopping\",\r\n                    \"Wellness\",\r\n                    \"Medical Tourism\",\r\n                    \"Entertainment\",\r\n                    \"Adventure\",\r\n                    \"Sustainability\",\r\n                    \"Family Activities\",\r\n                    \"Romantic Experiences\"\r\n                  ].map(function(value){\r\n                    return tiChoiceHTML(\r\n                      \"tiInterests\",\r\n                      value\r\n                    );\r\n                  }).join(\"\")}\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <!-- FOOD -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Food Preferences<\/h3>\r\n                <p>Used for meal and restaurant suggestions.<\/p>\r\n\r\n                <div class=\"tc2-ti-options\">\r\n                  ${[\r\n                    \"Local Flavor\",\r\n                    \"Premium Dining\",\r\n                    \"Coffee\",\r\n                    \"Brunch\",\r\n                    \"Vegetarian\",\r\n                    \"Seafood\",\r\n                    \"Steak\",\r\n                    \"Family Dining\",\r\n                    \"Romantic Dining\",\r\n                    \"Street Food\"\r\n                  ].map(function(value){\r\n                    return tiChoiceHTML(\r\n                      \"tiFoodStyle\",\r\n                      value\r\n                    );\r\n                  }).join(\"\")}\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <!-- TIMES -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Preferred Times<\/h3>\r\n                <p>Helps the avatar know when to suggest things.<\/p>\r\n\r\n                <div class=\"tc2-ti-options\">\r\n                  ${[\r\n                    \"Early Morning\",\r\n                    \"Morning\",\r\n                    \"Afternoon\",\r\n                    \"Evening\",\r\n                    \"Late Night\"\r\n                  ].map(function(value){\r\n                    return tiChoiceHTML(\r\n                      \"tiPreferredTimes\",\r\n                      value\r\n                    );\r\n                  }).join(\"\")}\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <!-- ACCESSIBILITY -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Accessibility<\/h3>\r\n                <p>Optional mobility or accessibility preferences.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Accessibility Notes\r\n                <\/label>\r\n\r\n                <input\r\n                  id=\"tiAccessibility\"\r\n                  class=\"tc2-ti-input\"\r\n                  placeholder=\"Optional\">\r\n              <\/div>\r\n\r\n              <!-- NOTES -->\r\n              <div class=\"tc2-ti-card\">\r\n                <h3>Anything Else?<\/h3>\r\n                <p>Optional preferences Bliss should remember.<\/p>\r\n\r\n                <label class=\"tc2-ti-label\">\r\n                  Travel Notes\r\n                <\/label>\r\n\r\n                <input\r\n                  id=\"tiNotes\"\r\n                  class=\"tc2-ti-input\"\r\n                  placeholder=\"Optional\">\r\n              <\/div>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"tc2-ti-actions\">\r\n\r\n              <button\r\n                id=\"tiSaveProfile\"\r\n                class=\"tc2-btn tc2-btn-violet\"\r\n                type=\"button\">\r\n                Save Travel Profile\r\n              <\/button>\r\n\r\n              <button\r\n                id=\"tiResetProfile\"\r\n                class=\"tc2-btn tc2-btn-danger\"\r\n                type=\"button\">\r\n                Reset Profile\r\n              <\/button>\r\n\r\n              <button\r\n                id=\"tiOpenRecommendations\"\r\n                class=\"tc2-btn tc2-btn-cyan\"\r\n                type=\"button\">\r\n                Show My Recommendation\r\n              <\/button>\r\n\r\n            <\/div>\r\n\r\n            <div\r\n              id=\"tiSaveSuccess\"\r\n              class=\"tc2-ti-success\">\r\n              Your Travel Intelligence profile has been saved.\r\n            <\/div>\r\n\r\n            <div\r\n              id=\"tiProfileSummary\"\r\n              class=\"tc2-ti-summary\">\r\n            <\/div>\r\n\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    return true;\r\n  }\r\n\r\n  \/* =====================================================\r\n     FORM \u2192 PROFILE\r\n  ===================================================== *\/\r\n  function tiCollectProfile(){\r\n    const existing = tiReadProfile();\r\n    const now = new Date().toISOString();\r\n\r\n    return {\r\n      completed:true,\r\n\r\n      createdAt:\r\n        existing.createdAt || now,\r\n\r\n      updatedAt:now,\r\n\r\n      destination:\r\n        \"MedaYork \u00b7 Medell\u00edn\",\r\n\r\n      travelerName:\r\n        tiGet(\"tiTravelerName\")\r\n          ? tiGet(\"tiTravelerName\").value.trim()\r\n          : \"\",\r\n\r\n      language:\r\n        tiGet(\"tiLanguage\").value,\r\n\r\n      travelStyle:\r\n        tiGet(\"tiTravelStyle\").value,\r\n\r\n      budget:\r\n        tiGet(\"tiBudget\").value,\r\n\r\n      tripLength:\r\n        tiGet(\"tiTripLength\").value,\r\n\r\n      transportation:\r\n        tiGet(\"tiTransportation\").value,\r\n\r\n      travelingWith:\r\n        tiGet(\"tiTravelingWith\").value,\r\n\r\n      pace:\r\n        tiGet(\"tiPace\").value,\r\n\r\n      interests:\r\n        tiSelectedValues(\"tiInterests\"),\r\n\r\n      foodStyle:\r\n        tiSelectedValues(\"tiFoodStyle\"),\r\n\r\n      preferredTimes:\r\n        tiSelectedValues(\"tiPreferredTimes\"),\r\n\r\n      accessibility:\r\n        tiGet(\"tiAccessibility\")\r\n          ? tiGet(\"tiAccessibility\").value.trim()\r\n          : \"\",\r\n\r\n      notes:\r\n        tiGet(\"tiNotes\")\r\n          ? tiGet(\"tiNotes\").value.trim()\r\n          : \"\"\r\n    };\r\n  }\r\n\r\n  \/* =====================================================\r\n     PROFILE \u2192 FORM\r\n  ===================================================== *\/\r\n  function tiLoadForm(){\r\n    const profile = tiReadProfile();\r\n\r\n    const values = {\r\n      tiTravelerName:profile.travelerName,\r\n      tiLanguage:profile.language,\r\n      tiTravelStyle:profile.travelStyle,\r\n      tiBudget:profile.budget,\r\n      tiTripLength:profile.tripLength,\r\n      tiTransportation:profile.transportation,\r\n      tiTravelingWith:profile.travelingWith,\r\n      tiPace:profile.pace,\r\n      tiAccessibility:profile.accessibility,\r\n      tiNotes:profile.notes\r\n    };\r\n\r\n    Object.keys(values).forEach(function(id){\r\n      const field = tiGet(id);\r\n\r\n      if(field && values[id] != null){\r\n        field.value = values[id];\r\n      }\r\n    });\r\n\r\n    tiSetChecked(\r\n      \"tiInterests\",\r\n      profile.interests\r\n    );\r\n\r\n    tiSetChecked(\r\n      \"tiFoodStyle\",\r\n      profile.foodStyle\r\n    );\r\n\r\n    tiSetChecked(\r\n      \"tiPreferredTimes\",\r\n      profile.preferredTimes\r\n    );\r\n\r\n    tiRenderSummary(profile);\r\n  }\r\n\r\n  \/* =====================================================\r\n     PROFILE SUMMARY\r\n  ===================================================== *\/\r\n  function tiSummaryItem(label,value){\r\n    return `\r\n      <div class=\"tc2-ti-summaryItem\">\r\n        <div class=\"tc2-ti-summaryLabel\">\r\n          ${tiEscape(label)}\r\n        <\/div>\r\n\r\n        <div class=\"tc2-ti-summaryValue\">\r\n          ${tiEscape(value || \"Not selected\")}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function tiRenderSummary(profile){\r\n    const summary = tiGet(\"tiProfileSummary\");\r\n\r\n    if(!summary){\r\n      return;\r\n    }\r\n\r\n    const updated =\r\n      profile.completed && profile.updatedAt\r\n        ? new Date(profile.updatedAt)\r\n            .toLocaleString()\r\n        : \"Not saved yet\";\r\n\r\n    summary.innerHTML = `\r\n      <h3>Traveler Intelligence Summary<\/h3>\r\n\r\n      <div class=\"tc2-ti-status\">\r\n        ${\r\n          profile.completed\r\n            ? \"Profile Active\"\r\n            : \"Profile Not Completed\"\r\n        }\r\n      <\/div>\r\n\r\n      <div class=\"tc2-ti-summaryGrid\">\r\n\r\n        ${tiSummaryItem(\r\n          \"Travel Style\",\r\n          profile.travelStyle\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Budget\",\r\n          profile.budget\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Traveling With\",\r\n          profile.travelingWith\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Transportation\",\r\n          profile.transportation\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Trip Length\",\r\n          profile.tripLength\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Trip Pace\",\r\n          profile.pace\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Interests\",\r\n          tiArray(profile.interests).join(\", \")\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Food Preferences\",\r\n          tiArray(profile.foodStyle).join(\", \")\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Preferred Times\",\r\n          tiArray(profile.preferredTimes).join(\", \")\r\n        )}\r\n\r\n        ${tiSummaryItem(\r\n          \"Last Updated\",\r\n          updated\r\n        )}\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    const brainText =\r\n      document.querySelector(\".tc2-brainText\");\r\n\r\n    if(brainText && profile.completed){\r\n      brainText.textContent =\r\n        \"Travel Intelligence active. Bliss is personalizing recommendations for a \" +\r\n        profile.travelStyle +\r\n        \" traveler with a \" +\r\n        profile.budget +\r\n        \" budget, traveling with \" +\r\n        profile.travelingWith +\r\n        \".\";\r\n    }\r\n  }\r\n\r\n  \/* =====================================================\r\n     SAVE \/ RESET\r\n  ===================================================== *\/\r\n  function tiSaveProfile(){\r\n    const profile = tiCollectProfile();\r\n\r\n    tiWriteProfile(profile);\r\n    tiRenderSummary(profile);\r\n\r\n    const success = tiGet(\"tiSaveSuccess\");\r\n\r\n    if(success){\r\n      success.classList.add(\"show\");\r\n\r\n      clearTimeout(success._hideTimer);\r\n\r\n      success._hideTimer = setTimeout(function(){\r\n        success.classList.remove(\"show\");\r\n      },3500);\r\n    }\r\n\r\n    tiRefreshAvatarRecommendation();\r\n  }\r\n\r\n  function tiResetProfile(){\r\n    const confirmed = confirm(\r\n      \"Reset the saved Travel Intelligence profile?\"\r\n    );\r\n\r\n    if(!confirmed){\r\n      return;\r\n    }\r\n\r\n    localStorage.removeItem(PROFILE_KEY);\r\n    localStorage.removeItem(RECOMMENDATION_KEY);\r\n\r\n    tiLoadForm();\r\n    tiRefreshAvatarRecommendation();\r\n  }\r\n\r\n  \/* =====================================================\r\n     TIME-BASED RECOMMENDATION ENGINE\r\n  ===================================================== *\/\r\n  function tiTimePeriod(hour){\r\n    if(hour >= 5 && hour < 8){\r\n      return \"early-morning\";\r\n    }\r\n\r\n    if(hour >= 8 && hour < 11){\r\n      return \"morning\";\r\n    }\r\n\r\n    if(hour >= 11 && hour < 15){\r\n      return \"lunch\";\r\n    }\r\n\r\n    if(hour >= 15 && hour < 18){\r\n      return \"afternoon\";\r\n    }\r\n\r\n    if(hour >= 18 && hour < 22){\r\n      return \"evening\";\r\n    }\r\n\r\n    return \"late-night\";\r\n  }\r\n\r\n  function tiMakeRecommendation(\r\n    type,\r\n    message,\r\n    targetPage,\r\n    extra\r\n  ){\r\n    return Object.assign(\r\n      {\r\n        type:type,\r\n        message:message,\r\n        targetPage:targetPage,\r\n        createdAt:new Date().toISOString()\r\n      },\r\n      extra || {}\r\n    );\r\n  }\r\n\r\n  function tiBuildRecommendation(profile){\r\n    const hour = new Date().getHours();\r\n    const period = tiTimePeriod(hour);\r\n\r\n    const interests =\r\n      tiArray(profile.interests);\r\n\r\n    const food =\r\n      tiArray(profile.foodStyle);\r\n\r\n    const companions =\r\n      profile.travelingWith || \"\";\r\n\r\n    const transport =\r\n      profile.transportation || \"\";\r\n\r\n    const luxury =\r\n      profile.travelStyle === \"Luxury\" ||\r\n      profile.budget === \"$$$$\" ||\r\n      tiIncludes(interests,\"Luxury\");\r\n\r\n    const family =\r\n      companions === \"Family\" ||\r\n      companions === \"Kids\" ||\r\n      profile.travelStyle === \"Family\" ||\r\n      tiIncludes(interests,\"Family Activities\");\r\n\r\n    const likesNightlife =\r\n      tiIncludes(interests,\"Nightlife\");\r\n\r\n    const likesNature =\r\n      tiIncludes(interests,\"Nature\");\r\n\r\n    const likesCoffee =\r\n      tiIncludes(interests,\"Coffee\") ||\r\n      tiIncludes(food,\"Coffee\");\r\n\r\n    const likesCulture =\r\n      tiIncludes(interests,\"Local Culture\") ||\r\n      tiIncludes(interests,\"History\");\r\n\r\n    const likesShopping =\r\n      tiIncludes(interests,\"Shopping\");\r\n\r\n    const likesFood =\r\n      tiIncludes(interests,\"Food\") ||\r\n      food.length > 0;\r\n\r\n    \/*\r\n      EARLY MORNING\r\n    *\/\r\n    if(period === \"early-morning\"){\r\n      if(likesNature){\r\n        return tiMakeRecommendation(\r\n          \"nature-morning\",\r\n          \"Good morning. Would you like a peaceful nature experience or viewpoint today?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Nature Guide\",\r\n            option:\"Gardens & Nature\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"morning-plan\",\r\n        \"Good morning. Would you like Bliss to help plan your day in Medell\u00edn?\",\r\n        \"tc2JourneyPage\"\r\n      );\r\n    }\r\n\r\n    \/*\r\n      MORNING\r\n    *\/\r\n    if(period === \"morning\"){\r\n      if(likesCoffee){\r\n        return tiMakeRecommendation(\r\n          \"coffee\",\r\n          \"Would you like a coffee or brunch recommendation that matches your profile?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Food Guide\",\r\n            option:\"Coffee Stops\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if(likesCulture){\r\n        return tiMakeRecommendation(\r\n          \"culture-morning\",\r\n          \"Would you like a local culture or history experience this morning?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Local Culture\",\r\n            option:\"History\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"first-stops\",\r\n        \"Would you like a simple first-stop route for Medell\u00edn this morning?\",\r\n        \"tc2ExplorePage\",\r\n        {\r\n          guide:\"First Time Visitor\"\r\n        }\r\n      );\r\n    }\r\n\r\n    \/*\r\n      LUNCH\r\n    *\/\r\n    if(period === \"lunch\"){\r\n      if(luxury){\r\n        return tiMakeRecommendation(\r\n          \"premium-lunch\",\r\n          \"Would you like a premium lunch recommendation nearby?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Food Guide\",\r\n            option:\"Premium Dining\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if(family){\r\n        return tiMakeRecommendation(\r\n          \"family-lunch\",\r\n          \"Would you like a family-friendly lunch recommendation?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Family Guide\",\r\n            option:\"Family Dining\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"local-lunch\",\r\n        \"Would you like a local flavor recommendation for lunch?\",\r\n        \"tc2ExplorePage\",\r\n        {\r\n          guide:\"Food Guide\",\r\n          option:\"Local Flavor\"\r\n        }\r\n      );\r\n    }\r\n\r\n    \/*\r\n      AFTERNOON\r\n    *\/\r\n    if(period === \"afternoon\"){\r\n      if(likesNature){\r\n        return tiMakeRecommendation(\r\n          \"nature-afternoon\",\r\n          \"Would you like a nature experience, garden, or viewpoint this afternoon?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Nature Guide\",\r\n            option:\"Gardens & Nature\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if(likesShopping){\r\n        return tiMakeRecommendation(\r\n          \"shopping\",\r\n          \"Would you like a local or premium shopping recommendation this afternoon?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Local Culture\",\r\n            option:\"Fashion\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if(likesCoffee){\r\n        return tiMakeRecommendation(\r\n          \"coffee-afternoon\",\r\n          \"Would you like an afternoon coffee stop?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Food Guide\",\r\n            option:\"Coffee Stops\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"afternoon-explore\",\r\n        \"Would you like an experience for this afternoon?\",\r\n        \"tc2ExplorePage\"\r\n      );\r\n    }\r\n\r\n    \/*\r\n      EVENING\r\n    *\/\r\n    if(period === \"evening\"){\r\n      if(likesFood || luxury){\r\n        return tiMakeRecommendation(\r\n          luxury\r\n            ? \"premium-dinner\"\r\n            : \"dinner\",\r\n\r\n          luxury\r\n            ? \"Would you like a premium dinner recommendation tonight?\"\r\n            : \"Would you like a dinner recommendation that matches your travel profile?\",\r\n\r\n          \"tc2ExplorePage\",\r\n\r\n          {\r\n            guide:\"Food Guide\",\r\n            option:\r\n              luxury\r\n                ? \"Premium Dining\"\r\n                : \"Local Flavor\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if(family){\r\n        return tiMakeRecommendation(\r\n          \"family-evening\",\r\n          \"Would you like a family-friendly evening activity?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Family Guide\",\r\n            option:\"Family Activities\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"evening-entertainment\",\r\n        \"Would you like an entertainment recommendation for tonight?\",\r\n        \"tc2ExplorePage\",\r\n        {\r\n          guide:\"Entertainment Guide\"\r\n        }\r\n      );\r\n    }\r\n\r\n    \/*\r\n      LATE NIGHT\r\n    *\/\r\n    if(period === \"late-night\"){\r\n      if(likesNightlife && !family){\r\n        return tiMakeRecommendation(\r\n          \"nightlife\",\r\n          transport === \"Private Driver\"\r\n            ? \"Would you like a nightlife recommendation with private-driver support?\"\r\n            : \"Would you like a safe nightlife recommendation for tonight?\",\r\n          \"tc2ExplorePage\",\r\n          {\r\n            guide:\"Nightlife Guide\",\r\n            option:\"Clubs & Bars\",\r\n            service:\r\n              transport === \"Private Driver\"\r\n                ? \"Private Driver\"\r\n                : \"\"\r\n          }\r\n        );\r\n      }\r\n\r\n      return tiMakeRecommendation(\r\n        \"tomorrow-plan\",\r\n        \"Would you like Bliss to prepare a recommendation for tomorrow?\",\r\n        \"tc2JourneyPage\"\r\n      );\r\n    }\r\n\r\n    return tiMakeRecommendation(\r\n      \"general\",\r\n      \"Would you like a personalized recommendation?\",\r\n      \"tc2ExplorePage\"\r\n    );\r\n  }\r\n\r\n  \/* =====================================================\r\n     SAVE CURRENT AVATAR RECOMMENDATION\r\n  ===================================================== *\/\r\n  function tiRefreshAvatarRecommendation(){\r\n    const profile = tiReadProfile();\r\n\r\n    currentAvatarRecommendation =\r\n      tiBuildRecommendation(profile);\r\n\r\n    localStorage.setItem(\r\n      RECOMMENDATION_KEY,\r\n      JSON.stringify(\r\n        currentAvatarRecommendation\r\n      )\r\n    );\r\n\r\n    window.blissCurrentRecommendation =\r\n      currentAvatarRecommendation;\r\n\r\n    return currentAvatarRecommendation;\r\n  }\r\n\r\n  function tiReadRecommendation(){\r\n    const saved =\r\n      tiReadJSON(RECOMMENDATION_KEY,null);\r\n\r\n    if(saved && saved.message){\r\n      currentAvatarRecommendation = saved;\r\n      return saved;\r\n    }\r\n\r\n    return tiRefreshAvatarRecommendation();\r\n  }\r\n\r\n  \/* =====================================================\r\n     AVATAR CONNECTION\r\n\r\n     Overrides the old basic avatar functions after they load.\r\n  ===================================================== *\/\r\n  function tiConnectAvatar(){\r\n    const cloud = tiGet(\"avatarCloud\");\r\n    const message = tiGet(\"avatarCloudMsg\");\r\n\r\n    if(!cloud || !message){\r\n      return false;\r\n    }\r\n\r\n    window.showAvatarCloud = function(forcedType){\r\n      let recommendation;\r\n\r\n      if(forcedType){\r\n        const profile = tiReadProfile();\r\n\r\n        recommendation =\r\n          tiBuildRecommendation(profile);\r\n\r\n        recommendation.type =\r\n          forcedType;\r\n      }else{\r\n        recommendation =\r\n          tiRefreshAvatarRecommendation();\r\n      }\r\n\r\n      currentAvatarRecommendation =\r\n        recommendation;\r\n\r\n      message.textContent =\r\n        recommendation.message;\r\n\r\n      cloud.style.display = \"block\";\r\n    };\r\n\r\n    window.dismissAvatarCloud = function(){\r\n      const avatarCloud =\r\n        tiGet(\"avatarCloud\");\r\n\r\n      if(avatarCloud){\r\n        avatarCloud.style.display = \"none\";\r\n      }\r\n    };\r\n\r\n    window.acceptAvatarSuggestion = function(){\r\n      const recommendation =\r\n        currentAvatarRecommendation ||\r\n        tiReadRecommendation();\r\n\r\n      window.dismissAvatarCloud();\r\n\r\n      if(!recommendation){\r\n        return;\r\n      }\r\n\r\n      localStorage.setItem(\r\n        RECOMMENDATION_KEY,\r\n        JSON.stringify(recommendation)\r\n      );\r\n\r\n      \/*\r\n        The avatar exists outside the hidden page,\r\n        so open Travel Club and pass the recommendation\r\n        through the URL.\r\n      *\/\r\n      const url =\r\n        TRAVEL_CLUB_URL +\r\n        \"&blissRecommendation=\" +\r\n        encodeURIComponent(\r\n          recommendation.type || \"general\"\r\n        );\r\n\r\n      window.location.href = url;\r\n    };\r\n\r\n    return true;\r\n  }\r\n\r\n  \/* =====================================================\r\n     OPEN RECOMMENDATION INSIDE TRAVEL CLUB\r\n  ===================================================== *\/\r\n  function tiOpenRecommendation(recommendation){\r\n    if(!recommendation){\r\n      recommendation =\r\n        tiRefreshAvatarRecommendation();\r\n    }\r\n\r\n    const page =\r\n      recommendation.targetPage ||\r\n      \"tc2ExplorePage\";\r\n\r\n    tiShowPage(page);\r\n\r\n    \/*\r\n      Open Explore guide when the current Explore V6\r\n      public functions are available.\r\n    *\/\r\n    if(\r\n      page === \"tc2ExplorePage\" &&\r\n      window.tc2ExploreV6\r\n    ){\r\n      if(\r\n        recommendation.guide &&\r\n        typeof window.tc2ExploreV6.renderOptions ===\r\n          \"function\"\r\n      ){\r\n        window.tc2ExploreV6.renderOptions(\r\n          recommendation.guide\r\n        );\r\n      }else if(\r\n        typeof window.tc2ExploreV6.renderGuides ===\r\n          \"function\"\r\n      ){\r\n        window.tc2ExploreV6.renderGuides();\r\n      }\r\n    }\r\n\r\n    \/*\r\n      If a Private Driver is recommended, Local Services\r\n      can be opened directly through the public V7 helper.\r\n    *\/\r\n    if(\r\n      recommendation.service &&\r\n      window.tc2JourneyV7 &&\r\n      typeof window.tc2JourneyV7.selectService ===\r\n        \"function\"\r\n    ){\r\n      tiShowPage(\"tc2ServicesPage\");\r\n\r\n      window.tc2JourneyV7.renderServices();\r\n\r\n      window.tc2JourneyV7.selectService(\r\n        recommendation.service\r\n      );\r\n    }\r\n  }\r\n\r\n  function tiOpenSavedURLRecommendation(){\r\n    const params =\r\n      new URLSearchParams(\r\n        window.location.search\r\n      );\r\n\r\n    const type =\r\n      params.get(\"blissRecommendation\");\r\n\r\n    if(!type){\r\n      return;\r\n    }\r\n\r\n    const recommendation =\r\n      tiReadRecommendation();\r\n\r\n    recommendation.type = type;\r\n\r\n    \/*\r\n      Wait until the Travel Club overlay and Explore\r\n      connection finish loading.\r\n    *\/\r\n    setTimeout(function(){\r\n      tiOpenRecommendation(\r\n        recommendation\r\n      );\r\n    },900);\r\n  }\r\n\r\n  \/* =====================================================\r\n     BUTTON CONNECTIONS\r\n  ===================================================== *\/\r\n  function tiConnectButtons(){\r\n    const mainBrain =\r\n      tiGet(\"tc2MainBrain\");\r\n\r\n    if(mainBrain){\r\n      mainBrain.addEventListener(\r\n        \"click\",\r\n        function(event){\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          event.stopImmediatePropagation();\r\n\r\n          tiShowPage(\"tc2BrainPage\");\r\n          tiLoadForm();\r\n        },\r\n        true\r\n      );\r\n    }\r\n\r\n    document.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n\r\n        const save =\r\n          event.target.closest(\r\n            \"#tiSaveProfile\"\r\n          );\r\n\r\n        if(save){\r\n          event.preventDefault();\r\n          tiSaveProfile();\r\n          return;\r\n        }\r\n\r\n        const reset =\r\n          event.target.closest(\r\n            \"#tiResetProfile\"\r\n          );\r\n\r\n        if(reset){\r\n          event.preventDefault();\r\n          tiResetProfile();\r\n          return;\r\n        }\r\n\r\n       const recommend =\r\n  event.target.closest(\r\n    \"#tiOpenRecommendations\"\r\n  );\r\n\r\nif(recommend){\r\n  event.preventDefault();\r\n  event.stopPropagation();\r\n\r\n  const profile =\r\n    tiCollectProfile();\r\n\r\n  tiWriteProfile(profile);\r\n  tiRenderSummary(profile);\r\n\r\n  if(\r\n    window.BlissTravelRecommendations &&\r\n    typeof window.BlissTravelRecommendations.open ===\r\n      \"function\"\r\n  ){\r\n    window.BlissTravelRecommendations.open();\r\n  }else{\r\n    console.error(\r\n      \"Travel Intelligence popup code is not loaded.\"\r\n    );\r\n  }\r\n\r\n  return;\r\n}\r\n        const journeyBrain =\r\n          event.target.closest(\r\n            \"#tc2JourneyGoBrain\"\r\n          );\r\n\r\n        if(journeyBrain){\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n\r\n          tiShowPage(\"tc2BrainPage\");\r\n          tiLoadForm();\r\n        }\r\n\r\n      },\r\n      true\r\n    );\r\n  }\r\n\r\n  \/* =====================================================\r\n     PUBLIC TRAVEL INTELLIGENCE API\r\n  ===================================================== *\/\r\n  window.BlissTravelIntelligence = {\r\n    readProfile:tiReadProfile,\r\n\r\n    saveProfile:function(profile){\r\n      const finalProfile =\r\n        Object.assign(\r\n          {},\r\n          DEFAULT_PROFILE,\r\n          profile || {},\r\n          {\r\n            completed:true,\r\n            updatedAt:\r\n              new Date().toISOString()\r\n          }\r\n        );\r\n\r\n      if(!finalProfile.createdAt){\r\n        finalProfile.createdAt =\r\n          finalProfile.updatedAt;\r\n      }\r\n\r\n      tiWriteProfile(finalProfile);\r\n      tiRenderSummary(finalProfile);\r\n      tiRefreshAvatarRecommendation();\r\n\r\n      return finalProfile;\r\n    },\r\n\r\n    reset:function(){\r\n      localStorage.removeItem(PROFILE_KEY);\r\n      localStorage.removeItem(\r\n        RECOMMENDATION_KEY\r\n      );\r\n    },\r\n\r\n    getRecommendation:\r\n      tiRefreshAvatarRecommendation,\r\n\r\n    openRecommendation:\r\n      tiOpenRecommendation\r\n  };\r\n\r\n  \/* =====================================================\r\n     INITIALIZE\r\n  ===================================================== *\/\r\n  function tiInitialize(){\r\n    if(!tiBuildPage()){\r\n      setTimeout(tiInitialize,300);\r\n      return;\r\n    }\r\n\r\n    tiLoadForm();\r\n    tiConnectButtons();\r\n    tiRefreshAvatarRecommendation();\r\n\r\n    \/*\r\n      Avatar is located outside the hidden Travel Club code.\r\n      Retry briefly in case it appears later in the document.\r\n    *\/\r\n    let avatarAttempts = 0;\r\n\r\n    const avatarTimer = setInterval(function(){\r\n      avatarAttempts += 1;\r\n\r\n      if(\r\n        tiConnectAvatar() ||\r\n        avatarAttempts > 20\r\n      ){\r\n        clearInterval(avatarTimer);\r\n      }\r\n    },250);\r\n\r\n    tiOpenSavedURLRecommendation();\r\n\r\n    console.log(\r\n      \"[Bliss Travel Intelligence] Profile and avatar connected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      tiInitialize\r\n    );\r\n  }else{\r\n    tiInitialize();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL INTELLIGENCE\r\nACCOUNT + VAULT BRIDGE V1\r\n\r\nPASTE AT THE VERY BOTTOM OF THE TRAVEL CLUB CODE.\r\n\r\nREQUIRES PHP ACTIONS:\r\n- ggg_get_my_travel_intelligence\r\n- ggg_save_my_travel_intelligence\r\n\r\nBEHAVIOR:\r\n\r\nGUEST:\r\n- Questionnaire saves temporarily in the browser.\r\n\r\nSIGNED-IN MEMBER:\r\n- Loads profile from WordPress account.\r\n- Saves questionnaire answers to WordPress account.\r\n- Keeps local browser copy for fast recommendations.\r\n- Migrates a completed guest profile after sign-in.\r\n- Makes the account profile available to the avatar.\r\n\r\nACCOUNT META:\r\nggg_travel_intelligence_profile\r\n\r\nLOCAL STORAGE:\r\nBLISS_TRAVEL_INTELLIGENCE_V1\r\n========================================================= -->\r\n\r\n<style>\r\n\/* Account synchronization status *\/\r\n#tiAccountSyncStatus{\r\n  margin-top:12px;\r\n  padding:12px 14px;\r\n  display:none;\r\n  border-radius:16px;\r\n  border:1px solid rgba(83,243,255,.20);\r\n  background:rgba(83,243,255,.07);\r\n  color:#dffcff;\r\n  font-size:.78rem;\r\n  line-height:1.55;\r\n}\r\n\r\n#tiAccountSyncStatus.show{\r\n  display:block;\r\n}\r\n\r\n#tiAccountSyncStatus.success{\r\n  border-color:rgba(112,247,162,.28);\r\n  background:rgba(112,247,162,.09);\r\n  color:#d4ffe1;\r\n}\r\n\r\n#tiAccountSyncStatus.error{\r\n  border-color:rgba(255,107,138,.30);\r\n  background:rgba(255,107,138,.09);\r\n  color:#ffd8e0;\r\n}\r\n\r\n#tiAccountSyncStatus.guest{\r\n  border-color:rgba(244,210,122,.28);\r\n  background:rgba(244,210,122,.08);\r\n  color:#fff0bd;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* =====================================================\r\n     SETTINGS\r\n  ===================================================== *\/\r\n\r\n  const TI_BRIDGE_LOCAL_KEY =\r\n    \"BLISS_TRAVEL_INTELLIGENCE_V1\";\r\n\r\n  const TI_BRIDGE_DEFAULT_AJAX =\r\n    \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\n  const TI_BRIDGE_LOAD_ACTION =\r\n    \"ggg_get_my_travel_intelligence\";\r\n\r\n  const TI_BRIDGE_SAVE_ACTION =\r\n    \"ggg_save_my_travel_intelligence\";\r\n\r\n  const TI_BRIDGE_LOGIN_URL =\r\n    (\r\n      window.gggPmsData &&\r\n      window.gggPmsData.urls &&\r\n      window.gggPmsData.urls.login\r\n    )\r\n      ? window.gggPmsData.urls.login\r\n      : \"\/GGG\/login\/\";\r\n\r\n  let tiBridgeLoggedIn = false;\r\n  let tiBridgeLoadingAccount = false;\r\n  let tiBridgeSavingAccount = false;\r\n  let tiBridgeInitialized = false;\r\n  let tiBridgeLastSavedJSON = \"\";\r\n  let tiBridgeSaveTimer = null;\r\n\r\n\r\n  \/* =====================================================\r\n     HELPERS\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeElement(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function tiBridgeConfig(){\r\n    const config =\r\n      window.gggTravelIntelligenceConfig || {};\r\n\r\n    return {\r\n      ajaxUrl:\r\n        config.ajaxUrl ||\r\n        TI_BRIDGE_DEFAULT_AJAX,\r\n\r\n      loggedIn:\r\n        typeof config.loggedIn === \"boolean\"\r\n          ? config.loggedIn\r\n          : Boolean(\r\n              window.gggPmsData &&\r\n              window.gggPmsData.loggedIn\r\n            ),\r\n\r\n      userId:\r\n        config.userId ||\r\n        (\r\n          window.gggPmsData &&\r\n          window.gggPmsData.userId\r\n        ) ||\r\n        0,\r\n\r\n      loadAction:\r\n        config.actions &&\r\n        config.actions.loadProfile\r\n          ? config.actions.loadProfile\r\n          : TI_BRIDGE_LOAD_ACTION,\r\n\r\n      saveAction:\r\n        config.actions &&\r\n        config.actions.saveProfile\r\n          ? config.actions.saveProfile\r\n          : TI_BRIDGE_SAVE_ACTION\r\n    };\r\n  }\r\n\r\n  function tiBridgeReadLocal(){\r\n    try{\r\n      const saved = JSON.parse(\r\n        localStorage.getItem(\r\n          TI_BRIDGE_LOCAL_KEY\r\n        ) || \"{}\"\r\n      );\r\n\r\n      return saved &&\r\n        typeof saved === \"object\"\r\n          ? saved\r\n          : {};\r\n    }catch(error){\r\n      return {};\r\n    }\r\n  }\r\n\r\n  function tiBridgeWriteLocal(profile){\r\n    if(\r\n      !profile ||\r\n      typeof profile !== \"object\"\r\n    ){\r\n      return;\r\n    }\r\n\r\n    try{\r\n      localStorage.setItem(\r\n        TI_BRIDGE_LOCAL_KEY,\r\n        JSON.stringify(profile)\r\n      );\r\n    }catch(error){\r\n      console.warn(\r\n        \"[Travel Intelligence Bridge] Local profile could not be saved.\",\r\n        error\r\n      );\r\n    }\r\n\r\n    window.blissTravelProfile =\r\n      profile;\r\n\r\n    try{\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissTravelAccountProfileLoaded\",\r\n          {\r\n            detail:profile\r\n          }\r\n        )\r\n      );\r\n    }catch(error){}\r\n  }\r\n\r\n  function tiBridgeIsCompleted(profile){\r\n    return Boolean(\r\n      profile &&\r\n      typeof profile === \"object\" &&\r\n      profile.completed\r\n    );\r\n  }\r\n\r\n  function tiBridgeProfileHasContent(\r\n    profile\r\n  ){\r\n    if(\r\n      !profile ||\r\n      typeof profile !== \"object\"\r\n    ){\r\n      return false;\r\n    }\r\n\r\n    return Boolean(\r\n      profile.completed ||\r\n      profile.astroSign ||\r\n      profile.travelStyle ||\r\n      profile.travelingWith ||\r\n      profile.transportation ||\r\n      (\r\n        Array.isArray(profile.interests) &&\r\n        profile.interests.length\r\n      ) ||\r\n      (\r\n        Array.isArray(\r\n          profile.foodPreferences\r\n        ) &&\r\n        profile.foodPreferences.length\r\n      )\r\n    );\r\n  }\r\n\r\n  function tiBridgeMergeProfile(\r\n    localProfile,\r\n    accountProfile\r\n  ){\r\n    const local =\r\n      localProfile &&\r\n      typeof localProfile === \"object\"\r\n        ? localProfile\r\n        : {};\r\n\r\n    const account =\r\n      accountProfile &&\r\n      typeof accountProfile === \"object\"\r\n        ? accountProfile\r\n        : {};\r\n\r\n    const localAstro =\r\n      local.astroPreferences &&\r\n      typeof local.astroPreferences ===\r\n        \"object\"\r\n        ? local.astroPreferences\r\n        : {};\r\n\r\n    const accountAstro =\r\n      account.astroPreferences &&\r\n      typeof account.astroPreferences ===\r\n        \"object\"\r\n        ? account.astroPreferences\r\n        : {};\r\n\r\n    \/*\r\n      Account values are authoritative when present.\r\n      Local-only fields are preserved for compatibility\r\n      with the current questionnaire.\r\n    *\/\r\n    return Object.assign(\r\n      {},\r\n      local,\r\n      account,\r\n      {\r\n        interests:\r\n          Array.isArray(account.interests)\r\n            ? account.interests\r\n            : (\r\n                Array.isArray(local.interests)\r\n                  ? local.interests\r\n                  : []\r\n              ),\r\n\r\n        foodPreferences:\r\n          Array.isArray(\r\n            account.foodPreferences\r\n          )\r\n            ? account.foodPreferences\r\n            : (\r\n                Array.isArray(\r\n                  local.foodPreferences\r\n                )\r\n                  ? local.foodPreferences\r\n                  : []\r\n              ),\r\n\r\n        preferredTimes:\r\n          Array.isArray(\r\n            account.preferredTimes\r\n          )\r\n            ? account.preferredTimes\r\n            : (\r\n                Array.isArray(\r\n                  local.preferredTimes\r\n                )\r\n                  ? local.preferredTimes\r\n                  : []\r\n              ),\r\n\r\n        astroPreferences:{\r\n          preferredStyles:\r\n            Array.isArray(\r\n              accountAstro.preferredStyles\r\n            )\r\n              ? accountAstro.preferredStyles\r\n              : (\r\n                  Array.isArray(\r\n                    localAstro.preferredStyles\r\n                  )\r\n                    ? localAstro.preferredStyles\r\n                    : []\r\n                ),\r\n\r\n          preferredCategories:\r\n            Array.isArray(\r\n              accountAstro\r\n                .preferredCategories\r\n            )\r\n              ? accountAstro\r\n                  .preferredCategories\r\n              : (\r\n                  Array.isArray(\r\n                    localAstro\r\n                      .preferredCategories\r\n                  )\r\n                    ? localAstro\r\n                        .preferredCategories\r\n                    : []\r\n                )\r\n        }\r\n      }\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     STATUS DISPLAY\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeInstallStatus(){\r\n    if(\r\n      tiBridgeElement(\r\n        \"tiAccountSyncStatus\"\r\n      )\r\n    ){\r\n      return;\r\n    }\r\n\r\n    const actions =\r\n      document.querySelector(\r\n        \"#tc2BrainPage \" +\r\n        \".tc2-intelligenceActions\"\r\n      );\r\n\r\n    if(!actions){\r\n      return;\r\n    }\r\n\r\n    const status =\r\n      document.createElement(\"div\");\r\n\r\n    status.id =\r\n      \"tiAccountSyncStatus\";\r\n\r\n    actions.insertAdjacentElement(\r\n      \"afterend\",\r\n      status\r\n    );\r\n  }\r\n\r\n  function tiBridgeShowStatus(\r\n    message,\r\n    type,\r\n    autoHide\r\n  ){\r\n    tiBridgeInstallStatus();\r\n\r\n    const status =\r\n      tiBridgeElement(\r\n        \"tiAccountSyncStatus\"\r\n      );\r\n\r\n    if(!status){\r\n      return;\r\n    }\r\n\r\n    status.textContent =\r\n      message || \"\";\r\n\r\n    status.className =\r\n      \"show \" + (type || \"\");\r\n\r\n    clearTimeout(\r\n      status._hideTimer\r\n    );\r\n\r\n    if(autoHide){\r\n      status._hideTimer =\r\n        setTimeout(function(){\r\n          status.className = \"\";\r\n        },4500);\r\n    }\r\n  }\r\n\r\n  function tiBridgeUpdateBrainText(\r\n    profile\r\n  ){\r\n    const brainText =\r\n      document.querySelector(\r\n        \".tc2-brainText\"\r\n      );\r\n\r\n    if(!brainText){\r\n      return;\r\n    }\r\n\r\n    if(\r\n      profile &&\r\n      profile.completed\r\n    ){\r\n      const style =\r\n        profile.travelStyle ||\r\n        \"personalized\";\r\n\r\n      const companion =\r\n        profile.travelingWith ||\r\n        \"traveler\";\r\n\r\n      brainText.textContent =\r\n        \"Travel Intelligence is connected to your account. Bliss can use your \" +\r\n        style +\r\n        \" preferences and \" +\r\n        companion +\r\n        \" travel profile for recommendations.\";\r\n    }\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     REFRESH CURRENT QUESTIONNAIRE FORM\r\n\r\n     The questionnaire already knows how to load from\r\n     BLISS_TRAVEL_INTELLIGENCE_V1. Reopening it refreshes\r\n     the form from the synchronized account profile.\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeRefreshQuestionnaire(\r\n    profile\r\n  ){\r\n    window.blissTravelProfile =\r\n      profile;\r\n\r\n    \/*\r\n      Use the current questionnaire public API when\r\n      available.\r\n    *\/\r\n    if(\r\n      window.BlissTravelIntelligence &&\r\n      typeof window.BlissTravelIntelligence\r\n        .saveProfile === \"function\"\r\n    ){\r\n      tiBridgeLoadingAccount = true;\r\n\r\n      try{\r\n        window.BlissTravelIntelligence\r\n          .saveProfile(profile);\r\n      }catch(error){\r\n        tiBridgeWriteLocal(profile);\r\n      }\r\n\r\n      setTimeout(function(){\r\n        tiBridgeLoadingAccount = false;\r\n      },100);\r\n\r\n      return;\r\n    }\r\n\r\n    tiBridgeWriteLocal(profile);\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOAD PROFILE FROM SIGNED-IN ACCOUNT\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeLoadAccountProfile(){\r\n    const config =\r\n      tiBridgeConfig();\r\n\r\n    tiBridgeLoggedIn =\r\n      Boolean(config.loggedIn);\r\n\r\n    if(!tiBridgeLoggedIn){\r\n      const guestProfile =\r\n        tiBridgeReadLocal();\r\n\r\n      window.blissTravelProfile =\r\n        guestProfile;\r\n\r\n      tiBridgeShowStatus(\r\n        tiBridgeIsCompleted(\r\n          guestProfile\r\n        )\r\n          ? \"Guest profile saved temporarily on this device. Sign in later to transfer it to your account.\"\r\n          : \"You are using Travel Intelligence as a guest. Your answers will remain on this device until you sign in.\",\r\n        \"guest\",\r\n        false\r\n      );\r\n\r\n      return Promise.resolve(\r\n        guestProfile\r\n      );\r\n    }\r\n\r\n    tiBridgeLoadingAccount = true;\r\n\r\n    tiBridgeShowStatus(\r\n      \"Loading your Travel Intelligence profile from your account\u2026\",\r\n      \"\",\r\n      false\r\n    );\r\n\r\n    const formData =\r\n      new FormData();\r\n\r\n    formData.append(\r\n      \"action\",\r\n      config.loadAction\r\n    );\r\n\r\n    return fetch(\r\n      config.ajaxUrl,\r\n      {\r\n        method:\"POST\",\r\n        credentials:\"same-origin\",\r\n        body:formData\r\n      }\r\n    )\r\n    .then(function(response){\r\n      return response.json();\r\n    })\r\n    .then(function(data){\r\n      if(\r\n        !data ||\r\n        !data.success ||\r\n        !data.data\r\n      ){\r\n        const message =\r\n          data &&\r\n          data.data &&\r\n          data.data.message\r\n            ? data.data.message\r\n            : \"Your account profile could not be loaded.\";\r\n\r\n        throw new Error(message);\r\n      }\r\n\r\n      const accountProfile =\r\n        data.data.profile || {};\r\n\r\n      const guestProfile =\r\n        tiBridgeReadLocal();\r\n\r\n      \/*\r\n        MIGRATION:\r\n        If the account profile is empty but the browser\r\n        contains a completed guest questionnaire, transfer\r\n        the guest profile into the account.\r\n      *\/\r\n      if(\r\n        !tiBridgeProfileHasContent(\r\n          accountProfile\r\n        ) &&\r\n        tiBridgeProfileHasContent(\r\n          guestProfile\r\n        )\r\n      ){\r\n        tiBridgeLoadingAccount = false;\r\n\r\n        return tiBridgeSaveAccountProfile(\r\n          guestProfile,\r\n          {\r\n            migration:true\r\n          }\r\n        ).then(function(savedProfile){\r\n          tiBridgeShowStatus(\r\n            \"Your guest Travel Intelligence profile was transferred to your signed-in account.\",\r\n            \"success\",\r\n            true\r\n          );\r\n\r\n          return savedProfile;\r\n        });\r\n      }\r\n\r\n      const mergedProfile =\r\n        tiBridgeMergeProfile(\r\n          guestProfile,\r\n          accountProfile\r\n        );\r\n\r\n      tiBridgeWriteLocal(\r\n        mergedProfile\r\n      );\r\n\r\n      tiBridgeRefreshQuestionnaire(\r\n        mergedProfile\r\n      );\r\n\r\n      tiBridgeUpdateBrainText(\r\n        mergedProfile\r\n      );\r\n\r\n      tiBridgeLastSavedJSON =\r\n        JSON.stringify(\r\n          mergedProfile\r\n        );\r\n\r\n      tiBridgeShowStatus(\r\n        tiBridgeIsCompleted(\r\n          mergedProfile\r\n        )\r\n          ? \"Your Travel Intelligence profile was loaded from your account.\"\r\n          : \"Your account is connected. Complete the questionnaire and press Save Travel Profile.\",\r\n        \"success\",\r\n        true\r\n      );\r\n\r\n      return mergedProfile;\r\n    })\r\n    .catch(function(error){\r\n      const localProfile =\r\n        tiBridgeReadLocal();\r\n\r\n      window.blissTravelProfile =\r\n        localProfile;\r\n\r\n      tiBridgeShowStatus(\r\n        error.message ||\r\n        \"The account profile could not be loaded. Your browser copy is still available.\",\r\n        \"error\",\r\n        false\r\n      );\r\n\r\n      return localProfile;\r\n    })\r\n    .finally(function(){\r\n      tiBridgeLoadingAccount = false;\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SAVE PROFILE TO SIGNED-IN ACCOUNT\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeSaveAccountProfile(\r\n    profile,\r\n    options\r\n  ){\r\n    const config =\r\n      tiBridgeConfig();\r\n\r\n    const settings =\r\n      options || {};\r\n\r\n    tiBridgeLoggedIn =\r\n      Boolean(config.loggedIn);\r\n\r\n    \/*\r\n      Guests remain local only.\r\n    *\/\r\n    if(!tiBridgeLoggedIn){\r\n      tiBridgeWriteLocal(profile);\r\n\r\n      tiBridgeShowStatus(\r\n        \"Your Travel Intelligence profile is saved temporarily on this device. Sign in to save it permanently to your account.\",\r\n        \"guest\",\r\n        true\r\n      );\r\n\r\n      return Promise.resolve(\r\n        profile\r\n      );\r\n    }\r\n\r\n    if(\r\n      !profile ||\r\n      typeof profile !== \"object\"\r\n    ){\r\n      return Promise.reject(\r\n        new Error(\r\n          \"No Travel Intelligence profile was found to save.\"\r\n        )\r\n      );\r\n    }\r\n\r\n    const profileJSON =\r\n      JSON.stringify(profile);\r\n\r\n    \/*\r\n      Avoid duplicate saves caused by multiple current\r\n      Travel Intelligence listeners.\r\n    *\/\r\n    if(\r\n      !settings.migration &&\r\n      profileJSON === tiBridgeLastSavedJSON\r\n    ){\r\n      return Promise.resolve(\r\n        profile\r\n      );\r\n    }\r\n\r\n    if(tiBridgeSavingAccount){\r\n      return Promise.resolve(\r\n        profile\r\n      );\r\n    }\r\n\r\n    tiBridgeSavingAccount = true;\r\n\r\n    tiBridgeShowStatus(\r\n      settings.migration\r\n        ? \"Transferring your guest profile to your account\u2026\"\r\n        : \"Saving your Travel Intelligence profile to your account\u2026\",\r\n      \"\",\r\n      false\r\n    );\r\n\r\n    const formData =\r\n      new FormData();\r\n\r\n    formData.append(\r\n      \"action\",\r\n      config.saveAction\r\n    );\r\n\r\n    formData.append(\r\n      \"profile\",\r\n      profileJSON\r\n    );\r\n\r\n    return fetch(\r\n      config.ajaxUrl,\r\n      {\r\n        method:\"POST\",\r\n        credentials:\"same-origin\",\r\n        body:formData\r\n      }\r\n    )\r\n    .then(function(response){\r\n      return response.json();\r\n    })\r\n    .then(function(data){\r\n      if(\r\n        !data ||\r\n        !data.success ||\r\n        !data.data\r\n      ){\r\n        const message =\r\n          data &&\r\n          data.data &&\r\n          data.data.message\r\n            ? data.data.message\r\n            : \"The account profile could not be saved.\";\r\n\r\n        throw new Error(message);\r\n      }\r\n\r\n      const savedProfile =\r\n        data.data.profile || profile;\r\n\r\n      tiBridgeLastSavedJSON =\r\n        JSON.stringify(\r\n          savedProfile\r\n        );\r\n\r\n      tiBridgeWriteLocal(\r\n        savedProfile\r\n      );\r\n\r\n      tiBridgeUpdateBrainText(\r\n        savedProfile\r\n      );\r\n\r\n      \/*\r\n        Tell the avatar and other connected systems that\r\n        a permanent account profile is now available.\r\n      *\/\r\n      try{\r\n        window.dispatchEvent(\r\n          new CustomEvent(\r\n            \"blissTravelAccountProfileSaved\",\r\n            {\r\n              detail:savedProfile\r\n            }\r\n          )\r\n        );\r\n      }catch(error){}\r\n\r\n      tiBridgeShowStatus(\r\n        settings.migration\r\n          ? \"Your guest profile is now saved permanently to your account.\"\r\n          : \"Your Travel Intelligence profile was saved permanently to your account and is ready for recommendations.\",\r\n        \"success\",\r\n        true\r\n      );\r\n\r\n      return savedProfile;\r\n    })\r\n    .catch(function(error){\r\n      tiBridgeWriteLocal(profile);\r\n\r\n      tiBridgeShowStatus(\r\n        (\r\n          error.message ||\r\n          \"The account profile could not be saved.\"\r\n        ) +\r\n        \" Your browser copy was preserved.\",\r\n        \"error\",\r\n        false\r\n      );\r\n\r\n      throw error;\r\n    })\r\n    .finally(function(){\r\n      tiBridgeSavingAccount = false;\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LISTEN TO THE EXISTING QUESTIONNAIRE SAVE\r\n\r\n     The current questionnaire dispatches:\r\n     blissTravelProfileUpdated\r\n\r\n     This means we do not need to replace its Save button.\r\n  ===================================================== *\/\r\n\r\n  window.addEventListener(\r\n    \"blissTravelProfileUpdated\",\r\n    function(event){\r\n      if(\r\n        tiBridgeLoadingAccount ||\r\n        tiBridgeSavingAccount\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const profile =\r\n        event &&\r\n        event.detail &&\r\n        typeof event.detail === \"object\"\r\n          ? event.detail\r\n          : tiBridgeReadLocal();\r\n\r\n      clearTimeout(\r\n        tiBridgeSaveTimer\r\n      );\r\n\r\n      \/*\r\n        Small delay lets the current questionnaire finish\r\n        updating its summary and browser storage first.\r\n      *\/\r\n      tiBridgeSaveTimer =\r\n        setTimeout(function(){\r\n          tiBridgeSaveAccountProfile(\r\n            profile\r\n          ).catch(function(){});\r\n        },250);\r\n    }\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     FALLBACK SAVE-BUTTON LISTENER\r\n\r\n     This catches the Save button even if an older\r\n     questionnaire version does not dispatch the event.\r\n  ===================================================== *\/\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      const saveButton =\r\n        event.target.closest(\r\n          \"#tiSaveProfile\"\r\n        );\r\n\r\n      if(!saveButton){\r\n        return;\r\n      }\r\n\r\n      setTimeout(function(){\r\n        const profile =\r\n          (\r\n            window.BlissTravelIntelligence &&\r\n            typeof window.BlissTravelIntelligence\r\n              .readProfile === \"function\"\r\n          )\r\n            ? window.BlissTravelIntelligence\r\n                .readProfile()\r\n            : tiBridgeReadLocal();\r\n\r\n        tiBridgeSaveAccountProfile(\r\n          profile\r\n        ).catch(function(){});\r\n      },500);\r\n    },\r\n    false\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     MAKE PROFILE AVAILABLE TO THE AVATAR\r\n\r\n     The current avatar recommendation system can read:\r\n\r\n     window.blissTravelProfile\r\n\r\n     or:\r\n\r\n     window.BlissTravelAccountBridge.getProfile()\r\n  ===================================================== *\/\r\n\r\n  window.BlissTravelAccountBridge = {\r\n    isLoggedIn:function(){\r\n      return Boolean(\r\n        tiBridgeConfig().loggedIn\r\n      );\r\n    },\r\n\r\n    getProfile:function(){\r\n      return (\r\n        window.blissTravelProfile ||\r\n        tiBridgeReadLocal()\r\n      );\r\n    },\r\n\r\n    load:\r\n      tiBridgeLoadAccountProfile,\r\n\r\n    save:function(profile){\r\n      return tiBridgeSaveAccountProfile(\r\n        profile\r\n      );\r\n    },\r\n\r\n    loginUrl:\r\n      TI_BRIDGE_LOGIN_URL\r\n  };\r\n\r\n\r\n  \/* =====================================================\r\n     INITIALIZE\r\n  ===================================================== *\/\r\n\r\n  function tiBridgeInitialize(){\r\n    if(tiBridgeInitialized){\r\n      return;\r\n    }\r\n\r\n    const overlay =\r\n      tiBridgeElement(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      setTimeout(\r\n        tiBridgeInitialize,\r\n        300\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    tiBridgeInitialized = true;\r\n\r\n    \/*\r\n      Wait briefly for the current Travel Intelligence\r\n      questionnaire to finish creating its page.\r\n    *\/\r\n    setTimeout(function(){\r\n      tiBridgeInstallStatus();\r\n      tiBridgeLoadAccountProfile();\r\n    },700);\r\n\r\n    console.log(\r\n      \"[Bliss Travel Intelligence] Account and Owner Vault bridge connected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      tiBridgeInitialize\r\n    );\r\n  }else{\r\n    tiBridgeInitialize();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 VAULT MEMBERSHIP GATE V1\r\n\r\nPASTE UNDERNEATH THE ENTIRE TRAVEL CLUB CODE.\r\n\r\nREADS:\r\nggg_get_current_user_vault_levels\r\n\r\nACCESS:\r\n\r\nGUEST \/ LEVEL 1\r\n- Astro Travel Recommendations\r\n\r\nLEVEL 2\r\n- Explore Medell\u00edn\r\n- Travel Intelligence\r\n- My Journey\r\n- Local Services\r\n- My Travel Story\r\n- Reserve With Bliss\r\n\r\nLEVEL 3\r\n- Nature Guide\r\n- Medical Tourism\r\n- Entertainment Guide\r\n- Local Culture\r\n\r\nLEVEL 4\r\n- Personal Evolution\r\n\r\nTHIS PATCH:\r\n- Reads levels from the Account Vault.\r\n- Lights up the correct cards.\r\n- Dims and locks unavailable cards.\r\n- Protects floating navigation.\r\n- Protects Journey links to Explore\/Services\/Intelligence.\r\n- Protects Level 3 Explore guides.\r\n- Updates Level \/ Status text.\r\n- Shows Sign In or membership messages.\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   VAULT MEMBERSHIP STATES\r\n========================================================= *\/\r\n\r\n#tc2Overlay .tc2-vault-unlocked{\r\n  opacity:1 !important;\r\n  filter:none !important;\r\n  cursor:pointer !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-unlocked::after{\r\n  box-shadow:\r\n    inset 0 0 0 2px rgba(83,243,255,.50),\r\n    0 0 30px rgba(83,243,255,.20) !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-locked{\r\n  position:relative;\r\n  opacity:.52 !important;\r\n  filter:grayscale(.28) brightness(.58) saturate(.62) !important;\r\n  cursor:not-allowed !important;\r\n  transform:none !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-locked:hover{\r\n  transform:none !important;\r\n  box-shadow:none !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-locked::after{\r\n  box-shadow:\r\n    inset 0 0 0 2px rgba(255,255,255,.08),\r\n    0 0 18px rgba(0,0,0,.24) !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-lockBadge{\r\n  position:absolute;\r\n  top:14px;\r\n  right:14px;\r\n  z-index:8;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  min-height:32px;\r\n  padding:0 11px;\r\n  border-radius:999px;\r\n  border:1px solid rgba(255,255,255,.17);\r\n  background:rgba(2,5,13,.88);\r\n  color:#fff;\r\n  font-size:.63rem;\r\n  font-weight:900;\r\n  letter-spacing:.10em;\r\n  text-transform:uppercase;\r\n  box-shadow:0 0 18px rgba(0,0,0,.34);\r\n  pointer-events:none;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-statusFree{\r\n  color:#caffd9 !important;\r\n  border-color:rgba(112,247,162,.34) !important;\r\n  background:rgba(112,247,162,.10) !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-statusOn{\r\n  color:#bdfaff !important;\r\n  border-color:rgba(83,243,255,.34) !important;\r\n  background:rgba(83,243,255,.10) !important;\r\n}\r\n\r\n#tc2Overlay .tc2-vault-statusOff{\r\n  color:rgba(255,255,255,.68) !important;\r\n  border-color:rgba(255,255,255,.13) !important;\r\n  background:rgba(0,0,0,.38) !important;\r\n}\r\n\r\n\/* Floating navigation *\/\r\n#tc2Overlay .tc2-float.tc2-vault-locked{\r\n  opacity:.38 !important;\r\n  filter:grayscale(1) brightness(.65) !important;\r\n  cursor:not-allowed !important;\r\n}\r\n\r\n\/* Level 3 guide lock *\/\r\n#tc2Overlay .tc2-guideCard.tc2-level3-locked,\r\n#tc2Overlay [data-guide].tc2-level3-locked,\r\n#tc2Overlay [data-category].tc2-level3-locked{\r\n  opacity:.52 !important;\r\n  filter:grayscale(.35) brightness(.62) !important;\r\n  cursor:not-allowed !important;\r\n}\r\n\r\n#tc2Overlay .tc2-level3-lockBadge{\r\n  position:absolute;\r\n  top:12px;\r\n  right:12px;\r\n  z-index:10;\r\n  padding:7px 10px;\r\n  border-radius:999px;\r\n  border:1px solid rgba(139,92,246,.32);\r\n  background:rgba(5,6,18,.90);\r\n  color:#e3d8ff;\r\n  font-size:.62rem;\r\n  font-weight:900;\r\n  letter-spacing:.10em;\r\n  text-transform:uppercase;\r\n  pointer-events:none;\r\n}\r\n\r\n\/* Loading state while Vault is checked *\/\r\n#tc2Overlay.tc2-membership-loading\r\n.tc2-futureCard:not(#tc2MainAstro){\r\n  opacity:.42 !important;\r\n  filter:grayscale(.30) brightness(.60) !important;\r\n}\r\n\r\n\/* =========================================================\r\n   ACCESS MODAL\r\n========================================================= *\/\r\n\r\n#tc2MembershipGate{\r\n  position:fixed;\r\n  inset:0;\r\n  z-index:2147483647;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:18px;\r\n  background:rgba(0,0,0,.72);\r\n  backdrop-filter:blur(10px);\r\n}\r\n\r\n#tc2MembershipGate.open{\r\n  display:flex;\r\n}\r\n\r\n.tc2-membershipGateCard{\r\n  width:min(94vw,560px);\r\n  padding:26px;\r\n  border-radius:30px;\r\n  border:1px solid rgba(83,243,255,.20);\r\n  background:\r\n    radial-gradient(\r\n      circle at top left,\r\n      rgba(83,243,255,.10),\r\n      transparent 36%\r\n    ),\r\n    radial-gradient(\r\n      circle at top right,\r\n      rgba(139,92,246,.12),\r\n      transparent 34%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(10,18,40,.98),\r\n      rgba(2,5,13,.99)\r\n    );\r\n  box-shadow:\r\n    0 28px 90px rgba(0,0,0,.64),\r\n    0 0 36px rgba(83,243,255,.12);\r\n  color:#fff;\r\n}\r\n\r\n.tc2-membershipGateEyebrow{\r\n  color:#9eefff;\r\n  font-size:.7rem;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-membershipGateCard h3{\r\n  margin:10px 0 0;\r\n  font-size:clamp(1.8rem,6vw,3rem);\r\n  line-height:.95;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-membershipGateCard p{\r\n  margin:14px 0 0;\r\n  color:rgba(248,251,255,.76);\r\n  line-height:1.7;\r\n}\r\n\r\n.tc2-membershipGateActions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:10px;\r\n  margin-top:22px;\r\n}\r\n\r\n@media(max-width:620px){\r\n  .tc2-membershipGateActions{\r\n    flex-direction:column;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* =====================================================\r\n     SETTINGS\r\n  ===================================================== *\/\r\n\r\n  const TC_GATE_AJAX =\r\n    \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\n  const TC_GATE_LEVELS_ACTION =\r\n    \"ggg_get_current_user_vault_levels\";\r\n\r\n  const TC_GATE_DEFAULT_LOGIN =\r\n    (\r\n      window.gggPmsData &&\r\n      window.gggPmsData.urls &&\r\n      window.gggPmsData.urls.login\r\n    )\r\n      ? window.gggPmsData.urls.login\r\n      : \"\/login\/\";\r\n\r\n  const TC_GATE_DEFAULT_ACCOUNT =\r\n    (\r\n      window.gggPmsData &&\r\n      window.gggPmsData.urls &&\r\n      window.gggPmsData.urls.account\r\n    )\r\n      ? window.gggPmsData.urls.account\r\n      : \"\/account\/\";\r\n\r\n  const TC_GATE_DEFAULT_REGISTER =\r\n    (\r\n      window.gggPmsData &&\r\n      window.gggPmsData.urls &&\r\n      window.gggPmsData.urls.register\r\n    )\r\n      ? window.gggPmsData.urls.register\r\n      : \"\/register\/\";\r\n\r\n  \/*\r\n    Main Travel Club access requirements.\r\n  *\/\r\n  const TC_GATE_FEATURES = {\r\n    astro:{\r\n      level:1,\r\n      title:\"Astro Travel Recommendations\",\r\n      card:\"#tc2MainAstro\",\r\n      controls:[\r\n        \"#tc2MainAstro\"\r\n      ]\r\n    },\r\n\r\n    explore:{\r\n      level:2,\r\n      title:\"Explore Medell\u00edn\",\r\n      card:\"#tc2MainExplore\",\r\n      controls:[\r\n        \"#tc2MainExplore\",\r\n        \"#tc2FloatExplore\",\r\n        \"#tc2JourneyGoExplore\"\r\n      ]\r\n    },\r\n\r\n    intelligence:{\r\n      level:2,\r\n      title:\"Travel Intelligence\",\r\n      card:\"#tc2MainBrain\",\r\n      controls:[\r\n        \"#tc2MainBrain\",\r\n        \"#tc2JourneyGoBrain\",\r\n        \"[data-open-travel-intelligence]\"\r\n      ]\r\n    },\r\n\r\n    journey:{\r\n      level:2,\r\n      title:\"My Journey\",\r\n      card:\"#tc2MainJourney\",\r\n      controls:[\r\n        \"#tc2MainJourney\",\r\n        \"#tc2FloatJourney\",\r\n        \"#tc2SavePlanBtn\",\r\n        \"#tc2SendPlanBtn\"\r\n      ]\r\n    },\r\n\r\n    services:{\r\n      level:2,\r\n      title:\"Local Services\",\r\n      card:\"#tc2MainServices\",\r\n      controls:[\r\n        \"#tc2MainServices\",\r\n        \"#tc2FloatServices\",\r\n        \"#tc2OpenServicesFromPlan\",\r\n        \"#tc2JourneyGoServices\",\r\n        \"#tc2AddServiceBtn\",\r\n        \"#tc2ServiceWhatsAppBtn\"\r\n      ]\r\n    },\r\n\r\n    story:{\r\n      level:2,\r\n      title:\"My Travel Story\",\r\n      card:\"#tc2MainStory\",\r\n      controls:[\r\n        \"#tc2MainStory\",\r\n        \"#tc2FloatStory\"\r\n      ]\r\n    },\r\n\r\n    evolution:{\r\n      level:4,\r\n      title:\"Personal Evolution\",\r\n      card:\"#tc2MainEvolution\",\r\n      controls:[\r\n        \"#tc2MainEvolution\"\r\n      ]\r\n    }\r\n  };\r\n\r\n  \/*\r\n    Exact Level 3 Explore guide names.\r\n  *\/\r\n  const TC_GATE_LEVEL3_GUIDES = [\r\n  \"Discover\",\r\n  \"Entertainment\",\r\n  \"Medical Tourism\"\r\n];\r\n\r\n  let tcGateState = {\r\n    ready:false,\r\n    loggedIn:false,\r\n    userId:0,\r\n    displayName:\"\",\r\n    highestLevel:1,\r\n\r\n    owned:{\r\n      1:true,\r\n      2:false,\r\n      3:false,\r\n      4:false,\r\n      5:false,\r\n      6:false,\r\n      7:false,\r\n      8:false\r\n    },\r\n\r\n    urls:{\r\n      login:TC_GATE_DEFAULT_LOGIN,\r\n      account:TC_GATE_DEFAULT_ACCOUNT,\r\n      register:TC_GATE_DEFAULT_REGISTER\r\n    }\r\n  };\r\n\r\n  let tcGateGuideObserver = null;\r\n\r\n\r\n  \/* =====================================================\r\n     BASIC HELPERS\r\n  ===================================================== *\/\r\n\r\n  function tcGateEl(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function tcGateOwned(level){\r\n    level = Number(level) || 1;\r\n\r\n    if(level <= 1){\r\n      return true;\r\n    }\r\n\r\n    return Boolean(\r\n      tcGateState.loggedIn &#038;&#038;\r\n      tcGateState.owned &#038;&#038;\r\n      tcGateState.owned[level]\r\n    );\r\n  }\r\n\r\n  function tcGateHighestLevel(){\r\n    let highest = 1;\r\n\r\n    for(let level = 1; level <= 8; level++){\r\n      if(tcGateOwned(level)){\r\n        highest = level;\r\n      }\r\n    }\r\n\r\n    return highest;\r\n  }\r\n\r\n  function tcGateFeatureByElement(element){\r\n    if(!element){\r\n      return null;\r\n    }\r\n\r\n    const keys =\r\n      Object.keys(TC_GATE_FEATURES);\r\n\r\n    for(const key of keys){\r\n      const feature =\r\n        TC_GATE_FEATURES[key];\r\n\r\n      for(const selector of feature.controls){\r\n        try{\r\n          if(\r\n            element.matches(selector) ||\r\n            element.closest(selector)\r\n          ){\r\n            return Object.assign(\r\n              {key:key},\r\n              feature\r\n            );\r\n          }\r\n        }catch(error){}\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function tcGateShowHome(){\r\n    document\r\n      .querySelectorAll(\r\n        \"#tc2Overlay .tc2-page\"\r\n      )\r\n      .forEach(function(page){\r\n        page.classList.remove(\"active\");\r\n      });\r\n\r\n    const home =\r\n      tcGateEl(\"tc2HomePage\");\r\n\r\n    if(home){\r\n      home.classList.add(\"active\");\r\n    }\r\n\r\n    const overlay =\r\n      tcGateEl(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      try{\r\n        overlay.scrollTo({\r\n          top:0,\r\n          behavior:\"smooth\"\r\n        });\r\n      }catch(error){\r\n        overlay.scrollTop = 0;\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     MEMBERSHIP MODAL\r\n  ===================================================== *\/\r\n\r\n  function tcGateInstallModal(){\r\n    if(tcGateEl(\"tc2MembershipGate\")){\r\n      return;\r\n    }\r\n\r\n    const modal =\r\n      document.createElement(\"div\");\r\n\r\n    modal.id =\r\n      \"tc2MembershipGate\";\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n\r\n    modal.innerHTML = `\r\n      <div class=\"tc2-membershipGateCard\">\r\n\r\n        <div class=\"tc2-membershipGateEyebrow\">\r\n          Bliss Travel Club\r\n        <\/div>\r\n\r\n        <h3 id=\"tc2MembershipGateTitle\">\r\n          Membership Required\r\n        <\/h3>\r\n\r\n        <p id=\"tc2MembershipGateText\">\r\n          This feature is not active for this account.\r\n        <\/p>\r\n\r\n        <div class=\"tc2-membershipGateActions\">\r\n\r\n          <button\r\n            id=\"tc2MembershipPrimary\"\r\n            class=\"tc2-btn tc2-btn-cyan\"\r\n            type=\"button\">\r\n            Continue\r\n          <\/button>\r\n\r\n          <button\r\n            id=\"tc2MembershipAccount\"\r\n            class=\"tc2-btn tc2-btn-violet\"\r\n            type=\"button\">\r\n            My Account\r\n          <\/button>\r\n\r\n          <button\r\n            id=\"tc2MembershipClose\"\r\n            class=\"tc2-btn tc2-btn-outline\"\r\n            type=\"button\">\r\n            Close\r\n          <\/button>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    document.body.appendChild(modal);\r\n\r\n    const close =\r\n      tcGateEl(\"tc2MembershipClose\");\r\n\r\n    const primary =\r\n      tcGateEl(\"tc2MembershipPrimary\");\r\n\r\n    const account =\r\n      tcGateEl(\"tc2MembershipAccount\");\r\n\r\n    if(close){\r\n      close.addEventListener(\r\n        \"click\",\r\n        tcGateCloseModal\r\n      );\r\n    }\r\n\r\n    if(primary){\r\n      primary.addEventListener(\r\n        \"click\",\r\n        function(){\r\n          const url =\r\n            primary.dataset.url || \"\";\r\n\r\n          if(url){\r\n            window.location.href = url;\r\n          }\r\n        }\r\n      );\r\n    }\r\n\r\n    if(account){\r\n      account.addEventListener(\r\n        \"click\",\r\n        function(){\r\n          window.location.href =\r\n            tcGateState.urls.account ||\r\n            TC_GATE_DEFAULT_ACCOUNT;\r\n        }\r\n      );\r\n    }\r\n\r\n    modal.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n        if(event.target === modal){\r\n          tcGateCloseModal();\r\n        }\r\n      }\r\n    );\r\n  }\r\n\r\n  function tcGateCloseModal(){\r\n    const modal =\r\n      tcGateEl(\"tc2MembershipGate\");\r\n\r\n    if(!modal){\r\n      return;\r\n    }\r\n\r\n    modal.classList.remove(\"open\");\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n  }\r\n\r\n  function tcGateOpenModal(\r\n    featureTitle,\r\n    requiredLevel\r\n  ){\r\n    tcGateInstallModal();\r\n\r\n    \/*\r\n      Return to home in case an older capture listener\r\n      opened the locked page first.\r\n    *\/\r\n    tcGateShowHome();\r\n\r\n    const modal =\r\n      tcGateEl(\"tc2MembershipGate\");\r\n\r\n    const title =\r\n      tcGateEl(\r\n        \"tc2MembershipGateTitle\"\r\n      );\r\n\r\n    const text =\r\n      tcGateEl(\r\n        \"tc2MembershipGateText\"\r\n      );\r\n\r\n    const primary =\r\n      tcGateEl(\r\n        \"tc2MembershipPrimary\"\r\n      );\r\n\r\n    const account =\r\n      tcGateEl(\r\n        \"tc2MembershipAccount\"\r\n      );\r\n\r\n    if(\r\n      !modal ||\r\n      !title ||\r\n      !text ||\r\n      !primary\r\n    ){\r\n      return;\r\n    }\r\n\r\n    if(!tcGateState.loggedIn){\r\n      title.textContent =\r\n        featureTitle + \" Is Locked\";\r\n\r\n      text.textContent =\r\n        featureTitle +\r\n        \" requires Level \" +\r\n        requiredLevel +\r\n        \" membership. Sign in or create an account to continue.\";\r\n\r\n      primary.textContent =\r\n        \"Sign In \/ Sign Up\";\r\n\r\n      primary.dataset.url =\r\n        tcGateState.urls.login ||\r\n        TC_GATE_DEFAULT_LOGIN;\r\n\r\n      if(account){\r\n        account.style.display = \"none\";\r\n      }\r\n    }else{\r\n      title.textContent =\r\n        \"Level \" +\r\n        requiredLevel +\r\n        \" Required\";\r\n\r\n      text.textContent =\r\n        featureTitle +\r\n        \" is not active in your current membership. Your account currently has Level \" +\r\n        tcGateState.highestLevel +\r\n        \" access.\";\r\n\r\n      primary.textContent =\r\n        \"View Membership\";\r\n\r\n      primary.dataset.url =\r\n        tcGateState.urls.account ||\r\n        TC_GATE_DEFAULT_ACCOUNT;\r\n\r\n      if(account){\r\n        account.style.display = \"\";\r\n      }\r\n    }\r\n\r\n    modal.classList.add(\"open\");\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     MAIN CARD APPEARANCE\r\n  ===================================================== *\/\r\n\r\n  function tcGateRemoveLockBadge(card){\r\n    if(!card){\r\n      return;\r\n    }\r\n\r\n    card\r\n      .querySelectorAll(\r\n        \".tc2-vault-lockBadge\"\r\n      )\r\n      .forEach(function(badge){\r\n        badge.remove();\r\n      });\r\n  }\r\n\r\n  function tcGateAddLockBadge(\r\n    card,\r\n    level\r\n  ){\r\n    if(!card){\r\n      return;\r\n    }\r\n\r\n    tcGateRemoveLockBadge(card);\r\n\r\n    const badge =\r\n      document.createElement(\"div\");\r\n\r\n    badge.className =\r\n      \"tc2-vault-lockBadge\";\r\n\r\n    badge.textContent =\r\n      \"Level \" + level + \" \ud83d\udd12\";\r\n\r\n    card.appendChild(badge);\r\n  }\r\n\r\n  function tcGateSetStatusText(\r\n    card,\r\n    text,\r\n    className\r\n  ){\r\n    if(!card){\r\n      return;\r\n    }\r\n\r\n    const status =\r\n      card.querySelector(\r\n        \".tc2-status\"\r\n      );\r\n\r\n    if(!status){\r\n      return;\r\n    }\r\n\r\n    status.textContent = text;\r\n\r\n    status.classList.remove(\r\n      \"tc2-vault-statusFree\",\r\n      \"tc2-vault-statusOn\",\r\n      \"tc2-vault-statusOff\"\r\n    );\r\n\r\n    if(className){\r\n      status.classList.add(className);\r\n    }\r\n  }\r\n\r\n  function tcGateSetCardState(\r\n    featureKey\r\n  ){\r\n    const feature =\r\n      TC_GATE_FEATURES[featureKey];\r\n\r\n    if(!feature){\r\n      return;\r\n    }\r\n\r\n    const card =\r\n      document.querySelector(\r\n        feature.card\r\n      );\r\n\r\n    if(!card){\r\n      return;\r\n    }\r\n\r\n    const unlocked =\r\n      tcGateOwned(feature.level);\r\n\r\n    card.dataset.vaultFeature =\r\n      featureKey;\r\n\r\n    card.dataset.vaultLevel =\r\n      String(feature.level);\r\n\r\n    card.classList.toggle(\r\n      \"tc2-vault-unlocked\",\r\n      unlocked\r\n    );\r\n\r\n    card.classList.toggle(\r\n      \"tc2-vault-locked\",\r\n      !unlocked\r\n    );\r\n\r\n    card.classList.toggle(\r\n      \"is-on\",\r\n      unlocked\r\n    );\r\n\r\n    card.classList.toggle(\r\n      \"is-locked\",\r\n      !unlocked\r\n    );\r\n\r\n    card.setAttribute(\r\n      \"aria-disabled\",\r\n      unlocked ? \"false\" : \"true\"\r\n    );\r\n\r\n    if(unlocked){\r\n      tcGateRemoveLockBadge(card);\r\n\r\n      if(feature.level === 1){\r\n        tcGateSetStatusText(\r\n          card,\r\n          \"FREE \u00b7 ONLINE\",\r\n          \"tc2-vault-statusFree\"\r\n        );\r\n      }else{\r\n        tcGateSetStatusText(\r\n          card,\r\n          \"LEVEL \" +\r\n          feature.level +\r\n          \" \u00b7 ACTIVE\",\r\n          \"tc2-vault-statusOn\"\r\n        );\r\n      }\r\n    }else{\r\n      tcGateAddLockBadge(\r\n        card,\r\n        feature.level\r\n      );\r\n\r\n      tcGateSetStatusText(\r\n        card,\r\n        \"LEVEL \" +\r\n        feature.level +\r\n        \" \ud83d\udd12\",\r\n        \"tc2-vault-statusOff\"\r\n      );\r\n    }\r\n  }\r\n\r\n  function tcGateSetControlState(\r\n    selector,\r\n    unlocked,\r\n    level,\r\n    featureKey\r\n  ){\r\n    document\r\n      .querySelectorAll(selector)\r\n      .forEach(function(control){\r\n        control.dataset.vaultFeature =\r\n          featureKey;\r\n\r\n        control.dataset.vaultLevel =\r\n          String(level);\r\n\r\n        control.classList.toggle(\r\n          \"tc2-vault-unlocked\",\r\n          unlocked\r\n        );\r\n\r\n        control.classList.toggle(\r\n          \"tc2-vault-locked\",\r\n          !unlocked\r\n        );\r\n\r\n        control.setAttribute(\r\n          \"aria-disabled\",\r\n          unlocked ? \"false\" : \"true\"\r\n        );\r\n\r\n        \/*\r\n          Do not use disabled=true because a disabled\r\n          button cannot display our membership message.\r\n        *\/\r\n      });\r\n  }\r\n\r\n  function tcGateApplyMainAccess(){\r\n    Object.keys(\r\n      TC_GATE_FEATURES\r\n    ).forEach(function(key){\r\n      const feature =\r\n        TC_GATE_FEATURES[key];\r\n\r\n      const unlocked =\r\n        tcGateOwned(feature.level);\r\n\r\n      tcGateSetCardState(key);\r\n\r\n      feature.controls.forEach(\r\n        function(selector){\r\n          tcGateSetControlState(\r\n            selector,\r\n            unlocked,\r\n            feature.level,\r\n            key\r\n          );\r\n        }\r\n      );\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LEVEL 3 EXPLORE GUIDES\r\n  ===================================================== *\/\r\n\r\n  function tcGateGuideName(element){\r\n    if(!element){\r\n      return \"\";\r\n    }\r\n\r\n    const possible = [\r\n      element.dataset\r\n        ? element.dataset.guide\r\n        : \"\",\r\n\r\n      element.dataset\r\n        ? element.dataset.category\r\n        : \"\",\r\n\r\n      element.dataset\r\n        ? element.dataset.key\r\n        : \"\",\r\n\r\n      element.querySelector(\r\n        \".tc2-cardTitle\"\r\n      )\r\n        ? element.querySelector(\r\n            \".tc2-cardTitle\"\r\n          ).textContent\r\n        : \"\",\r\n\r\n      element.querySelector(\"h3\")\r\n        ? element.querySelector(\r\n            \"h3\"\r\n          ).textContent\r\n        : \"\",\r\n\r\n      element.textContent\r\n    ];\r\n\r\n    for(const value of possible){\r\n      const clean =\r\n        String(value || \"\")\r\n          .replace(\/\\s+\/g,\" \")\r\n          .trim();\r\n\r\n      const exact =\r\n        TC_GATE_LEVEL3_GUIDES.find(\r\n          function(name){\r\n            return (\r\n              clean === name ||\r\n              clean.startsWith(\r\n                name + \" \"\r\n              ) ||\r\n              clean.includes(name)\r\n            );\r\n          }\r\n        );\r\n\r\n      if(exact){\r\n        return exact;\r\n      }\r\n    }\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function tcGateRemoveGuideBadge(\r\n    element\r\n  ){\r\n    if(!element){\r\n      return;\r\n    }\r\n\r\n    element\r\n      .querySelectorAll(\r\n        \".tc2-level3-lockBadge\"\r\n      )\r\n      .forEach(function(badge){\r\n        badge.remove();\r\n      });\r\n  }\r\n\r\n  function tcGateApplyLevel3Guides(){\r\n    const grid =\r\n      tcGateEl(\"tc2GuideGrid\");\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n    const level3 =\r\n      tcGateOwned(3);\r\n\r\n    const possibleCards =\r\n      grid.querySelectorAll(\r\n        \".tc2-guideCard,\" +\r\n        \"button,\" +\r\n        \"[data-guide],\" +\r\n        \"[data-category],\" +\r\n        \"[data-key]\"\r\n      );\r\n\r\n    possibleCards.forEach(\r\n      function(card){\r\n        const guideName =\r\n          tcGateGuideName(card);\r\n\r\n        if(!guideName){\r\n          return;\r\n        }\r\n\r\n        card.dataset.vaultGuide =\r\n          guideName;\r\n\r\n        card.dataset.vaultLevel =\r\n          \"3\";\r\n\r\n        card.classList.toggle(\r\n          \"tc2-level3-locked\",\r\n          !level3\r\n        );\r\n\r\n        card.classList.toggle(\r\n          \"tc2-vault-unlocked\",\r\n          level3\r\n        );\r\n\r\n        card.setAttribute(\r\n          \"aria-disabled\",\r\n          level3 ? \"false\" : \"true\"\r\n        );\r\n\r\n        const existingBadge =\r\n  card.querySelector(\r\n    \":scope > .tc2-level3-lockBadge\"\r\n  );\r\n\r\nif(!level3){\r\n\r\n  \/*\r\n   * Only create the badge when one does not already exist.\r\n   * This prevents the MutationObserver from repeatedly\r\n   * deleting and recreating the same badge.\r\n   *\/\r\n  if(!existingBadge){\r\n\r\n    const badge =\r\n      document.createElement(\"div\");\r\n\r\n    badge.className =\r\n      \"tc2-level3-lockBadge\";\r\n\r\n    badge.textContent =\r\n      \"Level 3 \ud83d\udd12\";\r\n\r\n    if(\r\n      getComputedStyle(card)\r\n        .position === \"static\"\r\n    ){\r\n      card.style.position =\r\n        \"relative\";\r\n    }\r\n\r\n    card.appendChild(badge);\r\n  }\r\n\r\n}else if(existingBadge){\r\n\r\n  \/*\r\n   * Level 3 is active, so remove the existing badge once.\r\n   *\/\r\n  existingBadge.remove();\r\n}\r\n      }\r\n    );\r\n  }\r\n\r\n  function tcGateObserveExplore(){\r\n    const grid =\r\n      tcGateEl(\"tc2GuideGrid\");\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n    if(tcGateGuideObserver){\r\n      tcGateGuideObserver.disconnect();\r\n    }\r\n\r\n    tcGateGuideObserver =\r\n      new MutationObserver(\r\n        function(){\r\n          tcGateApplyLevel3Guides();\r\n        }\r\n      );\r\n\r\n    tcGateGuideObserver.observe(\r\n      grid,\r\n      {\r\n        childList:true,\r\n        subtree:true\r\n      }\r\n    );\r\n\r\n    tcGateApplyLevel3Guides();\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LEVEL \/ STATUS DISPLAY\r\n  ===================================================== *\/\r\n\r\n  function tcGateStatusLabel(){\r\n    if(!tcGateState.loggedIn){\r\n      return \"Guest \u00b7 Astro Free\";\r\n    }\r\n\r\n    const highest =\r\n      tcGateState.highestLevel;\r\n\r\n    if(highest >= 4){\r\n      return \"Level 4 \u00b7 Evolution Active\";\r\n    }\r\n\r\n    if(highest >= 3){\r\n      return \"Level 3 \u00b7 Premium Guides\";\r\n    }\r\n\r\n    if(highest >= 2){\r\n      return \"Level 2 \u00b7 Travel Club Active\";\r\n    }\r\n\r\n    return \"Level 1 \u00b7 Astro Free\";\r\n  }\r\n\r\n  function tcGateUpdateStatusDisplays(){\r\n    tcGateState.highestLevel =\r\n      tcGateHighestLevel();\r\n\r\n    const label =\r\n      tcGateStatusLabel();\r\n\r\n    [\r\n      \"tc2LevelStatus\",\r\n      \"tc2StatLevel\"\r\n    ].forEach(function(id){\r\n      const element =\r\n        tcGateEl(id);\r\n\r\n      if(element){\r\n        element.textContent =\r\n          label;\r\n      }\r\n    });\r\n\r\n    \/*\r\n      Keep global data synchronized for other scripts.\r\n    *\/\r\n    window.gggPmsData =\r\n      window.gggPmsData || {};\r\n\r\n    window.gggPmsData.loggedIn =\r\n      tcGateState.loggedIn;\r\n\r\n    window.gggPmsData.userId =\r\n      tcGateState.userId;\r\n\r\n    window.gggPmsData.owned =\r\n      tcGateState.owned;\r\n\r\n    window.gggPmsData.urls =\r\n      tcGateState.urls;\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     APPLY EVERYTHING\r\n  ===================================================== *\/\r\n\r\n  function tcGateApply(){\r\n    const overlay =\r\n      tcGateEl(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      overlay.classList.remove(\r\n        \"tc2-membership-loading\"\r\n      );\r\n    }\r\n\r\n    tcGateState.highestLevel =\r\n      tcGateHighestLevel();\r\n\r\n    tcGateApplyMainAccess();\r\n    tcGateApplyLevel3Guides();\r\n    tcGateUpdateStatusDisplays();\r\n\r\n    try{\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissMembershipLoaded\",\r\n          {\r\n            detail:{\r\n              loggedIn:\r\n                tcGateState.loggedIn,\r\n\r\n              userId:\r\n                tcGateState.userId,\r\n\r\n              highestLevel:\r\n                tcGateState.highestLevel,\r\n\r\n              owned:\r\n                tcGateState.owned\r\n            }\r\n          }\r\n        )\r\n      );\r\n    }catch(error){}\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOAD VAULT LEVELS\r\n  ===================================================== *\/\r\n\r\n  function tcGateLoadLevels(){\r\n    const overlay =\r\n      tcGateEl(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      overlay.classList.add(\r\n        \"tc2-membership-loading\"\r\n      );\r\n    }\r\n\r\n    return window.BlissMembershipRequest.load(\r\n  TC_GATE_AJAX,\r\n  TC_GATE_LEVELS_ACTION\r\n)\r\n    .then(function(result){\r\n      if(\r\n        !result ||\r\n        !result.success ||\r\n        !result.data\r\n      ){\r\n        throw new Error(\r\n          \"Membership information could not be loaded.\"\r\n        );\r\n      }\r\n\r\n      const data =\r\n        result.data;\r\n\r\n      \/*\r\n        Important:\r\n        Guests must explicitly reset to logged out.\r\n      *\/\r\n      tcGateState.loggedIn =\r\n        Boolean(\r\n          data.logged_in\r\n        );\r\n\r\n      tcGateState.userId =\r\n        Number(\r\n          data.user_id || 0\r\n        );\r\n\r\n      tcGateState.displayName =\r\n        String(\r\n          data.display_name || \"\"\r\n        );\r\n\r\n      tcGateState.owned =\r\n        Object.assign(\r\n          {\r\n            1:true,\r\n            2:false,\r\n            3:false,\r\n            4:false,\r\n            5:false,\r\n            6:false,\r\n            7:false,\r\n            8:false\r\n          },\r\n          data.owned || {}\r\n        );\r\n\r\n      \/*\r\n        Guests receive Level 1 only.\r\n      *\/\r\n      if(!tcGateState.loggedIn){\r\n        tcGateState.owned = {\r\n          1:true,\r\n          2:false,\r\n          3:false,\r\n          4:false,\r\n          5:false,\r\n          6:false,\r\n          7:false,\r\n          8:false\r\n        };\r\n      }\r\n\r\n      tcGateState.urls = {\r\n        login:\r\n          data.login_url ||\r\n          TC_GATE_DEFAULT_LOGIN,\r\n\r\n        account:\r\n          data.account_url ||\r\n          TC_GATE_DEFAULT_ACCOUNT,\r\n\r\n        register:\r\n          data.register_url ||\r\n          TC_GATE_DEFAULT_REGISTER\r\n      };\r\n\r\n      tcGateState.ready = true;\r\n\r\n      tcGateApply();\r\n\r\n      return tcGateState;\r\n    })\r\n    .catch(function(error){\r\n      console.warn(\r\n        \"[Bliss Membership Gate]\",\r\n        error\r\n      );\r\n\r\n      \/*\r\n        Secure fallback:\r\n        if membership cannot be verified,\r\n        allow Astro only.\r\n      *\/\r\n      tcGateState = {\r\n        ready:true,\r\n        loggedIn:false,\r\n        userId:0,\r\n        displayName:\"\",\r\n        highestLevel:1,\r\n\r\n        owned:{\r\n          1:true,\r\n          2:false,\r\n          3:false,\r\n          4:false,\r\n          5:false,\r\n          6:false,\r\n          7:false,\r\n          8:false\r\n        },\r\n\r\n        urls:{\r\n          login:\r\n            TC_GATE_DEFAULT_LOGIN,\r\n\r\n          account:\r\n            TC_GATE_DEFAULT_ACCOUNT,\r\n\r\n          register:\r\n            TC_GATE_DEFAULT_REGISTER\r\n        }\r\n      };\r\n\r\n      tcGateApply();\r\n\r\n      return tcGateState;\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOCKED CLICK PROTECTION\r\n\r\n     Capture mode stops normal bubble listeners.\r\n\r\n     Some older Travel Club patches also use capture mode\r\n     and may run before this patch. Therefore this function\r\n     also sends the visitor back to the home page before\r\n     showing the membership message.\r\n  ===================================================== *\/\r\n\r\n  function tcGateBlockEvent(\r\n    event,\r\n    title,\r\n    level\r\n  ){\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    event.stopImmediatePropagation();\r\n\r\n    tcGateOpenModal(\r\n      title,\r\n      level\r\n    );\r\n  }\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      \/*\r\n        Main and floating feature controls.\r\n      *\/\r\n      const feature =\r\n        tcGateFeatureByElement(\r\n          event.target\r\n        );\r\n\r\n      if(\r\n        feature &&\r\n        !tcGateOwned(feature.level)\r\n      ){\r\n        tcGateBlockEvent(\r\n          event,\r\n          feature.title,\r\n          feature.level\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      \/*\r\n        Level 3 Explore guides.\r\n      *\/\r\n      const guideCard =\r\n        event.target.closest(\r\n          \"[data-vault-guide],\" +\r\n          \".tc2-level3-locked\"\r\n        );\r\n\r\n      if(guideCard){\r\n        const guideName =\r\n          guideCard.dataset.vaultGuide ||\r\n          tcGateGuideName(guideCard);\r\n\r\n        if(\r\n          guideName &&\r\n          !tcGateOwned(3)\r\n        ){\r\n          tcGateBlockEvent(\r\n            event,\r\n            guideName,\r\n            3\r\n          );\r\n\r\n          return;\r\n        }\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n  \/*\r\n    Pointer protection helps prevent older click handlers\r\n    from opening locked pages on touch devices.\r\n  *\/\r\n  document.addEventListener(\r\n    \"pointerdown\",\r\n    function(event){\r\n      const feature =\r\n        tcGateFeatureByElement(\r\n          event.target\r\n        );\r\n\r\n      if(\r\n        feature &&\r\n        !tcGateOwned(feature.level)\r\n      ){\r\n        event.preventDefault();\r\n      }\r\n\r\n      const guideCard =\r\n        event.target.closest(\r\n          \"[data-vault-guide],\" +\r\n          \".tc2-level3-locked\"\r\n        );\r\n\r\n      if(\r\n        guideCard &&\r\n        !tcGateOwned(3)\r\n      ){\r\n        event.preventDefault();\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     PUBLIC MEMBERSHIP API\r\n\r\n     Other Travel Club systems can check:\r\n\r\n     BlissTravelMembership.hasLevel(2)\r\n     BlissTravelMembership.canReserve()\r\n  ===================================================== *\/\r\n\r\n  window.BlissTravelMembership = {\r\n    reload:\r\n      tcGateLoadLevels,\r\n\r\n    isReady:function(){\r\n      return Boolean(\r\n        tcGateState.ready\r\n      );\r\n    },\r\n\r\n    isLoggedIn:function(){\r\n      return Boolean(\r\n        tcGateState.loggedIn\r\n      );\r\n    },\r\n\r\n    hasLevel:function(level){\r\n      return tcGateOwned(level);\r\n    },\r\n\r\n    highestLevel:function(){\r\n      return tcGateState.highestLevel;\r\n    },\r\n\r\n    canReserve:function(){\r\n      return tcGateOwned(2);\r\n    },\r\n\r\n    canUsePremiumGuides:function(){\r\n      return tcGateOwned(3);\r\n    },\r\n\r\n    canUseEvolution:function(){\r\n      return tcGateOwned(4);\r\n    },\r\n\r\n    getState:function(){\r\n      return JSON.parse(\r\n        JSON.stringify(\r\n          tcGateState\r\n        )\r\n      );\r\n    },\r\n\r\n    requireLevel:function(\r\n      level,\r\n      title\r\n    ){\r\n      if(tcGateOwned(level)){\r\n        return true;\r\n      }\r\n\r\n      tcGateOpenModal(\r\n        title ||\r\n        (\"Level \" + level + \" Feature\"),\r\n        level\r\n      );\r\n\r\n      return false;\r\n    }\r\n  };\r\n\r\n\r\n  \/* =====================================================\r\n     INITIALIZE\r\n  ===================================================== *\/\r\n\r\n  function tcGateInitialize(){\r\n    const overlay =\r\n      tcGateEl(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      setTimeout(\r\n        tcGateInitialize,\r\n        300\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    tcGateInstallModal();\r\n    tcGateObserveExplore();\r\n    tcGateLoadLevels();\r\n\r\n    \/*\r\n      Reapply after dynamic Travel Club sections render.\r\n    *\/\r\n    setTimeout(\r\n      tcGateApply,\r\n      1200\r\n    );\r\n\r\n    setTimeout(\r\n      tcGateApply,\r\n      2600\r\n    );\r\n\r\n    console.log(\r\n      \"[Bliss Travel Club] Vault membership gate connected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      tcGateInitialize\r\n    );\r\n  }else{\r\n    tcGateInitialize();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nSIGN IN + ACCOUNT STATE + SECURE CARD RESET V1\r\n\r\nPASTE AT THE VERY BOTTOM OF THE TRAVEL CLUB CODE.\r\n\r\nUSES:\r\nggg_get_current_user_vault_levels\r\n\r\nGUEST:\r\n- Astro available\r\n- Everything else visibly locked\r\n- Sign In \/ Join button shown\r\n\r\nSIGNED IN:\r\n- Button becomes My Account\r\n- Vault levels decide what unlocks\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   TRAVEL CLUB AUTH BUTTON\r\n========================================================= *\/\r\n\r\n#tc2AuthButton{\r\n  position:fixed;\r\n  top:18px;\r\n  right:78px;\r\n  z-index:2147483647;\r\n\r\n  min-height:48px;\r\n  padding:0 17px;\r\n\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:8px;\r\n\r\n  border-radius:999px;\r\n  border:1px solid rgba(83,243,255,.30);\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      rgba(5,17,34,.94),\r\n      rgba(12,20,50,.94)\r\n    );\r\n\r\n  color:#effcff;\r\n\r\n  box-shadow:\r\n    0 0 22px rgba(83,243,255,.13),\r\n    inset 0 0 0 1px rgba(255,255,255,.035);\r\n\r\n  cursor:pointer;\r\n\r\n  font-family:Arial,Helvetica,sans-serif;\r\n  font-size:.70rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n\r\n  backdrop-filter:blur(14px);\r\n  -webkit-backdrop-filter:blur(14px);\r\n}\r\n\r\n#tc2AuthButton:hover{\r\n  border-color:rgba(83,243,255,.68);\r\n\r\n  box-shadow:\r\n    0 0 28px rgba(83,243,255,.25),\r\n    inset 0 0 0 1px rgba(255,255,255,.06);\r\n}\r\n\r\n#tc2AuthButton.tc2-auth-member{\r\n  border-color:rgba(112,247,162,.34);\r\n  color:#d7ffe3;\r\n}\r\n\r\n#tc2AuthDot{\r\n  width:8px;\r\n  height:8px;\r\n  border-radius:50%;\r\n  background:#f4d27a;\r\n  box-shadow:0 0 12px rgba(244,210,122,.85);\r\n}\r\n\r\n#tc2AuthButton.tc2-auth-member #tc2AuthDot{\r\n  background:#70f7a2;\r\n  box-shadow:0 0 12px rgba(112,247,162,.9);\r\n}\r\n\r\n\/* =========================================================\r\n   AUTH CHOICE MODAL\r\n========================================================= *\/\r\n\r\n#tc2AuthChoiceModal{\r\n  position:fixed;\r\n  inset:0;\r\n  z-index:2147483647;\r\n\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  padding:18px;\r\n\r\n  background:rgba(0,0,0,.76);\r\n  backdrop-filter:blur(12px);\r\n  -webkit-backdrop-filter:blur(12px);\r\n}\r\n\r\n#tc2AuthChoiceModal.open{\r\n  display:flex;\r\n}\r\n\r\n.tc2-authChoiceCard{\r\n  width:min(94vw,560px);\r\n  padding:27px;\r\n\r\n  border-radius:30px;\r\n  border:1px solid rgba(83,243,255,.22);\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at top left,\r\n      rgba(83,243,255,.12),\r\n      transparent 34%\r\n    ),\r\n    radial-gradient(\r\n      circle at top right,\r\n      rgba(139,92,246,.13),\r\n      transparent 36%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(10,18,40,.99),\r\n      rgba(2,5,13,.99)\r\n    );\r\n\r\n  color:#fff;\r\n\r\n  box-shadow:\r\n    0 28px 90px rgba(0,0,0,.65),\r\n    0 0 36px rgba(83,243,255,.11);\r\n}\r\n\r\n.tc2-authChoiceEyebrow{\r\n  color:#9eefff;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.17em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-authChoiceCard h3{\r\n  margin:10px 0 0;\r\n  font-size:clamp(2rem,7vw,3.5rem);\r\n  line-height:.92;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-authChoiceCard p{\r\n  margin:15px 0 0;\r\n  color:rgba(248,251,255,.75);\r\n  line-height:1.7;\r\n}\r\n\r\n.tc2-authChoiceActions{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:11px;\r\n  margin-top:23px;\r\n}\r\n\r\n.tc2-authChoiceButton{\r\n  min-height:53px;\r\n  padding:0 18px;\r\n\r\n  border:none;\r\n  border-radius:999px;\r\n\r\n  cursor:pointer;\r\n\r\n  font-size:.74rem;\r\n  font-weight:900;\r\n  letter-spacing:.13em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.tc2-authSignIn{\r\n  color:#041119;\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      #53f3ff,\r\n      #00b8ff\r\n    );\r\n}\r\n\r\n.tc2-authRegister{\r\n  color:#fff;\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      #8b5cf6,\r\n      #cf56ff\r\n    );\r\n}\r\n\r\n.tc2-authClose{\r\n  color:#fff;\r\n  background:rgba(255,255,255,.05);\r\n  border:1px solid rgba(255,255,255,.12);\r\n}\r\n\r\n\/* Force a visible pre-verification guest state *\/\r\n#tc2Overlay.tc2-auth-checking\r\n.tc2-futureCard:not(#tc2MainAstro){\r\n  opacity:.44 !important;\r\n  filter:grayscale(.35) brightness(.55) !important;\r\n}\r\n\r\n@media(max-width:620px){\r\n  #tc2AuthButton{\r\n    top:74px;\r\n    right:18px;\r\n    min-height:43px;\r\n    padding:0 13px;\r\n    font-size:.62rem;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const TC_AUTH_AJAX =\r\n    \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\n  const TC_AUTH_ACTION =\r\n    \"ggg_get_current_user_vault_levels\";\r\n\r\n  const TC_AUTH_GUEST_LEVELS = {\r\n    1:true,\r\n    2:false,\r\n    3:false,\r\n    4:false,\r\n    5:false,\r\n    6:false,\r\n    7:false,\r\n    8:false\r\n  };\r\n\r\n  let tcAuthState = {\r\n    ready:false,\r\n    loggedIn:false,\r\n    userId:0,\r\n    displayName:\"\",\r\n    owned:Object.assign(\r\n      {},\r\n      TC_AUTH_GUEST_LEVELS\r\n    ),\r\n\r\n    urls:{\r\n      login:\"\/GGG\/login\/\",\r\n      register:\"\/GGG\/register\/\",\r\n      account:\"\/GGG\/account\/\"\r\n    }\r\n  };\r\n\r\n\r\n  \/* =====================================================\r\n     HELPERS\r\n  ===================================================== *\/\r\n\r\n  function tcAuthEl(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function tcAuthInitialUrls(){\r\n    const pms =\r\n      window.gggPmsData || {};\r\n\r\n    const urls =\r\n      pms.urls || {};\r\n\r\n    return {\r\n      login:\r\n        urls.login ||\r\n        \"\/GGG\/login\/\",\r\n\r\n      register:\r\n        urls.register ||\r\n        \"\/GGG\/register\/\",\r\n\r\n      account:\r\n        urls.account ||\r\n        \"\/GGG\/account\/\"\r\n    };\r\n  }\r\n\r\n  function tcAuthOpenUrl(url){\r\n    if(url){\r\n      window.location.href = url;\r\n    }\r\n  }\r\n\r\n  function tcAuthCloneGuestLevels(){\r\n    return Object.assign(\r\n      {},\r\n      TC_AUTH_GUEST_LEVELS\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     INSTALL AUTH BUTTON\r\n  ===================================================== *\/\r\n\r\n  function tcAuthInstallButton(){\r\n    if(tcAuthEl(\"tc2AuthButton\")){\r\n      return;\r\n    }\r\n\r\n    const button =\r\n      document.createElement(\"button\");\r\n\r\n    button.id =\r\n      \"tc2AuthButton\";\r\n\r\n    button.type =\r\n      \"button\";\r\n\r\n    button.innerHTML = `\r\n      <span id=\"tc2AuthDot\"><\/span>\r\n      <span id=\"tc2AuthButtonText\">\r\n        Sign In \/ Join\r\n      <\/span>\r\n    `;\r\n\r\n    document.body.appendChild(button);\r\n\r\n    button.addEventListener(\r\n      \"click\",\r\n      function(){\r\n        if(tcAuthState.loggedIn){\r\n          tcAuthOpenUrl(\r\n            tcAuthState.urls.account\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        tcAuthOpenChoice();\r\n      }\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     INSTALL SIGN IN \/ CREATE ACCOUNT MODAL\r\n  ===================================================== *\/\r\n\r\n  function tcAuthInstallModal(){\r\n    if(tcAuthEl(\"tc2AuthChoiceModal\")){\r\n      return;\r\n    }\r\n\r\n    const modal =\r\n      document.createElement(\"div\");\r\n\r\n    modal.id =\r\n      \"tc2AuthChoiceModal\";\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n\r\n    modal.innerHTML = `\r\n      <div class=\"tc2-authChoiceCard\">\r\n\r\n        <div class=\"tc2-authChoiceEyebrow\">\r\n          Bliss Travel Club\r\n        <\/div>\r\n\r\n        <h3>\r\n          Welcome\r\n        <\/h3>\r\n\r\n        <p>\r\n          Sign in to restore your membership,\r\n          Travel Intelligence profile, Journey,\r\n          favorites, services, and recommendations.\r\n          Create an account if this is your first visit.\r\n        <\/p>\r\n\r\n        <div class=\"tc2-authChoiceActions\">\r\n\r\n          <button\r\n            id=\"tc2AuthSignIn\"\r\n            class=\"tc2-authChoiceButton tc2-authSignIn\"\r\n            type=\"button\">\r\n            Sign In\r\n          <\/button>\r\n\r\n          <button\r\n            id=\"tc2AuthRegister\"\r\n            class=\"tc2-authChoiceButton tc2-authRegister\"\r\n            type=\"button\">\r\n            Create Account\r\n          <\/button>\r\n\r\n          <button\r\n            id=\"tc2AuthChoiceClose\"\r\n            class=\"tc2-authChoiceButton tc2-authClose\"\r\n            type=\"button\">\r\n            Continue As Guest\r\n          <\/button>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    document.body.appendChild(modal);\r\n\r\n    tcAuthEl(\"tc2AuthSignIn\")\r\n      .addEventListener(\r\n        \"click\",\r\n        function(){\r\n          tcAuthOpenUrl(\r\n            tcAuthState.urls.login\r\n          );\r\n        }\r\n      );\r\n\r\n    tcAuthEl(\"tc2AuthRegister\")\r\n      .addEventListener(\r\n        \"click\",\r\n        function(){\r\n          tcAuthOpenUrl(\r\n            tcAuthState.urls.register\r\n          );\r\n        }\r\n      );\r\n\r\n    tcAuthEl(\"tc2AuthChoiceClose\")\r\n      .addEventListener(\r\n        \"click\",\r\n        tcAuthCloseChoice\r\n      );\r\n\r\n    modal.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n        if(event.target === modal){\r\n          tcAuthCloseChoice();\r\n        }\r\n      }\r\n    );\r\n  }\r\n\r\n  function tcAuthOpenChoice(){\r\n    tcAuthInstallModal();\r\n\r\n    const modal =\r\n      tcAuthEl(\"tc2AuthChoiceModal\");\r\n\r\n    if(!modal){\r\n      return;\r\n    }\r\n\r\n    modal.classList.add(\"open\");\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n  }\r\n\r\n  function tcAuthCloseChoice(){\r\n    const modal =\r\n      tcAuthEl(\"tc2AuthChoiceModal\");\r\n\r\n    if(!modal){\r\n      return;\r\n    }\r\n\r\n    modal.classList.remove(\"open\");\r\n\r\n    modal.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     FORCE GUEST APPEARANCE IMMEDIATELY\r\n\r\n     This runs before the account request finishes.\r\n  ===================================================== *\/\r\n\r\n  function tcAuthForceGuestVisuals(){\r\n    const overlay =\r\n      tcAuthEl(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      overlay.classList.add(\r\n        \"tc2-auth-checking\"\r\n      );\r\n    }\r\n\r\n    const guestCards = [\r\n      {\r\n        id:\"tc2MainExplore\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainBrain\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainJourney\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainServices\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainStory\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainEvolution\",\r\n        level:4\r\n      }\r\n    ];\r\n\r\n    guestCards.forEach(\r\n      function(item){\r\n        const card =\r\n          tcAuthEl(item.id);\r\n\r\n        if(!card){\r\n          return;\r\n        }\r\n\r\n        card.classList.remove(\r\n          \"is-on\",\r\n          \"tc2-vault-unlocked\"\r\n        );\r\n\r\n        card.classList.add(\r\n          \"is-locked\",\r\n          \"tc2-vault-locked\"\r\n        );\r\n\r\n        card.dataset.vaultLevel =\r\n          String(item.level);\r\n\r\n        card.setAttribute(\r\n          \"aria-disabled\",\r\n          \"true\"\r\n        );\r\n\r\n        const status =\r\n          card.querySelector(\r\n            \".tc2-status\"\r\n          );\r\n\r\n        if(status){\r\n          status.textContent =\r\n            \"LEVEL \" +\r\n            item.level +\r\n            \" \ud83d\udd12\";\r\n        }\r\n      }\r\n    );\r\n\r\n    const astro =\r\n      tcAuthEl(\"tc2MainAstro\");\r\n\r\n    if(astro){\r\n      astro.classList.add(\r\n        \"is-on\",\r\n        \"tc2-vault-unlocked\"\r\n      );\r\n\r\n      astro.classList.remove(\r\n        \"is-locked\",\r\n        \"tc2-vault-locked\"\r\n      );\r\n\r\n      astro.setAttribute(\r\n        \"aria-disabled\",\r\n        \"false\"\r\n      );\r\n\r\n      const status =\r\n        astro.querySelector(\r\n          \".tc2-status\"\r\n        );\r\n\r\n      if(status){\r\n        status.textContent =\r\n          \"FREE \u00b7 ONLINE\";\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     UPDATE AUTH BUTTON\r\n  ===================================================== *\/\r\n\r\n  function tcAuthRenderButton(){\r\n    tcAuthInstallButton();\r\n\r\n    const button =\r\n      tcAuthEl(\"tc2AuthButton\");\r\n\r\n    const text =\r\n      tcAuthEl(\r\n        \"tc2AuthButtonText\"\r\n      );\r\n\r\n    if(!button || !text){\r\n      return;\r\n    }\r\n\r\n    if(tcAuthState.loggedIn){\r\n      button.classList.add(\r\n        \"tc2-auth-member\"\r\n      );\r\n\r\n      text.textContent =\r\n        tcAuthState.displayName\r\n          ? \"My Account\"\r\n          : \"My Account\";\r\n\r\n      button.title =\r\n        tcAuthState.displayName\r\n          ? \"Signed in as \" +\r\n            tcAuthState.displayName\r\n          : \"Open My Account\";\r\n    }else{\r\n      button.classList.remove(\r\n        \"tc2-auth-member\"\r\n      );\r\n\r\n      text.textContent =\r\n        \"Sign In \/ Join\";\r\n\r\n      button.title =\r\n        \"Sign in or create an account\";\r\n    }\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     APPLY MEMBERSHIP STATE\r\n\r\n     Uses the existing membership gate when available.\r\n  ===================================================== *\/\r\n\r\n  function tcAuthApplyMembership(){\r\n    const overlay =\r\n      tcAuthEl(\"tc2Overlay\");\r\n\r\n    if(overlay){\r\n      overlay.classList.remove(\r\n        \"tc2-auth-checking\"\r\n      );\r\n    }\r\n\r\n    window.gggPmsData =\r\n      window.gggPmsData || {};\r\n\r\n    window.gggPmsData.loggedIn =\r\n      tcAuthState.loggedIn;\r\n\r\n    window.gggPmsData.userId =\r\n      tcAuthState.userId;\r\n\r\n    window.gggPmsData.displayName =\r\n      tcAuthState.displayName;\r\n\r\n    window.gggPmsData.owned =\r\n      tcAuthState.owned;\r\n\r\n    window.gggPmsData.urls =\r\n      tcAuthState.urls;\r\n\r\n    \/*\r\n      Ask the existing Vault membership gate to reload\r\n      and apply its complete visual\/access rules.\r\n    *\/\r\n    if(\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership\r\n        .reload === \"function\"\r\n    ){\r\n      window.BlissTravelMembership\r\n        .reload();\r\n\r\n      return;\r\n    }\r\n\r\n    \/*\r\n      Fallback when the previous membership patch\r\n      did not initialize.\r\n    *\/\r\n    tcAuthApplyFallbackCards();\r\n  }\r\n\r\n  function tcAuthApplyFallbackCards(){\r\n    const map = [\r\n      {\r\n        id:\"tc2MainAstro\",\r\n        level:1\r\n      },\r\n      {\r\n        id:\"tc2MainExplore\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainBrain\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainJourney\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainServices\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainStory\",\r\n        level:2\r\n      },\r\n      {\r\n        id:\"tc2MainEvolution\",\r\n        level:4\r\n      }\r\n    ];\r\n\r\n    map.forEach(function(item){\r\n      const card =\r\n        tcAuthEl(item.id);\r\n\r\n      if(!card){\r\n        return;\r\n      }\r\n\r\n      const unlocked =\r\n        item.level === 1 ||\r\n        Boolean(\r\n          tcAuthState.loggedIn &&\r\n          tcAuthState.owned[\r\n            item.level\r\n          ]\r\n        );\r\n\r\n      card.classList.toggle(\r\n        \"is-on\",\r\n        unlocked\r\n      );\r\n\r\n      card.classList.toggle(\r\n        \"is-locked\",\r\n        !unlocked\r\n      );\r\n\r\n      card.classList.toggle(\r\n        \"tc2-vault-unlocked\",\r\n        unlocked\r\n      );\r\n\r\n      card.classList.toggle(\r\n        \"tc2-vault-locked\",\r\n        !unlocked\r\n      );\r\n\r\n      card.setAttribute(\r\n        \"aria-disabled\",\r\n        unlocked\r\n          ? \"false\"\r\n          : \"true\"\r\n      );\r\n\r\n      const status =\r\n        card.querySelector(\r\n          \".tc2-status\"\r\n        );\r\n\r\n      if(status){\r\n        status.textContent =\r\n          unlocked\r\n            ? (\r\n                item.level === 1\r\n                  ? \"FREE \u00b7 ONLINE\"\r\n                  : \"LEVEL \" +\r\n                    item.level +\r\n                    \" \u00b7 ACTIVE\"\r\n              )\r\n            : \"LEVEL \" +\r\n              item.level +\r\n              \" \ud83d\udd12\";\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOAD REAL SIGN-IN STATE\r\n  ===================================================== *\/\r\n\r\n  function tcAuthLoad(){\r\n    const initialUrls =\r\n      tcAuthInitialUrls();\r\n\r\n    tcAuthState.urls =\r\n      initialUrls;\r\n\r\n    \/*\r\n      Always assume guest until WordPress confirms\r\n      the current signed-in user.\r\n    *\/\r\n    tcAuthState.loggedIn = false;\r\n    tcAuthState.userId = 0;\r\n    tcAuthState.displayName = \"\";\r\n    tcAuthState.owned =\r\n      tcAuthCloneGuestLevels();\r\n\r\n    tcAuthForceGuestVisuals();\r\n    tcAuthRenderButton();\r\n\r\n    return window.BlissMembershipRequest.load(\r\n  TC_AUTH_AJAX,\r\n  TC_AUTH_ACTION\r\n)\r\n    .then(function(result){\r\n      if(\r\n        !result ||\r\n        !result.success ||\r\n        !result.data\r\n      ){\r\n        throw new Error(\r\n          \"The account status could not be verified.\"\r\n        );\r\n      }\r\n\r\n      const data =\r\n        result.data;\r\n\r\n      tcAuthState.loggedIn =\r\n        Boolean(data.logged_in);\r\n\r\n      tcAuthState.userId =\r\n        tcAuthState.loggedIn\r\n          ? Number(\r\n              data.user_id || 0\r\n            )\r\n          : 0;\r\n\r\n      tcAuthState.displayName =\r\n        tcAuthState.loggedIn\r\n          ? String(\r\n              data.display_name || \"\"\r\n            )\r\n          : \"\";\r\n\r\n      tcAuthState.owned =\r\n        tcAuthState.loggedIn\r\n          ? Object.assign(\r\n              tcAuthCloneGuestLevels(),\r\n              data.owned || {}\r\n            )\r\n          : tcAuthCloneGuestLevels();\r\n\r\n      tcAuthState.urls = {\r\n        login:\r\n          data.login_url ||\r\n          initialUrls.login,\r\n\r\n        register:\r\n          data.register_url ||\r\n          initialUrls.register,\r\n\r\n        account:\r\n          data.account_url ||\r\n          initialUrls.account\r\n      };\r\n\r\n      tcAuthState.ready = true;\r\n\r\n      tcAuthRenderButton();\r\n      tcAuthApplyMembership();\r\n\r\n      try{\r\n        window.dispatchEvent(\r\n          new CustomEvent(\r\n            \"blissAuthStateLoaded\",\r\n            {\r\n              detail:{\r\n                loggedIn:\r\n                  tcAuthState.loggedIn,\r\n\r\n                userId:\r\n                  tcAuthState.userId,\r\n\r\n                displayName:\r\n                  tcAuthState.displayName,\r\n\r\n                owned:\r\n                  tcAuthState.owned,\r\n\r\n                urls:\r\n                  tcAuthState.urls\r\n              }\r\n            }\r\n          )\r\n        );\r\n      }catch(error){}\r\n\r\n      return tcAuthState;\r\n    })\r\n    .catch(function(error){\r\n      console.warn(\r\n        \"[Bliss Travel Club Auth]\",\r\n        error\r\n      );\r\n\r\n      \/*\r\n        Safe fallback:\r\n        remain logged out with Astro only.\r\n      *\/\r\n      tcAuthState.ready = true;\r\n      tcAuthState.loggedIn = false;\r\n      tcAuthState.userId = 0;\r\n      tcAuthState.displayName = \"\";\r\n      tcAuthState.owned =\r\n        tcAuthCloneGuestLevels();\r\n\r\n      tcAuthRenderButton();\r\n      tcAuthApplyFallbackCards();\r\n\r\n      const overlay =\r\n        tcAuthEl(\"tc2Overlay\");\r\n\r\n      if(overlay){\r\n        overlay.classList.remove(\r\n          \"tc2-auth-checking\"\r\n        );\r\n      }\r\n\r\n      return tcAuthState;\r\n    });\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     BLOCK LOCKED CARDS EVEN IF OLD HANDLERS RUN\r\n  ===================================================== *\/\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      const card =\r\n        event.target.closest(\r\n          \"#tc2MainExplore,\" +\r\n          \"#tc2MainBrain,\" +\r\n          \"#tc2MainJourney,\" +\r\n          \"#tc2MainServices,\" +\r\n          \"#tc2MainStory,\" +\r\n          \"#tc2MainEvolution\"\r\n        );\r\n\r\n      if(!card){\r\n        return;\r\n      }\r\n\r\n      const requiredLevel =\r\n        Number(\r\n          card.dataset.vaultLevel ||\r\n          (\r\n            card.id ===\r\n            \"tc2MainEvolution\"\r\n              ? 4\r\n              : 2\r\n          )\r\n        );\r\n\r\n      const unlocked =\r\n        Boolean(\r\n          tcAuthState.loggedIn &&\r\n          tcAuthState.owned[\r\n            requiredLevel\r\n          ]\r\n        );\r\n\r\n      if(unlocked){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      event.stopImmediatePropagation();\r\n\r\n      if(\r\n        window.BlissTravelMembership &&\r\n        typeof window.BlissTravelMembership\r\n          .requireLevel === \"function\"\r\n      ){\r\n        const heading =\r\n          card.querySelector(\"h3\");\r\n\r\n        window.BlissTravelMembership\r\n          .requireLevel(\r\n            requiredLevel,\r\n            heading\r\n              ? heading.textContent.trim()\r\n              : \"Membership Feature\"\r\n          );\r\n\r\n        return;\r\n      }\r\n\r\n      if(!tcAuthState.loggedIn){\r\n        tcAuthOpenChoice();\r\n      }else{\r\n        tcAuthOpenUrl(\r\n          tcAuthState.urls.account\r\n        );\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     RECHECK WHEN TRAVEL CLUB OPENS\r\n  ===================================================== *\/\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      const travelClubTrigger =\r\n        event.target.closest(\r\n          '[data-band=\"travel\"],' +\r\n          '[data-key=\"travel\"],' +\r\n          '[data-open-travel-club],' +\r\n          '#tc2ProjectorButton,' +\r\n          '.blissActivate'\r\n        );\r\n\r\n      if(!travelClubTrigger){\r\n        return;\r\n      }\r\n\r\n      setTimeout(\r\n        tcAuthLoad,\r\n        250\r\n      );\r\n    },\r\n    false\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     PUBLIC API\r\n  ===================================================== *\/\r\n\r\n  window.BlissTravelAuth = {\r\n    reload:tcAuthLoad,\r\n\r\n    isLoggedIn:function(){\r\n      return Boolean(\r\n        tcAuthState.loggedIn\r\n      );\r\n    },\r\n\r\n    getState:function(){\r\n      return JSON.parse(\r\n        JSON.stringify(\r\n          tcAuthState\r\n        )\r\n      );\r\n    },\r\n\r\n    open:\r\n      tcAuthOpenChoice\r\n  };\r\n\r\n\r\n  \/* =====================================================\r\n     INITIALIZE\r\n  ===================================================== *\/\r\n\r\n  function tcAuthInitialize(){\r\n    const overlay =\r\n      tcAuthEl(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      setTimeout(\r\n        tcAuthInitialize,\r\n        300\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    tcAuthInstallButton();\r\n    tcAuthInstallModal();\r\n\r\n    \/*\r\n      Lock everything except Astro immediately.\r\n    *\/\r\n    tcAuthForceGuestVisuals();\r\n\r\n    \/*\r\n      Then ask WordPress who is signed in.\r\n    *\/\r\n    tcAuthLoad();\r\n\r\n    console.log(\r\n      \"[Bliss Travel Club] Sign-in and account state connected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      tcAuthInitialize\r\n    );\r\n  }else{\r\n    tcAuthInitialize();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nAUTH VISIBILITY + JOURNEY ACCESS REPAIR V2\r\n\r\nFIXES:\r\n1. Keeps authentication controls inside #tc2Overlay.\r\n2. Reads Level 2 from multiple membership-state formats.\r\n3. Does not permanently force My Journey into guest mode.\r\n4. Reapplies access whenever membership\/authentication changes.\r\n5. Uses the same access check for the card, floating button,\r\n   Save button, and Send button.\r\n========================================================= -->\r\n\r\n<style>\r\nbody.tc2Hide #tc2AuthButton,\r\nbody.tc2Hide #tc2AuthButton *,\r\nbody.tc2Hide #tc2AuthChoiceModal,\r\nbody.tc2Hide #tc2AuthChoiceModal *{\r\n  visibility:visible !important;\r\n}\r\n\r\n\/* Locked Journey card *\/\r\n#tc2Overlay #tc2MainJourney.tc2-vault-locked,\r\n#tc2Overlay #tc2MainJourney.is-locked{\r\n  opacity:.45 !important;\r\n  filter:grayscale(.45) brightness(.50) saturate(.55) !important;\r\n  cursor:not-allowed !important;\r\n  transform:none !important;\r\n}\r\n\r\n\/* Unlocked Journey card *\/\r\n#tc2Overlay #tc2MainJourney.tc2-vault-unlocked,\r\n#tc2Overlay #tc2MainJourney.is-on{\r\n  opacity:1 !important;\r\n  filter:none !important;\r\n  cursor:pointer !important;\r\n  pointer-events:auto !important;\r\n}\r\n\r\n\/* Locked floating Journey button *\/\r\n#tc2Overlay #tc2FloatJourney.tc2-vault-locked,\r\n#tc2Overlay #tc2FloatJourney[aria-disabled=\"true\"]{\r\n  opacity:.35 !important;\r\n  filter:grayscale(1) brightness(.55) !important;\r\n  cursor:not-allowed !important;\r\n}\r\n\r\n\/* Unlocked floating Journey button *\/\r\n#tc2Overlay #tc2FloatJourney.tc2-vault-unlocked,\r\n#tc2Overlay #tc2FloatJourney[aria-disabled=\"false\"]{\r\n  opacity:1 !important;\r\n  filter:none !important;\r\n  cursor:pointer !important;\r\n  pointer-events:auto !important;\r\n}\r\n\r\n\/* Unlocked Journey actions *\/\r\n#tc2Overlay #tc2SavePlanBtn.tc2-vault-unlocked,\r\n#tc2Overlay #tc2SendPlanBtn.tc2-vault-unlocked{\r\n  opacity:1 !important;\r\n  filter:none !important;\r\n  cursor:pointer !important;\r\n  pointer-events:auto !important;\r\n}\r\n\r\n#tc2Overlay #tc2AuthButton,\r\n#tc2Overlay #tc2AuthChoiceModal{\r\n  z-index:2147483647 !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const JOURNEY_LEVEL = 2;\r\n\r\n  let latestMembershipState = null;\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function moveAuthInsideTravelClub(){\r\n    const overlay = byId(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      return false;\r\n    }\r\n\r\n    const authButton = byId(\"tc2AuthButton\");\r\n    const authModal = byId(\"tc2AuthChoiceModal\");\r\n\r\n    if(\r\n      authButton &&\r\n      authButton.parentElement !== overlay\r\n    ){\r\n      overlay.appendChild(authButton);\r\n    }\r\n\r\n    if(\r\n      authModal &&\r\n      authModal.parentElement !== overlay\r\n    ){\r\n      overlay.appendChild(authModal);\r\n    }\r\n\r\n    return Boolean(authButton || authModal);\r\n  }\r\n\r\n  \/*\r\n   * Reads whether a particular level is active from several\r\n   * possible membership formats.\r\n   *\/\r\n  function stateOwnsLevel(state, level){\r\n    if(!state){\r\n      return false;\r\n    }\r\n\r\n    \/*\r\n     * First use the official membership function when available.\r\n     *\/\r\n    if(\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership.hasLevel === \"function\"\r\n    ){\r\n      try{\r\n        if(\r\n          window.BlissTravelMembership.hasLevel(level) === true\r\n        ){\r\n          return true;\r\n        }\r\n      }catch(error){\r\n        console.warn(\r\n          \"[Bliss Travel Club] hasLevel check failed:\",\r\n          error\r\n        );\r\n      }\r\n    }\r\n\r\n    const owned =\r\n      state.owned ||\r\n      state.levels ||\r\n      state.membershipLevels ||\r\n      state.access ||\r\n      {};\r\n\r\n    \/*\r\n     * Object format:\r\n     * owned: {2:true}\r\n     *\/\r\n    if(\r\n      owned[level] === true ||\r\n      owned[String(level)] === true ||\r\n      owned[level] === 1 ||\r\n      owned[String(level)] === 1 ||\r\n      owned[level] === \"1\" ||\r\n      owned[String(level)] === \"1\"\r\n    ){\r\n      return true;\r\n    }\r\n\r\n    \/*\r\n     * Array format:\r\n     * levels: [1,2,3]\r\n     *\/\r\n    if(Array.isArray(owned)){\r\n      return owned.some(function(item){\r\n        if(typeof item === \"number\"){\r\n          return item === level;\r\n        }\r\n\r\n        if(typeof item === \"string\"){\r\n          return Number(item) === level;\r\n        }\r\n\r\n        if(item && typeof item === \"object\"){\r\n          return (\r\n            Number(\r\n              item.level ||\r\n              item.id ||\r\n              item.number\r\n            ) === level &&\r\n            item.active !== false &&\r\n            item.owned !== false\r\n          );\r\n        }\r\n\r\n        return false;\r\n      });\r\n    }\r\n\r\n    \/*\r\n     * Single highest-level format:\r\n     * level: 2\r\n     * membershipLevel: 2\r\n     *\r\n     * This assumes higher Travel Club levels include lower ones.\r\n     *\/\r\n    const highestLevel = Number(\r\n      state.level ||\r\n      state.membershipLevel ||\r\n      state.highestLevel ||\r\n      state.currentLevel ||\r\n      0\r\n    );\r\n\r\n    if(highestLevel >= level){\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  function getMembershipState(){\r\n    let state = latestMembershipState;\r\n\r\n    if(\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership.getState === \"function\"\r\n    ){\r\n      try{\r\n        const officialState =\r\n          window.BlissTravelMembership.getState();\r\n\r\n        if(officialState){\r\n          state = {\r\n            ...(state || {}),\r\n            ...officialState,\r\n\r\n            owned:\r\n              officialState.owned ||\r\n              (\r\n                state &&\r\n                state.owned\r\n              ) ||\r\n              {}\r\n          };\r\n        }\r\n      }catch(error){\r\n        console.warn(\r\n          \"[Bliss Travel Club] Could not read membership state:\",\r\n          error\r\n        );\r\n      }\r\n    }\r\n\r\n    return state || {};\r\n  }\r\n\r\n  function hasJourneyAccess(state){\r\n    const finalState =\r\n      state ||\r\n      getMembershipState();\r\n\r\n    \/*\r\n     * Do not depend only on loggedIn.\r\n     * The official hasLevel function or owned-level data\r\n     * is the source of truth for access.\r\n     *\/\r\n    return stateOwnsLevel(\r\n      finalState,\r\n      JOURNEY_LEVEL\r\n    );\r\n  }\r\n\r\n  function setLockedState(\r\n    element,\r\n    locked,\r\n    level\r\n  ){\r\n    if(!element){\r\n      return;\r\n    }\r\n\r\n    element.classList.toggle(\r\n      \"is-on\",\r\n      !locked\r\n    );\r\n\r\n    element.classList.toggle(\r\n      \"is-locked\",\r\n      locked\r\n    );\r\n\r\n    element.classList.toggle(\r\n      \"tc2-vault-unlocked\",\r\n      !locked\r\n    );\r\n\r\n    element.classList.toggle(\r\n      \"tc2-vault-locked\",\r\n      locked\r\n    );\r\n\r\n    element.dataset.vaultLevel =\r\n      String(level);\r\n\r\n    element.setAttribute(\r\n      \"aria-disabled\",\r\n      locked ? \"true\" : \"false\"\r\n    );\r\n\r\n    \/*\r\n     * Prevent older patches from leaving controls disabled.\r\n     *\/\r\n    if(\"disabled\" in element){\r\n      element.disabled = locked;\r\n    }\r\n\r\n    if(locked){\r\n      element.setAttribute(\r\n        \"tabindex\",\r\n        \"-1\"\r\n      );\r\n    }else{\r\n      element.removeAttribute(\r\n        \"tabindex\"\r\n      );\r\n\r\n      element.style.removeProperty(\r\n        \"pointer-events\"\r\n      );\r\n\r\n      element.style.removeProperty(\r\n        \"opacity\"\r\n      );\r\n\r\n      element.style.removeProperty(\r\n        \"filter\"\r\n      );\r\n    }\r\n  }\r\n\r\n  function updateStatus(\r\n    card,\r\n    unlocked,\r\n    level\r\n  ){\r\n    if(!card){\r\n      return;\r\n    }\r\n\r\n    const status =\r\n      card.querySelector(\".tc2-status\");\r\n\r\n    if(status){\r\n      status.textContent =\r\n        unlocked\r\n          ? \"LEVEL \" + level + \" \u00b7 ACTIVE\"\r\n          : \"LEVEL \" + level + \" \ud83d\udd12\";\r\n    }\r\n\r\n    card\r\n      .querySelectorAll(\r\n        \".tc2-vault-lockBadge\"\r\n      )\r\n      .forEach(function(badge){\r\n        badge.remove();\r\n      });\r\n\r\n    if(!unlocked){\r\n      const badge =\r\n        document.createElement(\"div\");\r\n\r\n      badge.className =\r\n        \"tc2-vault-lockBadge\";\r\n\r\n      badge.textContent =\r\n        \"Level \" + level + \" \ud83d\udd12\";\r\n\r\n      card.appendChild(badge);\r\n    }\r\n  }\r\n\r\n  function applyJourneyAccess(state){\r\n    if(state){\r\n      latestMembershipState = {\r\n        ...(latestMembershipState || {}),\r\n        ...state,\r\n\r\n        owned:\r\n          state.owned ||\r\n          (\r\n            latestMembershipState &&\r\n            latestMembershipState.owned\r\n          ) ||\r\n          {}\r\n      };\r\n    }\r\n\r\n    const finalState =\r\n      getMembershipState();\r\n\r\n    const unlocked =\r\n      hasJourneyAccess(finalState);\r\n\r\n    const journeyCard =\r\n      byId(\"tc2MainJourney\");\r\n\r\n    const floatingJourney =\r\n      byId(\"tc2FloatJourney\");\r\n\r\n    const saveJourney =\r\n      byId(\"tc2SavePlanBtn\");\r\n\r\n    const sendJourney =\r\n      byId(\"tc2SendPlanBtn\");\r\n\r\n    setLockedState(\r\n      journeyCard,\r\n      !unlocked,\r\n      JOURNEY_LEVEL\r\n    );\r\n\r\n    setLockedState(\r\n      floatingJourney,\r\n      !unlocked,\r\n      JOURNEY_LEVEL\r\n    );\r\n\r\n    setLockedState(\r\n      saveJourney,\r\n      !unlocked,\r\n      JOURNEY_LEVEL\r\n    );\r\n\r\n    setLockedState(\r\n      sendJourney,\r\n      !unlocked,\r\n      JOURNEY_LEVEL\r\n    );\r\n\r\n    updateStatus(\r\n      journeyCard,\r\n      unlocked,\r\n      JOURNEY_LEVEL\r\n    );\r\n\r\n    console.log(\r\n      \"[Bliss Travel Club] My Journey access:\",\r\n      {\r\n        unlocked:unlocked,\r\n        membershipState:finalState\r\n      }\r\n    );\r\n\r\n    return unlocked;\r\n  }\r\n\r\n  \/*\r\n   * Block Journey only when Level 2 is genuinely unavailable.\r\n   *\/\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      const target =\r\n        event.target instanceof Element\r\n          ? event.target\r\n          : null;\r\n\r\n      if(!target){\r\n        return;\r\n      }\r\n\r\n      const journeyControl =\r\n        target.closest(\r\n          \"#tc2MainJourney,\" +\r\n          \"#tc2FloatJourney,\" +\r\n          \"#tc2SavePlanBtn,\" +\r\n          \"#tc2SendPlanBtn\"\r\n        );\r\n\r\n      if(!journeyControl){\r\n        return;\r\n      }\r\n\r\n      const unlocked =\r\n        applyJourneyAccess();\r\n\r\n      if(unlocked){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      event.stopImmediatePropagation();\r\n\r\n      if(\r\n        window.BlissTravelMembership &&\r\n        typeof window.BlissTravelMembership.requireLevel === \"function\"\r\n      ){\r\n        window.BlissTravelMembership.requireLevel(\r\n          JOURNEY_LEVEL,\r\n          \"My Journey\"\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      if(\r\n        window.BlissTravelAuth &&\r\n        typeof window.BlissTravelAuth.open === \"function\"\r\n      ){\r\n        window.BlissTravelAuth.open();\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n  window.addEventListener(\r\n    \"blissMembershipLoaded\",\r\n    function(event){\r\n      moveAuthInsideTravelClub();\r\n\r\n      applyJourneyAccess(\r\n        event && event.detail\r\n          ? event.detail\r\n          : null\r\n      );\r\n    }\r\n  );\r\n\r\n  window.addEventListener(\r\n    \"blissAuthStateLoaded\",\r\n    function(event){\r\n      moveAuthInsideTravelClub();\r\n\r\n      const detail =\r\n        event && event.detail\r\n          ? event.detail\r\n          : {};\r\n\r\n      \/*\r\n       * Preserve previously loaded ownership information.\r\n       * Authentication events sometimes contain only loggedIn.\r\n       *\/\r\n      applyJourneyAccess({\r\n        ...detail,\r\n\r\n        owned:\r\n          detail.owned ||\r\n          (\r\n            latestMembershipState &&\r\n            latestMembershipState.owned\r\n          ) ||\r\n          undefined\r\n      });\r\n    }\r\n  );\r\n\r\n  \/*\r\n   * Support additional events that older\/newer membership\r\n   * patches may use.\r\n   *\/\r\n  [\r\n    \"blissMembershipChanged\",\r\n    \"blissLevelChanged\",\r\n    \"blissLoginSuccess\",\r\n    \"blissLogout\"\r\n  ].forEach(function(eventName){\r\n    window.addEventListener(\r\n      eventName,\r\n      function(event){\r\n        moveAuthInsideTravelClub();\r\n\r\n        applyJourneyAccess(\r\n          event && event.detail\r\n            ? event.detail\r\n            : null\r\n        );\r\n      }\r\n    );\r\n  });\r\n\r\n  function initializeRepair(){\r\n    const overlay =\r\n      byId(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      setTimeout(\r\n        initializeRepair,\r\n        250\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    let attempts = 0;\r\n\r\n    const authTimer =\r\n      setInterval(function(){\r\n        attempts += 1;\r\n\r\n        moveAuthInsideTravelClub();\r\n\r\n        if(attempts >= 30){\r\n          clearInterval(authTimer);\r\n        }\r\n      },150);\r\n\r\n    \/*\r\n     * Important:\r\n     * Do not inject a fake logged-out Level 2 state here.\r\n     * Read the actual membership state instead.\r\n     *\/\r\n    applyJourneyAccess();\r\n\r\n    [\r\n      300,\r\n      800,\r\n      1500,\r\n      2800,\r\n      5000\r\n    ].forEach(function(delay){\r\n      setTimeout(function(){\r\n        moveAuthInsideTravelClub();\r\n        applyJourneyAccess();\r\n      },delay);\r\n    });\r\n\r\n    console.log(\r\n      \"[Bliss Travel Club] Journey access repair V2 initialized.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      initializeRepair\r\n    );\r\n  }else{\r\n    initializeRepair();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nACCOUNT BUTTON BESIDE MENU \u2014 MOBILE FINAL FIX\r\n\r\nKeeps the existing sign-in and Vault connection.\r\nOnly corrects the mobile position and size.\r\n========================================================= -->\r\n\r\n<style>\r\n@media screen and (max-width:760px){\r\n\r\n  html body #tc2Overlay #tc2AuthButton{\r\n    position:fixed !important;\r\n\r\n    \/* Same row as the three-line menu *\/\r\n    top:18px !important;\r\n    right:78px !important;\r\n\r\n    left:auto !important;\r\n    bottom:auto !important;\r\n\r\n    \/*\r\n     * Menu begins at right:18px and is 48px wide.\r\n     * The account button ends at right:78px,\r\n     * leaving a 12px space between them.\r\n     *\/\r\n    width:auto !important;\r\n    min-width:0 !important;\r\n    max-width:190px !important;\r\n    min-height:48px !important;\r\n    height:48px !important;\r\n\r\n    padding:0 14px !important;\r\n    margin:0 !important;\r\n\r\n    display:inline-flex !important;\r\n    align-items:center !important;\r\n    justify-content:center !important;\r\n    gap:8px !important;\r\n\r\n    border-radius:999px !important;\r\n\r\n    font-size:10px !important;\r\n    line-height:1 !important;\r\n    letter-spacing:.08em !important;\r\n    white-space:nowrap !important;\r\n\r\n    visibility:visible !important;\r\n    opacity:1 !important;\r\n\r\n    transform:none !important;\r\n    z-index:2147483647 !important;\r\n  }\r\n\r\n  html body #tc2Overlay #tc2AuthButtonText{\r\n    display:block !important;\r\n    min-width:0 !important;\r\n    max-width:145px !important;\r\n\r\n    overflow:hidden !important;\r\n    white-space:nowrap !important;\r\n    text-overflow:ellipsis !important;\r\n  }\r\n\r\n  html body #tc2Overlay #tc2AuthDot{\r\n    flex:0 0 8px !important;\r\n  }\r\n\r\n  \/*\r\n   * Keep the hamburger exactly where it already belongs.\r\n   *\/\r\n  html body #tc2Overlay #tc2MenuBtn{\r\n    position:fixed !important;\r\n    top:18px !important;\r\n    right:18px !important;\r\n\r\n    width:48px !important;\r\n    height:48px !important;\r\n\r\n    z-index:2147483647 !important;\r\n  }\r\n\r\n  \/*\r\n   * The opened menu remains underneath the top controls.\r\n   *\/\r\n  html body #tc2Overlay #tc2MenuPanel{\r\n    top:76px !important;\r\n    right:18px !important;\r\n  }\r\n}\r\n\r\n\/*\r\n * Slightly smaller account button on very narrow phones,\r\n * but it stays beside\u2014not underneath\u2014the menu.\r\n *\/\r\n@media screen and (max-width:390px){\r\n\r\n  html body #tc2Overlay #tc2AuthButton{\r\n    right:74px !important;\r\n    max-width:165px !important;\r\n    padding:0 11px !important;\r\n    font-size:9px !important;\r\n    letter-spacing:.06em !important;\r\n  }\r\n\r\n  html body #tc2Overlay #tc2AuthButtonText{\r\n    max-width:124px !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n\/* =========================================================\r\n   BLISS TRAVEL CLUB\r\n   HIDDEN PAGE EMERGENCY RESTORE\r\n   ========================================================= *\/\r\n\r\n(function(){\r\n\r\n  function restoreTravelClub(){\r\n\r\n    const url =\r\n      new URL(window.location.href);\r\n\r\n    const shouldOpen =\r\n      url.searchParams.get(\"travelclub\") === \"1\";\r\n\r\n    if(!shouldOpen){\r\n      return;\r\n    }\r\n\r\n    const overlay =\r\n      document.getElementById(\"tc2Overlay\");\r\n\r\n    if(!overlay){\r\n      console.error(\r\n        \"[Travel Club Restore] #tc2Overlay was not found.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * FORCE THE HIDDEN PAGE TO APPEAR\r\n     *\/\r\n    document.documentElement.classList.add(\r\n      \"tc2-active\"\r\n    );\r\n\r\n    document.body.classList.add(\r\n      \"tc2-active\",\r\n      \"tc2Hide\"\r\n    );\r\n\r\n    document.documentElement.style.setProperty(\r\n      \"overflow\",\r\n      \"hidden\",\r\n      \"important\"\r\n    );\r\n\r\n    document.body.style.setProperty(\r\n      \"overflow\",\r\n      \"hidden\",\r\n      \"important\"\r\n    );\r\n\r\n    overlay.style.setProperty(\r\n      \"display\",\r\n      \"block\",\r\n      \"important\"\r\n    );\r\n\r\n    overlay.style.setProperty(\r\n      \"visibility\",\r\n      \"visible\",\r\n      \"important\"\r\n    );\r\n\r\n    overlay.style.setProperty(\r\n      \"opacity\",\r\n      \"1\",\r\n      \"important\"\r\n    );\r\n\r\n    overlay.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n\r\n    \/*\r\n     * MAKE SURE ONE PAGE IS ACTIVE\r\n     *\/\r\n    const activePage =\r\n      overlay.querySelector(\r\n        \".tc2-page.active\"\r\n      );\r\n\r\n    if(!activePage){\r\n\r\n      const homePage =\r\n        document.getElementById(\r\n          \"tc2HomePage\"\r\n        );\r\n\r\n      if(homePage){\r\n        homePage.classList.add(\r\n          \"active\"\r\n        );\r\n      }\r\n    }\r\n\r\n    \/*\r\n     * REMOVE THE BROKEN BACK-BUTTON LISTENER\r\n     * BY REPLACING THE BUTTON WITH A CLEAN COPY.\r\n     *\/\r\n    const oldBack =\r\n      document.getElementById(\r\n        \"tc2BackBtn\"\r\n      );\r\n\r\n    if(oldBack){\r\n\r\n      const cleanBack =\r\n        oldBack.cloneNode(true);\r\n\r\n      oldBack.replaceWith(\r\n        cleanBack\r\n      );\r\n\r\n      cleanBack.addEventListener(\r\n        \"click\",\r\n        function(event){\r\n\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          event.stopImmediatePropagation();\r\n\r\n          const explorePage =\r\n            document.getElementById(\r\n              \"tc2ExplorePage\"\r\n            );\r\n\r\n          const homePage =\r\n            document.getElementById(\r\n              \"tc2HomePage\"\r\n            );\r\n\r\n          const exploreIsActive =\r\n            Boolean(\r\n              explorePage &&\r\n              explorePage.classList.contains(\r\n                \"active\"\r\n              )\r\n            );\r\n\r\n          \/*\r\n           * EXPLORE INTERNAL BACK\r\n           *\/\r\n          if(\r\n            exploreIsActive &&\r\n            window.tc2ExploreV6 &&\r\n            typeof window.tc2ExploreV6.goBack ===\r\n              \"function\"\r\n          ){\r\n\r\n            const movedBack =\r\n              window.tc2ExploreV6.goBack();\r\n\r\n            if(movedBack){\r\n              return;\r\n            }\r\n          }\r\n\r\n          \/*\r\n           * FIND THE CURRENT ACTIVE PAGE\r\n           *\/\r\n          const currentPage =\r\n            overlay.querySelector(\r\n              \".tc2-page.active\"\r\n            );\r\n\r\n          \/*\r\n           * ANY INTERNAL PAGE \u2192 TRAVEL CLUB HOME\r\n           *\/\r\n          if(\r\n  currentPage &&\r\n  homePage &&\r\n  currentPage !== homePage\r\n){\r\n\r\n  overlay\r\n    .querySelectorAll(\".tc2-page\")\r\n    .forEach(function(page){\r\n      page.classList.remove(\"active\");\r\n      page.style.removeProperty(\"display\");\r\n      page.setAttribute(\"aria-hidden\",\"true\");\r\n    });\r\n\r\n  homePage.classList.add(\"active\");\r\n  homePage.style.removeProperty(\"display\");\r\n  homePage.setAttribute(\"aria-hidden\",\"false\");\r\n\r\n  overlay.scrollTop = 0;\r\n\r\n  return;\r\n}\r\n\r\n          \/*\r\n           * TRAVEL CLUB HOME \u2192 GODS GALAXY\r\n           *\r\n           * This can only happen after a real,\r\n           * deliberate back-button click.\r\n           *\/\r\n          window.location.href =\r\n            \"https:\/\/godsgalaxygame.com\/GGG\/\";\r\n\r\n        },\r\n        true\r\n      );\r\n    }\r\n\r\n    console.log(\r\n      \"[Travel Club Restore] Hidden page restored.\"\r\n    );\r\n  }\r\n\r\n  if(\r\n    document.readyState === \"loading\"\r\n  ){\r\n\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      restoreTravelClub,\r\n      {once:true}\r\n    );\r\n\r\n  }else{\r\n\r\n    restoreTravelClub();\r\n\r\n  }\r\n\r\n  \/*\r\n   * RECHECK AFTER OTHER WORDPRESS SCRIPTS FINISH.\r\n   *\/\r\n  setTimeout(\r\n    restoreTravelClub,\r\n    300\r\n  );\r\n\r\n  setTimeout(\r\n    restoreTravelClub,\r\n    1000\r\n  );\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- BLISS HERO SCROLL \u2014 CONNECTION RESTORE -->\r\n<script>\r\n(function(){\r\n\r\n  function connectHeroScroll(){\r\n    const overlay =\r\n      document.getElementById(\"tc2Overlay\");\r\n\r\n    const home =\r\n      document.getElementById(\"tc2HomePage\");\r\n\r\n    if(!overlay || !home){\r\n      return;\r\n    }\r\n\r\n    \/* Prevent duplicate connections *\/\r\n    if(overlay.dataset.heroScrollConnected === \"1\"){\r\n      return;\r\n    }\r\n\r\n    overlay.dataset.heroScrollConnected = \"1\";\r\n\r\n    let scheduled = false;\r\n\r\n    function restoreHeroEffect(){\r\n      scheduled = false;\r\n\r\n      if(!home.classList.contains(\"active\")){\r\n        return;\r\n      }\r\n\r\n      const y = overlay.scrollTop || 0;\r\n\r\n      const p = Math.min(\r\n        y \/ (window.innerHeight * 0.95),\r\n        1.4\r\n      );\r\n\r\n      const root = document.documentElement;\r\n\r\n      root.style.setProperty(\r\n        \"--tc2LogoScale\",\r\n        (1 + p * 2.8).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2LogoOpacity\",\r\n        Math.max(0, 1 - p * 0.92).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2CopyY\",\r\n        (p * -50) + \"px\"\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2CopyScale\",\r\n        Math.max(0.78, 1 - p * 0.18).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2CopyOpacity\",\r\n        Math.max(0, 1 - p * 0.88).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2BgScale\",\r\n        (1 + p * 0.15).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2BgShift\",\r\n        (p * 24) + \"px\"\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2BgBrightness\",\r\n        Math.max(0.62, 1 - p * 0.16).toFixed(3)\r\n      );\r\n    }\r\n\r\n    function requestHeroUpdate(){\r\n      if(scheduled){\r\n        return;\r\n      }\r\n\r\n      scheduled = true;\r\n      requestAnimationFrame(restoreHeroEffect);\r\n    }\r\n\r\n    overlay.addEventListener(\r\n      \"scroll\",\r\n      requestHeroUpdate,\r\n      { passive:true }\r\n    );\r\n\r\n    window.addEventListener(\r\n      \"resize\",\r\n      requestHeroUpdate,\r\n      { passive:true }\r\n    );\r\n\r\n    restoreHeroEffect();\r\n\r\n    console.log(\r\n      \"[Bliss Travel Club] Hero scroll reconnected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      connectHeroScroll,\r\n      { once:true }\r\n    );\r\n  }else{\r\n    connectHeroScroll();\r\n  }\r\n\r\n  setTimeout(connectHeroScroll, 500);\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- BLISS TRAVEL CLUB \u2014 TRUE VIEWPORT PORTAL -->\r\n<style>\r\nhtml > #tc2Overlay{\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n  top:0 !important;\r\n  left:0 !important;\r\n  right:auto !important;\r\n  bottom:auto !important;\r\n\r\n  width:100vw !important;\r\n  width:100dvw !important;\r\n  max-width:none !important;\r\n\r\n  height:100vh !important;\r\n  height:100dvh !important;\r\n  max-height:none !important;\r\n\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n\r\n  overflow-x:hidden !important;\r\n  overflow-y:auto !important;\r\n\r\n  visibility:visible !important;\r\n  opacity:1 !important;\r\n  transform:none !important;\r\n\r\n  z-index:2147483647 !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  function makeTravelClubFullScreen(){\r\n\r\n  const url =\r\n    new URL(window.location.href);\r\n\r\n  \/*\r\n   * This fullscreen repair belongs only to the\r\n   * hidden Travel Club route\u2014not the pyramid.\r\n   *\/\r\n  if(\r\n    url.searchParams.get(\"travelclub\") !== \"1\"\r\n  ){\r\n    return;\r\n  }\r\n\r\n  const overlay =\r\n    document.getElementById(\"tc2Overlay\");\r\n\r\n  if(!overlay){\r\n    return;\r\n  }\r\n\r\n    \/*\r\n     * Put Travel Club outside the constrained WordPress body.\r\n     * Moving the same element preserves its existing listeners,\r\n     * including the hero scroll listener.\r\n     *\/\r\n    if(overlay.parentElement !== document.documentElement){\r\n      document.documentElement.appendChild(overlay);\r\n    }\r\n\r\n    function sizeToBrowser(){\r\n      overlay.style.setProperty(\r\n        \"width\",\r\n        window.innerWidth + \"px\",\r\n        \"important\"\r\n      );\r\n\r\n      overlay.style.setProperty(\r\n        \"height\",\r\n        window.innerHeight + \"px\",\r\n        \"important\"\r\n      );\r\n\r\n      overlay.style.setProperty(\r\n        \"max-width\",\r\n        \"none\",\r\n        \"important\"\r\n      );\r\n\r\n      overlay.style.setProperty(\r\n        \"display\",\r\n        \"block\",\r\n        \"important\"\r\n      );\r\n    }\r\n\r\n    sizeToBrowser();\r\n\r\n    if(overlay.dataset.fullScreenResize !== \"1\"){\r\n      overlay.dataset.fullScreenResize = \"1\";\r\n\r\n      window.addEventListener(\r\n        \"resize\",\r\n        sizeToBrowser,\r\n        { passive:true }\r\n      );\r\n    }\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      makeTravelClubFullScreen,\r\n      { once:true }\r\n    );\r\n  }else{\r\n    makeTravelClubFullScreen();\r\n  }\r\n\r\n  setTimeout(makeTravelClubFullScreen, 500);\r\n  setTimeout(makeTravelClubFullScreen, 1200);\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- ACCOUNT BUTTON BESIDE MENU \u2014 MOBILE FINAL FIX -->\r\n<style>\r\n@media (max-width:720px){\r\n\r\n  \/* Sign In \/ My Account button *\/\r\n  #tc2Overlay #tc2AuthButton{\r\n    position:fixed !important;\r\n    top:18px !important;\r\n    right:78px !important;\r\n    left:auto !important;\r\n    bottom:auto !important;\r\n    transform:none !important;\r\n    margin:0 !important;\r\n    z-index:2147483646 !important;\r\n    white-space:nowrap !important;\r\n  }\r\n\r\n  \/* Three-line menu button *\/\r\n  #tc2Overlay #tc2MenuBtn{\r\n    position:fixed !important;\r\n    top:18px !important;\r\n    right:18px !important;\r\n    left:auto !important;\r\n    bottom:auto !important;\r\n    width:48px !important;\r\n    height:48px !important;\r\n    margin:0 !important;\r\n    transform:none !important;\r\n    z-index:2147483647 !important;\r\n  }\r\n\r\n  \/* Menu opens underneath both buttons *\/\r\n  #tc2Overlay #tc2MenuPanel{\r\n    position:fixed !important;\r\n    top:76px !important;\r\n    right:18px !important;\r\n    left:auto !important;\r\n    z-index:2147483647 !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<!-- LARGE BLISS TITLE COLOR -->\r\n<style>\r\n#tc2Overlay h1.tc2-title{\r\n  color:transparent !important;\r\n\r\n  background:linear-gradient(\r\n    100deg,\r\n    #42E8F5 0%,\r\n    #62C8FF 35%,\r\n    #B68CFF 70%,\r\n    #D99CFF 100%\r\n  ) !important;\r\n\r\n  -webkit-background-clip:text !important;\r\n  background-clip:text !important;\r\n  -webkit-text-fill-color:transparent !important;\r\n\r\n  text-shadow:\r\n    0 0 12px rgba(66,232,245,.25),\r\n    0 0 28px rgba(182,140,255,.18) !important;\r\n}\r\n<\/style>\r\n\r\n<!-- TRAVEL INTELLIGENCE DROPDOWN VISIBILITY FIX -->\r\n<style>\r\n#tc2Overlay #tc2BrainPage select.tc2-ti-select{\r\n  color:#F4FBFF !important;\r\n  background-color:#071426 !important;\r\n  -webkit-text-fill-color:#F4FBFF !important;\r\n\r\n  border:1px solid rgba(98,200,255,.42) !important;\r\n  color-scheme:dark !important;\r\n  opacity:1 !important;\r\n}\r\n\r\n#tc2Overlay #tc2BrainPage select.tc2-ti-select option{\r\n  color:#F4FBFF !important;\r\n  background-color:#071426 !important;\r\n  -webkit-text-fill-color:#F4FBFF !important;\r\n  opacity:1 !important;\r\n}\r\n\r\n#tc2Overlay #tc2BrainPage select.tc2-ti-select option:checked{\r\n  color:#FFFFFF !important;\r\n  background-color:#443080 !important;\r\n  -webkit-text-fill-color:#FFFFFF !important;\r\n}\r\n\r\n#tc2Overlay #tc2BrainPage select.tc2-ti-select:focus{\r\n  color:#FFFFFF !important;\r\n  border-color:#62C8FF !important;\r\n  box-shadow:\r\n    0 0 0 3px rgba(98,200,255,.14),\r\n    0 0 20px rgba(182,140,255,.16) !important;\r\n}\r\n<\/style>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL INTELLIGENCE - DIRECT RECOMMENDATIONS V6\r\n\r\nPASTE THIS ONE COMPLETE BLOCK AT THE VERY BOTTOM\r\nOF THE CURRENT TRAVEL CLUB CODE.\r\n\r\nIMPORTANT:\r\n1. Do not delete or replace existing Travel Club code.\r\n2. Do not paste the previous Real Host Search V1 block.\r\n3. This version creates an isolated popup.\r\n4. It does not insert recommendation cards into the page.\r\n5. It does not use a page-wide click capture listener.\r\n6. It does not automatically open when Travel Intelligence loads.\r\n========================================================= -->\r\n\r\n<style>\r\n#tiSafeHostPopup,\r\n#tiSafeHostPopup *{\r\n  box-sizing:border-box;\r\n  visibility:visible !important;\r\n}\r\n\r\n#tiSafeHostPopup[hidden]{\r\n  display:none !important;\r\n}\r\n\r\n#tiSafeHostPopup{\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n  z-index:2147483646 !important;\r\n  visibility:visible !important;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:18px;\r\n  background:rgba(1,4,12,.86);\r\n  backdrop-filter:blur(18px);\r\n  -webkit-backdrop-filter:blur(18px);\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-shell{\r\n  position:relative;\r\n  width:min(1180px,100%);\r\n  max-height:min(900px,92vh);\r\n  overflow:hidden;\r\n  border:1px solid rgba(92,238,255,.28);\r\n  border-radius:30px;\r\n  background:\r\n    radial-gradient(circle at 10% 0%,rgba(72,225,255,.12),transparent 34%),\r\n    radial-gradient(circle at 90% 10%,rgba(139,92,246,.15),transparent 38%),\r\n    linear-gradient(180deg,#071126 0%,#030711 100%);\r\n  box-shadow:\r\n    0 28px 90px rgba(0,0,0,.65),\r\n    0 0 44px rgba(74,225,255,.09);\r\n  color:#fff;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-top{\r\n  position:sticky;\r\n  top:0;\r\n  z-index:5;\r\n  display:flex;\r\n  align-items:flex-start;\r\n  justify-content:space-between;\r\n  gap:18px;\r\n  padding:22px 24px 18px;\r\n  border-bottom:1px solid rgba(255,255,255,.08);\r\n  background:rgba(5,10,24,.94);\r\n  backdrop-filter:blur(18px);\r\n  -webkit-backdrop-filter:blur(18px);\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-kicker{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  min-height:28px;\r\n  padding:6px 11px;\r\n  border:1px solid rgba(89,239,255,.25);\r\n  border-radius:999px;\r\n  background:rgba(89,239,255,.08);\r\n  color:#bffaff;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-title{\r\n  margin:10px 0 0;\r\n  color:#fff;\r\n  font-size:clamp(1.35rem,3vw,2.2rem);\r\n  line-height:1.05;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-subtitle{\r\n  margin:10px 0 0;\r\n  max-width:760px;\r\n  color:rgba(244,249,255,.72);\r\n  line-height:1.65;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-close{\r\n  flex:0 0 auto;\r\n  width:44px;\r\n  height:44px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.055);\r\n  color:#fff;\r\n  font-size:1.35rem;\r\n  font-weight:800;\r\n  cursor:pointer;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-close:hover{\r\n  border-color:rgba(89,239,255,.35);\r\n  background:rgba(89,239,255,.10);\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-scroll{\r\n  max-height:calc(min(900px,92vh) - 118px);\r\n  overflow:auto;\r\n  overscroll-behavior:contain;\r\n  padding:24px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-popup-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:10px;\r\n  margin-top:20px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn{\r\n  min-height:44px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:11px 16px;\r\n  border:1px solid rgba(255,255,255,.14);\r\n  border-radius:14px;\r\n  background:rgba(255,255,255,.055);\r\n  color:#fff;\r\n  font:inherit;\r\n  font-size:.82rem;\r\n  font-weight:900;\r\n  letter-spacing:.03em;\r\n  text-decoration:none;\r\n  cursor:pointer;\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn:hover{\r\n  transform:translateY(-1px);\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn-cyan{\r\n  border-color:rgba(83,243,255,.35);\r\n  background:linear-gradient(135deg,rgba(83,243,255,.24),rgba(41,169,255,.14));\r\n  color:#d8fcff;\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn-violet{\r\n  border-color:rgba(159,116,255,.38);\r\n  background:linear-gradient(135deg,rgba(139,92,246,.30),rgba(92,65,205,.18));\r\n  color:#f0e9ff;\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn-outline{\r\n  background:transparent;\r\n}\r\n\r\n#tiSafeHostPopup .ti-btn[disabled]{\r\n  opacity:.55;\r\n  cursor:wait;\r\n  transform:none;\r\n}\r\n\r\n#tiSafeHostPopup .ti-question-card,\r\n#tiSafeHostPopup .ti-empty-card,\r\n#tiSafeHostPopup .ti-loading-card{\r\n  padding:22px;\r\n  border:1px solid rgba(255,255,255,.09);\r\n  border-radius:24px;\r\n  background:rgba(255,255,255,.04);\r\n}\r\n\r\n#tiSafeHostPopup .ti-question-card h3,\r\n#tiSafeHostPopup .ti-empty-card h3,\r\n#tiSafeHostPopup .ti-loading-card h3{\r\n  margin:0;\r\n  color:#fff;\r\n  font-size:1.35rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-question-card p,\r\n#tiSafeHostPopup .ti-empty-card p,\r\n#tiSafeHostPopup .ti-loading-card p{\r\n  margin:11px 0 0;\r\n  color:rgba(244,249,255,.70);\r\n  line-height:1.65;\r\n}\r\n\r\n#tiSafeHostPopup .ti-profile-chips{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:18px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-chip{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  min-height:30px;\r\n  padding:6px 10px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.045);\r\n  color:rgba(248,251,255,.82);\r\n  font-size:.72rem;\r\n  font-weight:800;\r\n}\r\n\r\n#tiSafeHostPopup .ti-results-toolbar{\r\n  display:flex;\r\n  align-items:flex-start;\r\n  justify-content:space-between;\r\n  gap:16px;\r\n  flex-wrap:wrap;\r\n  margin-bottom:20px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-results-toolbar h3{\r\n  margin:0;\r\n  color:#fff;\r\n  font-size:1.3rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-results-toolbar p{\r\n  margin:8px 0 0;\r\n  color:rgba(244,249,255,.68);\r\n  line-height:1.55;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:18px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-card{\r\n  overflow:hidden;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:25px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(139,92,246,.10),transparent 36%),\r\n    rgba(255,255,255,.04);\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery{\r\n  position:relative;\r\n  height:250px;\r\n  overflow:hidden;\r\n  background:#07101f;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-track{\r\n  width:100%;\r\n  height:100%;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-image{\r\n  width:100%;\r\n  height:100%;\r\n  display:none;\r\n  object-fit:cover;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-image.is-active{\r\n  display:block;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-controls{\r\n  position:absolute;\r\n  inset:auto 12px 12px 12px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  pointer-events:none;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-btn{\r\n  width:38px;\r\n  height:38px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  border:1px solid rgba(255,255,255,.20);\r\n  border-radius:999px;\r\n  background:rgba(1,5,14,.72);\r\n  color:#fff;\r\n  font-size:1rem;\r\n  font-weight:900;\r\n  cursor:pointer;\r\n  pointer-events:auto;\r\n}\r\n\r\n#tiSafeHostPopup .ti-gallery-count{\r\n  display:inline-flex;\r\n  min-height:28px;\r\n  align-items:center;\r\n  padding:5px 9px;\r\n  border:1px solid rgba(255,255,255,.16);\r\n  border-radius:999px;\r\n  background:rgba(1,5,14,.72);\r\n  color:#fff;\r\n  font-size:.70rem;\r\n  font-weight:900;\r\n  pointer-events:auto;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-body{\r\n  padding:18px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-route{\r\n  color:#9af7ff;\r\n  font-size:.67rem;\r\n  font-weight:900;\r\n  letter-spacing:.11em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-name{\r\n  margin:9px 0 0;\r\n  color:#fff;\r\n  font-size:1.22rem;\r\n  line-height:1.25;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-match-row{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n  margin-top:12px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-match-percent{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  min-height:32px;\r\n  padding:7px 11px;\r\n  border:1px solid rgba(83,243,255,.28);\r\n  border-radius:999px;\r\n  background:rgba(83,243,255,.09);\r\n  color:#c9fbff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n}\r\n\r\n#tiSafeHostPopup .ti-featured{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  min-height:32px;\r\n  padding:7px 11px;\r\n  border:1px solid rgba(167,122,255,.30);\r\n  border-radius:999px;\r\n  background:rgba(139,92,246,.11);\r\n  color:#eee5ff;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-description{\r\n  margin:13px 0 0;\r\n  color:rgba(244,249,255,.70);\r\n  line-height:1.62;\r\n}\r\n\r\n#tiSafeHostPopup .ti-match-reasons{\r\n  margin-top:15px;\r\n  padding:14px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:17px;\r\n  background:rgba(255,255,255,.035);\r\n}\r\n\r\n#tiSafeHostPopup .ti-match-reasons strong{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:#cbbaff;\r\n  font-size:.68rem;\r\n  letter-spacing:.10em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tiSafeHostPopup .ti-host-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:9px;\r\n  margin-top:16px;\r\n}\r\n\r\n#tiSafeHostPopup .ti-toast{\r\n  position:sticky;\r\n  bottom:12px;\r\n  z-index:9;\r\n  width:max-content;\r\n  max-width:100%;\r\n  margin:18px auto 0;\r\n  padding:11px 15px;\r\n  border:1px solid rgba(83,243,255,.28);\r\n  border-radius:999px;\r\n  background:rgba(4,12,25,.96);\r\n  color:#ddfcff;\r\n  font-size:.78rem;\r\n  font-weight:850;\r\n  box-shadow:0 12px 35px rgba(0,0,0,.38);\r\n}\r\n\r\nbody.ti-safe-popup-open{\r\n  overflow:hidden !important;\r\n}\r\n\r\n@media(min-width:760px){\r\n  #tiSafeHostPopup .ti-host-grid{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media(min-width:1120px){\r\n  #tiSafeHostPopup .ti-host-grid{\r\n    grid-template-columns:repeat(3,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media(max-width:640px){\r\n  #tiSafeHostPopup{\r\n    padding:0;\r\n    align-items:stretch;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-popup-shell{\r\n    width:100%;\r\n    max-height:100vh;\r\n    min-height:100vh;\r\n    border-radius:0;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-popup-scroll{\r\n    max-height:calc(100vh - 108px);\r\n    padding:17px;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-popup-top{\r\n    padding:17px;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-popup-title{\r\n    font-size:1.35rem;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-gallery{\r\n    height:220px;\r\n  }\r\n\r\n  #tiSafeHostPopup .ti-btn{\r\n    width:100%;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  if(window.BlissTravelIntelligenceSafePopupV4){\r\n    return;\r\n  }\r\n\r\n  window.BlissTravelIntelligenceSafePopupV4 = true;\r\n\r\n  var PROFILE_KEY = \"BLISS_TRAVEL_INTELLIGENCE_V1\";\r\n  var RESULTS_KEY = \"BLISS_TRAVEL_INTELLIGENCE_RESULTS_V2\";\r\n  var PAGE_SIZE = 6;\r\n\r\n  var state = {\r\n    profile:null,\r\n    matches:[],\r\n    visibleMatches:[],\r\n    savedSearch:false,\r\n    resultOffset:0,\r\n    loading:false,\r\n    toastTimer:null\r\n  };\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function toText(value){\r\n    return String(value == null ? \"\" : value);\r\n  }\r\n\r\n  function normalize(value){\r\n    return toText(value)\r\n      .trim()\r\n      .toLowerCase();\r\n  }\r\n\r\n  function normalizeMatchValue(value){\r\n    var clean = normalize(value)\r\n      .replace(\/&\/g,\"and\")\r\n      .replace(\/[^a-z0-9]+\/g,\" \")\r\n      .replace(\/\\s+\/g,\" \")\r\n      .trim();\r\n\r\n    var aliases = {\r\n      \"couples\":\"couple\",\r\n      \"a couple\":\"couple\",\r\n      \"partner\":\"couple\",\r\n      \"partners\":\"couple\",\r\n      \"families\":\"family\",\r\n      \"family with kids\":\"family\",\r\n      \"kids\":\"family\",\r\n      \"friend\":\"friends\",\r\n      \"group of friends\":\"friends\",\r\n      \"groups\":\"group\",\r\n      \"solo traveler\":\"solo\",\r\n      \"solo traveller\":\"solo\",\r\n      \"business traveler\":\"business\",\r\n      \"business traveller\":\"business\"\r\n    };\r\n\r\n    return aliases[clean] || clean;\r\n  }\r\n\r\n  function toArray(value){\r\n    return Array.isArray(value) ? value : [];\r\n  }\r\n\r\n  function unique(values){\r\n    var output = [];\r\n\r\n    toArray(values).forEach(function(value){\r\n      var clean = toText(value).trim();\r\n\r\n      if(clean && output.indexOf(clean) === -1){\r\n        output.push(clean);\r\n      }\r\n    });\r\n\r\n    return output;\r\n  }\r\n\r\n  function escapeHTML(value){\r\n    return toText(value).replace(\/[&<>\"']\/g,function(character){\r\n      return {\r\n        \"&\":\"&amp;\",\r\n        \"<\":\"&lt;\",\r\n        \">\":\"&gt;\",\r\n        '\"':\"&quot;\",\r\n        \"'\":\"&#039;\"\r\n      }[character];\r\n    });\r\n  }\r\n\r\n  function readJSON(key,fallback){\r\n    try{\r\n      var value = JSON.parse(localStorage.getItem(key) || \"\");\r\n\r\n      return value && typeof value === \"object\"\r\n        ? value\r\n        : fallback;\r\n    }catch(error){\r\n      return fallback;\r\n    }\r\n  }\r\n\r\n  function writeJSON(key,value){\r\n    try{\r\n      localStorage.setItem(key,JSON.stringify(value));\r\n      return true;\r\n    }catch(error){\r\n      return false;\r\n    }\r\n  }\r\n\r\n  function readSavedProfile(){\r\n    if(\r\n      window.BlissTravelIntelligence &&\r\n      typeof window.BlissTravelIntelligence.readProfile === \"function\"\r\n    ){\r\n      try{\r\n        return window.BlissTravelIntelligence.readProfile() || {};\r\n      }catch(error){}\r\n    }\r\n\r\n    return readJSON(PROFILE_KEY,{});\r\n  }\r\n\r\n  function saveProfile(profile){\r\n    if(\r\n      window.BlissTravelIntelligence &&\r\n      typeof window.BlissTravelIntelligence.saveProfile === \"function\"\r\n    ){\r\n      try{\r\n        return window.BlissTravelIntelligence.saveProfile(profile);\r\n      }catch(error){}\r\n    }\r\n\r\n    writeJSON(PROFILE_KEY,profile);\r\n\r\n    try{\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissTravelProfileUpdated\",\r\n          {detail:profile}\r\n        )\r\n      );\r\n    }catch(error){}\r\n\r\n    return profile;\r\n  }\r\n\r\n  function fieldValue(id,fallback){\r\n    var field = byId(id);\r\n\r\n    if(!field){\r\n      return fallback;\r\n    }\r\n\r\n    return field.value;\r\n  }\r\n\r\n  function checkedValues(name,fallback){\r\n    var fields = document.querySelectorAll(\r\n      'input[name=\"' + name + '\"]:checked'\r\n    );\r\n\r\n    if(!fields.length){\r\n      return toArray(fallback);\r\n    }\r\n\r\n    return Array.prototype.map.call(\r\n      fields,\r\n      function(field){\r\n        return field.value;\r\n      }\r\n    );\r\n  }\r\n\r\n  function collectProfile(){\r\n    var saved = readSavedProfile() || {};\r\n    var now = new Date().toISOString();\r\n\r\n    return {\r\n      completed:true,\r\n      createdAt:saved.createdAt || now,\r\n      updatedAt:now,\r\n      destination:saved.destination || \"MedaYork - Medellin\",\r\n      travelerName:toText(\r\n        fieldValue(\r\n          \"tiTravelerName\",\r\n          saved.travelerName || \"\"\r\n        )\r\n      ).trim(),\r\n      language:fieldValue(\r\n        \"tiLanguage\",\r\n        saved.language || \"English\"\r\n      ),\r\n      travelStyle:fieldValue(\r\n        \"tiTravelStyle\",\r\n        saved.travelStyle || \"Balanced\"\r\n      ),\r\n      budget:fieldValue(\r\n        \"tiBudget\",\r\n        saved.budget || \"$$$\"\r\n      ),\r\n      tripLength:fieldValue(\r\n        \"tiTripLength\",\r\n        saved.tripLength || \"4-6 Days\"\r\n      ),\r\n      transportation:fieldValue(\r\n        \"tiTransportation\",\r\n        saved.transportation || \"Private Driver\"\r\n      ),\r\n      travelingWith:fieldValue(\r\n        \"tiTravelingWith\",\r\n        saved.travelingWith || \"Couple\"\r\n      ),\r\n      pace:fieldValue(\r\n        \"tiPace\",\r\n        saved.pace || \"Balanced\"\r\n      ),\r\n      interests:checkedValues(\r\n        \"tiInterests\",\r\n        saved.interests\r\n      ),\r\n      foodStyle:checkedValues(\r\n        \"tiFoodStyle\",\r\n        saved.foodStyle || saved.foodPreferences\r\n      ),\r\n      preferredTimes:checkedValues(\r\n        \"tiPreferredTimes\",\r\n        saved.preferredTimes\r\n      ),\r\n      accessibility:toText(\r\n        fieldValue(\r\n          \"tiAccessibility\",\r\n          saved.accessibility || \"\"\r\n        )\r\n      ).trim(),\r\n      notes:toText(\r\n        fieldValue(\r\n          \"tiNotes\",\r\n          saved.notes || \"\"\r\n        )\r\n      ).trim(),\r\n      astroSign:\r\n        saved.astroSign ||\r\n        saved.sign ||\r\n        (\r\n          window.blissTravelProfile &&\r\n          window.blissTravelProfile.astroSign\r\n        ) ||\r\n        \"\"\r\n    };\r\n  }\r\n\r\n  function profileSignature(profile){\r\n    var comparable = {\r\n      language:profile.language || \"\",\r\n      travelStyle:profile.travelStyle || \"\",\r\n      budget:profile.budget || \"\",\r\n      tripLength:profile.tripLength || \"\",\r\n      transportation:profile.transportation || \"\",\r\n      travelingWith:profile.travelingWith || \"\",\r\n      pace:profile.pace || \"\",\r\n      interests:unique(profile.interests).sort(),\r\n      foodStyle:unique(profile.foodStyle).sort(),\r\n      preferredTimes:unique(profile.preferredTimes).sort(),\r\n      accessibility:profile.accessibility || \"\",\r\n      astroSign:profile.astroSign || \"\"\r\n    };\r\n\r\n    return JSON.stringify(comparable);\r\n  }\r\n\r\n  function ensurePopup(){\r\n    var popup = byId(\"tiSafeHostPopup\");\r\n\r\n    if(popup){\r\n      return popup;\r\n    }\r\n\r\n    popup = document.createElement(\"div\");\r\n    popup.id = \"tiSafeHostPopup\";\r\n    popup.hidden = true;\r\n    popup.setAttribute(\"role\",\"dialog\");\r\n    popup.setAttribute(\"aria-modal\",\"true\");\r\n    popup.setAttribute(\r\n      \"aria-label\",\r\n      \"Bliss Travel Intelligence Recommendations\"\r\n    );\r\n\r\n    popup.innerHTML =\r\n      '<div class=\"ti-popup-shell\">' +\r\n        '<div class=\"ti-popup-top\">' +\r\n          '<div>' +\r\n            '<div class=\"ti-popup-kicker\">Bliss Travel Intelligence<\/div>' +\r\n            '<h2 class=\"ti-popup-title\" id=\"tiSafePopupTitle\">' +\r\n              'Your Host Recommendations' +\r\n            '<\/h2>' +\r\n            '<p class=\"ti-popup-subtitle\" id=\"tiSafePopupSubtitle\">' +\r\n              'Real hosts selected from your Bliss inventory.' +\r\n            '<\/p>' +\r\n          '<\/div>' +\r\n          '<button class=\"ti-popup-close\" id=\"tiSafePopupClose\" type=\"button\" aria-label=\"Close\">' +\r\n            'X' +\r\n          '<\/button>' +\r\n        '<\/div>' +\r\n        '<div class=\"ti-popup-scroll\" id=\"tiSafePopupContent\"><\/div>' +\r\n      '<\/div>';\r\n\r\n    const popupRoot =\r\n  document.getElementById(\"tc2Overlay\") ||\r\n  document.body;\r\n\r\npopupRoot.appendChild(popup);\r\n\r\n    popup.addEventListener(\"click\",function(event){\r\n      if(event.target === popup){\r\n        closePopup();\r\n      }\r\n    });\r\n\r\n    byId(\"tiSafePopupClose\").addEventListener(\r\n      \"click\",\r\n      closePopup\r\n    );\r\n\r\n    document.addEventListener(\"keydown\",function(event){\r\n      if(event.key === \"Escape\" && !popup.hidden){\r\n        closePopup();\r\n      }\r\n    });\r\n\r\n    return popup;\r\n  }\r\n\r\n  function openPopup(){\r\n    var popup = ensurePopup();\r\n\r\n    popup.hidden = false;\r\n    document.body.classList.add(\"ti-safe-popup-open\");\r\n\r\n    setTimeout(function(){\r\n      var closeButton = byId(\"tiSafePopupClose\");\r\n\r\n      if(closeButton){\r\n        closeButton.focus();\r\n      }\r\n    },0);\r\n  }\r\n\r\n  function closePopup(){\r\n    var popup = byId(\"tiSafeHostPopup\");\r\n\r\n    if(popup){\r\n      popup.hidden = true;\r\n    }\r\n\r\n    document.body.classList.remove(\"ti-safe-popup-open\");\r\n  }\r\n\r\n  function setPopupHeading(title,subtitle){\r\n    var titleNode = byId(\"tiSafePopupTitle\");\r\n    var subtitleNode = byId(\"tiSafePopupSubtitle\");\r\n\r\n    if(titleNode){\r\n      titleNode.textContent = title;\r\n    }\r\n\r\n    if(subtitleNode){\r\n      subtitleNode.textContent = subtitle;\r\n    }\r\n  }\r\n\r\n  function contentBox(){\r\n    ensurePopup();\r\n    return byId(\"tiSafePopupContent\");\r\n  }\r\n\r\n  function showToast(message){\r\n    var box = contentBox();\r\n\r\n    if(!box){\r\n      return;\r\n    }\r\n\r\n    var oldToast = box.querySelector(\".ti-toast\");\r\n\r\n    if(oldToast){\r\n      oldToast.remove();\r\n    }\r\n\r\n    var toast = document.createElement(\"div\");\r\n    toast.className = \"ti-toast\";\r\n    toast.textContent = message;\r\n    box.appendChild(toast);\r\n\r\n    clearTimeout(state.toastTimer);\r\n\r\n    state.toastTimer = setTimeout(function(){\r\n      if(toast.parentNode){\r\n        toast.remove();\r\n      }\r\n    },3200);\r\n  }\r\n\r\n  function profileChips(profile){\r\n    var values = [\r\n      profile.travelingWith,\r\n      profile.travelStyle,\r\n      profile.budget,\r\n      profile.tripLength,\r\n      profile.transportation,\r\n      profile.pace\r\n    ]\r\n      .concat(toArray(profile.interests))\r\n      .concat(toArray(profile.foodStyle))\r\n      .concat(toArray(profile.preferredTimes));\r\n\r\n    values = unique(values).slice(0,12);\r\n\r\n    return values.map(function(value){\r\n      return '<span class=\"ti-chip\">' +\r\n        escapeHTML(value) +\r\n      '<\/span>';\r\n    }).join(\"\");\r\n  }\r\n\r\n  function showSearchChoice(profile){\r\n    state.profile = profile;\r\n    state.savedSearch = false;\r\n\r\n    var savedResults = readJSON(RESULTS_KEY,null);\r\n    var sameSavedProfile =\r\n      savedResults &&\r\n      savedResults.profileSignature === profileSignature(profile) &&\r\n      toArray(savedResults.hostIds).length;\r\n\r\n    setPopupHeading(\r\n      \"Build Your Host Recommendations\",\r\n      \"Choose whether this search should be saved to your Travel Intelligence profile.\"\r\n    );\r\n\r\n    var box = contentBox();\r\n\r\n    box.innerHTML =\r\n      '<section class=\"ti-question-card\">' +\r\n        '<h3>Save this travel profile?<\/h3>' +\r\n        '<p>' +\r\n          'Saving lets you reopen these host recommendations later. ' +\r\n          'A temporary search will not replace your saved recommendations.' +\r\n        '<\/p>' +\r\n        '<div class=\"ti-profile-chips\">' +\r\n          profileChips(profile) +\r\n        '<\/div>' +\r\n        '<div class=\"ti-popup-actions\">' +\r\n          '<button class=\"ti-btn ti-btn-violet\" id=\"tiSafeSaveSearch\" type=\"button\">' +\r\n            'Save and Search' +\r\n          '<\/button>' +\r\n          '<button class=\"ti-btn ti-btn-cyan\" id=\"tiSafeTemporarySearch\" type=\"button\">' +\r\n            'Search Without Saving' +\r\n          '<\/button>' +\r\n          (\r\n            sameSavedProfile\r\n              ? '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeOpenSaved\" type=\"button\">' +\r\n                  'Open Saved Recommendations' +\r\n                '<\/button>'\r\n              : ''\r\n          ) +\r\n          '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeCancel\" type=\"button\">' +\r\n            'Cancel' +\r\n          '<\/button>' +\r\n        '<\/div>' +\r\n      '<\/section>';\r\n\r\n    byId(\"tiSafeSaveSearch\").addEventListener(\"click\",function(){\r\n      runSearch(profile,true,true);\r\n    });\r\n\r\n    byId(\"tiSafeTemporarySearch\").addEventListener(\"click\",function(){\r\n      runSearch(profile,false,true);\r\n    });\r\n\r\n    if(byId(\"tiSafeOpenSaved\")){\r\n      byId(\"tiSafeOpenSaved\").addEventListener(\r\n        \"click\",\r\n        openSavedRecommendations\r\n      );\r\n    }\r\n\r\n    byId(\"tiSafeCancel\").addEventListener(\r\n      \"click\",\r\n      closePopup\r\n    );\r\n  }\r\n\r\n  function getInventory(refresh){\r\n    if(\r\n      !refresh &&\r\n      Array.isArray(window.travelClubInventory) &&\r\n      window.travelClubInventory.length\r\n    ){\r\n      return Promise.resolve(\r\n        window.travelClubInventory.slice()\r\n      );\r\n    }\r\n\r\n    if(typeof window.loadTravelClubInventory === \"function\"){\r\n      try{\r\n        return Promise.resolve(\r\n          window.loadTravelClubInventory(refresh === true)\r\n        ).then(function(items){\r\n          if(Array.isArray(items)){\r\n            return items;\r\n          }\r\n\r\n          if(Array.isArray(window.travelClubInventory)){\r\n            return window.travelClubInventory.slice();\r\n          }\r\n\r\n          return [];\r\n        });\r\n      }catch(error){\r\n        return Promise.reject(error);\r\n      }\r\n    }\r\n\r\n    if(typeof window.astroGetHosts === \"function\"){\r\n      try{\r\n        return Promise.resolve(\r\n          window.astroGetHosts()\r\n        ).then(function(items){\r\n          return Array.isArray(items) ? items : [];\r\n        });\r\n      }catch(error){\r\n        return Promise.reject(error);\r\n      }\r\n    }\r\n\r\n    return Promise.resolve([]);\r\n  }\r\n\r\n  function hostIsEligible(host){\r\n    if(!host || typeof host !== \"object\"){\r\n      return false;\r\n    }\r\n\r\n    var status = normalize(host.status);\r\n    var section = normalize(host.section);\r\n    var hasTravelData =\r\n      host.travelIntelligence &&\r\n      typeof host.travelIntelligence === \"object\";\r\n\r\n    if(\r\n      host.active === false ||\r\n      status === \"hidden\" ||\r\n      status === \"inactive\" ||\r\n      status === \"draft\"\r\n    ){\r\n      return false;\r\n    }\r\n\r\n    if(section && section !== \"astro\"){\r\n      return false;\r\n    }\r\n\r\n    return hasTravelData || section === \"astro\";\r\n  }\r\n\r\n  function exactTag(values,wanted){\r\n    var target = normalizeMatchValue(wanted);\r\n\r\n    if(!target){\r\n      return false;\r\n    }\r\n\r\n    return toArray(values).some(function(value){\r\n      return normalizeMatchValue(value) === target;\r\n    });\r\n  }\r\n\r\n  function commonValues(profileValues,hostValues){\r\n    return unique(profileValues).filter(function(value){\r\n      return exactTag(hostValues,value);\r\n    });\r\n  }\r\n\r\n  function hostTravelData(host){\r\n    if(\r\n      host.travelIntelligence &&\r\n      typeof host.travelIntelligence === \"object\"\r\n    ){\r\n      return host.travelIntelligence;\r\n    }\r\n\r\n    return {};\r\n  }\r\n\r\n  function hasAnyTravelTags(tags){\r\n    return (\r\n      toArray(tags.travelingWith).length ||\r\n      toArray(tags.travelStyles).length ||\r\n      toArray(tags.budgets).length ||\r\n      toArray(tags.tripLengths).length ||\r\n      toArray(tags.transportation).length ||\r\n      toArray(tags.paces).length ||\r\n      toArray(tags.interests).length ||\r\n      toArray(tags.foodStyle).length ||\r\n      toArray(tags.preferredTimes).length ||\r\n      tags.accessibilityFriendly === true\r\n    );\r\n  }\r\n\r\n  function addReason(reasons,value){\r\n    value = toText(value).trim();\r\n\r\n    if(value && reasons.indexOf(value) === -1){\r\n      reasons.push(value);\r\n    }\r\n  }\r\n\r\n  function scoreHost(host,profile){\r\n    if(!hostIsEligible(host)){\r\n      return null;\r\n    }\r\n\r\n    var tags = hostTravelData(host);\r\n    var tagsExist = hasAnyTravelTags(tags);\r\n    var score = 10;\r\n    var maximum = 10;\r\n    var reasons = [];\r\n    var requiredTravelingWith = toArray(tags.travelingWith);\r\n\r\n    \/*\r\n      Traveling With is the strongest filter.\r\n\r\n      Hosts tagged for the selected group receive the full match.\r\n      Hosts with no Traveling With tags remain available as\r\n      general recommendations instead of being excluded.\r\n    *\/\r\n    maximum += 20;\r\n\r\n    if(requiredTravelingWith.length){\r\n      if(!exactTag(requiredTravelingWith,profile.travelingWith)){\r\n        return null;\r\n      }\r\n\r\n      score += 20;\r\n      addReason(reasons,\"Good for \" + profile.travelingWith);\r\n    }else{\r\n      score += 8;\r\n      addReason(reasons,\"General host option\");\r\n    }\r\n\r\n    var simpleRules = [\r\n      {\r\n        profileValue:profile.travelStyle,\r\n        hostValues:tags.travelStyles,\r\n        points:14,\r\n        label:\"Travel style\"\r\n      },\r\n      {\r\n        profileValue:profile.budget,\r\n        hostValues:tags.budgets,\r\n        points:10,\r\n        label:\"Budget\"\r\n      },\r\n      {\r\n        profileValue:profile.tripLength,\r\n        hostValues:tags.tripLengths,\r\n        points:8,\r\n        label:\"Trip length\"\r\n      },\r\n      {\r\n        profileValue:profile.transportation,\r\n        hostValues:tags.transportation,\r\n        points:8,\r\n        label:\"Transportation\"\r\n      },\r\n      {\r\n        profileValue:profile.pace,\r\n        hostValues:tags.paces,\r\n        points:8,\r\n        label:\"Travel pace\"\r\n      }\r\n    ];\r\n\r\n    simpleRules.forEach(function(rule){\r\n      maximum += rule.points;\r\n\r\n      if(!toArray(rule.hostValues).length){\r\n        score += Math.round(rule.points * .28);\r\n        return;\r\n      }\r\n\r\n      if(exactTag(rule.hostValues,rule.profileValue)){\r\n        score += rule.points;\r\n        addReason(\r\n          reasons,\r\n          rule.label + \": \" + rule.profileValue\r\n        );\r\n      }\r\n    });\r\n\r\n    maximum += 18;\r\n\r\n    var interestMatches = commonValues(\r\n      profile.interests,\r\n      tags.interests\r\n    );\r\n\r\n    if(!toArray(tags.interests).length){\r\n      score += 5;\r\n    }else{\r\n      interestMatches.slice(0,3).forEach(function(value){\r\n        score += 6;\r\n        addReason(reasons,value);\r\n      });\r\n    }\r\n\r\n    maximum += 8;\r\n\r\n    var foodMatches = commonValues(\r\n      profile.foodStyle || profile.foodPreferences,\r\n      tags.foodStyle\r\n    );\r\n\r\n    if(!toArray(tags.foodStyle).length){\r\n      score += 2;\r\n    }else{\r\n      foodMatches.slice(0,2).forEach(function(value){\r\n        score += 4;\r\n        addReason(reasons,value);\r\n      });\r\n    }\r\n\r\n    maximum += 8;\r\n\r\n    var timeMatches = commonValues(\r\n      profile.preferredTimes,\r\n      tags.preferredTimes\r\n    );\r\n\r\n    if(!toArray(tags.preferredTimes).length){\r\n      score += 2;\r\n    }else{\r\n      timeMatches.slice(0,2).forEach(function(value){\r\n        score += 4;\r\n        addReason(reasons,value);\r\n      });\r\n    }\r\n\r\n    maximum += 6;\r\n\r\n    if(profile.accessibility){\r\n      if(tags.accessibilityFriendly === true){\r\n        score += 6;\r\n        addReason(reasons,\"Accessibility-friendly\");\r\n      }\r\n    }else{\r\n      score += 3;\r\n    }\r\n\r\n    maximum += 8;\r\n\r\n    if(\r\n      profile.astroSign &&\r\n      normalize(host.sign) === normalize(profile.astroSign)\r\n    ){\r\n      score += 8;\r\n      addReason(reasons,profile.astroSign + \" host match\");\r\n    }else if(!profile.astroSign || !host.sign){\r\n      score += 3;\r\n    }\r\n\r\n    if(host.featured){\r\n      score += 2;\r\n      maximum += 2;\r\n    }\r\n\r\n    if(!tagsExist){\r\n      addReason(reasons,\"Available Bliss host\");\r\n    }\r\n\r\n    var percent = tagsExist\r\n      ? Math.round((score \/ maximum) * 100)\r\n      : null;\r\n\r\n    if(percent !== null){\r\n      percent = Math.max(1,Math.min(99,percent));\r\n    }\r\n\r\n    var matchLabel = \"General Option\";\r\n\r\n    if(percent !== null){\r\n      if(percent >= 80){\r\n        matchLabel = \"Best Match\";\r\n      }else if(percent >= 65){\r\n        matchLabel = \"Strong Match\";\r\n      }else if(percent >= 50){\r\n        matchLabel = \"Good Match\";\r\n      }else{\r\n        matchLabel = \"Possible Match\";\r\n      }\r\n    }\r\n\r\n    return {\r\n      host:host,\r\n      score:score,\r\n      maximum:maximum,\r\n      percent:percent,\r\n      matchLabel:matchLabel,\r\n      hasSpecificTravelData:tagsExist,\r\n      reasons:reasons.length\r\n        ? reasons\r\n        : [\"Available Bliss host\"]\r\n    };\r\n  }\r\n\r\n  function findMatches(items,profile){\r\n    return toArray(items)\r\n      .map(function(host){\r\n        return scoreHost(host,profile);\r\n      })\r\n      .filter(Boolean)\r\n      .sort(function(a,b){\r\n        return (\r\n          Number(Boolean(b.hasSpecificTravelData)) -\r\n            Number(Boolean(a.hasSpecificTravelData)) ||\r\n          Number(b.percent || 0) - Number(a.percent || 0) ||\r\n          b.score - a.score ||\r\n          Number(Boolean(b.host.featured)) -\r\n            Number(Boolean(a.host.featured)) ||\r\n          Number(a.host.order || 9999) -\r\n            Number(b.host.order || 9999)\r\n        );\r\n      });\r\n  }\r\n\r\n  function hostId(host){\r\n    return toText(\r\n      host.id ||\r\n      host.hostId ||\r\n      host.slug ||\r\n      host.name ||\r\n      host.title\r\n    );\r\n  }\r\n\r\n  function hostName(host){\r\n    return (\r\n      host.name ||\r\n      host.title ||\r\n      host.resourceName ||\r\n      \"Bliss Travel Host\"\r\n    );\r\n  }\r\n\r\n  function hostImages(host){\r\n    var images = [];\r\n\r\n    if(Array.isArray(host.images)){\r\n      images = images.concat(host.images);\r\n    }\r\n\r\n    if(host.image){\r\n      images.push(host.image);\r\n    }\r\n\r\n    if(host.imageUrl){\r\n      images.push(host.imageUrl);\r\n    }\r\n\r\n    if(host.logo){\r\n      images.push(host.logo);\r\n    }\r\n\r\n    return unique(images);\r\n  }\r\n\r\n  function hostWebsite(host){\r\n    return (\r\n      host.websiteUrl ||\r\n      host.website ||\r\n      host.url ||\r\n      \"\"\r\n    );\r\n  }\r\n\r\n  function hostReserveURL(host){\r\n    return (\r\n      host.reserveUrl ||\r\n      host.checkoutUrl ||\r\n      host.bookingUrl ||\r\n      \"\"\r\n    );\r\n  }\r\n\r\n  function hostDescription(host){\r\n    return (\r\n      host.description ||\r\n      host.desc ||\r\n      host.shortExplanation ||\r\n      host.explanation ||\r\n      \"\"\r\n    );\r\n  }\r\n\r\n  function hostRoute(host){\r\n    return unique([\r\n      host.sign,\r\n      host.category || host.option,\r\n      host.style || host.suboption,\r\n      host.location\r\n    ]).join(\" - \");\r\n  }\r\n\r\n  function galleryHTML(host,index){\r\n    var images = hostImages(host);\r\n\r\n    if(!images.length){\r\n      return \"\";\r\n    }\r\n\r\n    var hostKey = escapeHTML(hostId(host));\r\n    var imagesHTML = images.map(function(image,imageIndex){\r\n      return '<img decoding=\"async\" class=\"ti-gallery-image' +\r\n        (imageIndex === 0 ? ' is-active' : '') +\r\n        '\" data-ti-gallery-image=\"' + hostKey + '\"' +\r\n        ' data-ti-image-index=\"' + imageIndex + '\"' +\r\n        ' src=\"' + escapeHTML(image) + '\"' +\r\n        ' alt=\"' + escapeHTML(hostName(host)) + '\">';\r\n    }).join(\"\");\r\n\r\n    var controls = \"\";\r\n\r\n    if(images.length > 1){\r\n      controls =\r\n        '<div class=\"ti-gallery-controls\">' +\r\n          '<button class=\"ti-gallery-btn\" type=\"button\"' +\r\n            ' data-ti-gallery-prev=\"' + hostKey + '\"' +\r\n            ' aria-label=\"Previous image\">&lt;<\/button>' +\r\n          '<span class=\"ti-gallery-count\"' +\r\n            ' data-ti-gallery-count=\"' + hostKey + '\">' +\r\n            '1 \/ ' + images.length +\r\n          '<\/span>' +\r\n          '<button class=\"ti-gallery-btn\" type=\"button\"' +\r\n            ' data-ti-gallery-next=\"' + hostKey + '\"' +\r\n            ' aria-label=\"Next image\">&gt;<\/button>' +\r\n        '<\/div>';\r\n    }\r\n\r\n    return '<div class=\"ti-gallery\" data-ti-gallery=\"' + hostKey + '\">' +\r\n      '<div class=\"ti-gallery-track\">' +\r\n        imagesHTML +\r\n      '<\/div>' +\r\n      controls +\r\n    '<\/div>';\r\n  }\r\n\r\n  function hostCardHTML(match,index){\r\n    var host = match.host;\r\n    var id = hostId(host);\r\n    var website = hostWebsite(host);\r\n    var description = hostDescription(host);\r\n    var route = hostRoute(host);\r\n\r\n    return '<article class=\"ti-host-card\">' +\r\n      galleryHTML(host,index) +\r\n      '<div class=\"ti-host-body\">' +\r\n        (\r\n          route\r\n            ? '<div class=\"ti-host-route\">' +\r\n                escapeHTML(route) +\r\n              '<\/div>'\r\n            : ''\r\n        ) +\r\n        '<h4 class=\"ti-host-name\">' +\r\n          escapeHTML(hostName(host)) +\r\n        '<\/h4>' +\r\n        '<div class=\"ti-match-row\">' +\r\n          '<span class=\"ti-match-percent\">' +\r\n            (\r\n              match.percent !== null\r\n                ? match.matchLabel + ' - ' + match.percent + '%'\r\n                : match.matchLabel\r\n            ) +\r\n          '<\/span>' +\r\n          (\r\n            host.featured\r\n              ? '<span class=\"ti-featured\">Featured Host<\/span>'\r\n              : ''\r\n          ) +\r\n        '<\/div>' +\r\n        (\r\n          description\r\n            ? '<p class=\"ti-host-description\">' +\r\n                escapeHTML(description) +\r\n              '<\/p>'\r\n            : ''\r\n        ) +\r\n        '<div class=\"ti-match-reasons\">' +\r\n          '<strong>Why this matches you<\/strong>' +\r\n          escapeHTML(match.reasons.slice(0,6).join(\", \")) +\r\n        '<\/div>' +\r\n        '<div class=\"ti-host-actions\">' +\r\n          (\r\n            website\r\n              ? '<a class=\"ti-btn ti-btn-outline\"' +\r\n                  ' href=\"' + escapeHTML(website) + '\"' +\r\n                  ' target=\"_blank\" rel=\"noopener\">' +\r\n                  'Visit Website' +\r\n                '<\/a>'\r\n              : ''\r\n          ) +\r\n          '<button class=\"ti-btn ti-btn-violet\" type=\"button\"' +\r\n            ' data-ti-save-host=\"' + escapeHTML(id) + '\">' +\r\n            'Save to My Journey' +\r\n          '<\/button>' +\r\n          '<button class=\"ti-btn ti-btn-cyan\" type=\"button\"' +\r\n            ' data-ti-reserve-host=\"' + escapeHTML(id) + '\">' +\r\n            'Reserve With Bliss' +\r\n          '<\/button>' +\r\n        '<\/div>' +\r\n      '<\/div>' +\r\n    '<\/article>';\r\n  }\r\n\r\n  function selectVisibleMatches(){\r\n    var total = state.matches.length;\r\n\r\n    if(total <= PAGE_SIZE){\r\n      state.visibleMatches = state.matches.slice();\r\n      return;\r\n    }\r\n\r\n    if(state.resultOffset >= total){\r\n      state.resultOffset = 0;\r\n    }\r\n\r\n    var selected = [];\r\n    var index = state.resultOffset;\r\n\r\n    while(selected.length < PAGE_SIZE){\r\n      selected.push(state.matches[index % total]);\r\n      index += 1;\r\n    }\r\n\r\n    state.visibleMatches = selected;\r\n  }\r\n\r\n  function renderResults(restored){\r\n    var box = contentBox();\r\n\r\n    selectVisibleMatches();\r\n\r\n    if(!state.matches.length){\r\n      setPopupHeading(\r\n        \"No Exact Host Matches Yet\",\r\n        \"Your popup is working, but no eligible hosts matched this profile.\"\r\n      );\r\n\r\n      box.innerHTML =\r\n        '<section class=\"ti-empty-card\">' +\r\n          '<h3>No recommendations found<\/h3>' +\r\n          '<p>' +\r\n            'Add Travel Intelligence matching options to active Astro hosts ' +\r\n            'in the Control Panel, or adjust the questionnaire and search again.' +\r\n          '<\/p>' +\r\n          '<div class=\"ti-popup-actions\">' +\r\n            '<button class=\"ti-btn ti-btn-cyan\" id=\"tiSafeRetrySearch\" type=\"button\">' +\r\n              'Refresh Host Inventory' +\r\n            '<\/button>' +\r\n            '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeChangeAnswers\" type=\"button\">' +\r\n              'Change My Answers' +\r\n            '<\/button>' +\r\n          '<\/div>' +\r\n        '<\/section>';\r\n\r\n      byId(\"tiSafeRetrySearch\").addEventListener(\"click\",function(){\r\n        runSearch(\r\n          state.profile,\r\n          state.savedSearch,\r\n          true\r\n        );\r\n      });\r\n\r\n      byId(\"tiSafeChangeAnswers\").addEventListener(\r\n        \"click\",\r\n        function(){\r\n          closePopup();\r\n\r\n          var form = document.querySelector(\r\n            \"#tc2BrainPage .tc2-ti-grid\"\r\n          );\r\n\r\n          if(form){\r\n            form.scrollIntoView({\r\n              behavior:\"smooth\",\r\n              block:\"start\"\r\n            });\r\n          }\r\n        }\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    setPopupHeading(\r\n      restored\r\n        ? \"Saved Host Recommendations\"\r\n        : \"Your Best Bliss Hosts\",\r\n      state.matches.length +\r\n        \" matching host\" +\r\n        (state.matches.length === 1 ? \"\" : \"s\") +\r\n        \" found. Stronger compatibility appears first.\"\r\n    );\r\n\r\n    box.innerHTML =\r\n      '<div class=\"ti-results-toolbar\">' +\r\n        '<div>' +\r\n          '<h3>' +\r\n            (state.savedSearch ? 'Saved Recommendations' : 'Current Recommendations') +\r\n          '<\/h3>' +\r\n          '<p>' +\r\n            'Showing ' + state.visibleMatches.length +\r\n            ' of ' + state.matches.length +\r\n            ' matching hosts.' +\r\n          '<\/p>' +\r\n        '<\/div>' +\r\n        '<div class=\"ti-popup-actions\">' +\r\n          '<button class=\"ti-btn ti-btn-violet\" id=\"tiSafeSaveRecommendations\" type=\"button\">' +\r\n            'Save These Recommendations' +\r\n          '<\/button>' +\r\n          '<button class=\"ti-btn ti-btn-cyan\" id=\"tiSafeRefreshResults\" type=\"button\">' +\r\n            'Refresh Recommendations' +\r\n          '<\/button>' +\r\n          '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeNewSearch\" type=\"button\">' +\r\n            'Search Current Answers Again' +\r\n          '<\/button>' +\r\n          '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeCloseResults\" type=\"button\">' +\r\n            'Close' +\r\n          '<\/button>' +\r\n        '<\/div>' +\r\n      '<\/div>' +\r\n      '<div class=\"ti-profile-chips\">' +\r\n        profileChips(state.profile) +\r\n      '<\/div>' +\r\n      '<div class=\"ti-host-grid\" style=\"margin-top:18px;\">' +\r\n        state.visibleMatches.map(hostCardHTML).join(\"\") +\r\n      '<\/div>';\r\n\r\n    bindResultControls();\r\n  }\r\n\r\n  function bindResultControls(){\r\n    var saveRecommendationsButton = byId(\"tiSafeSaveRecommendations\");\r\n    var refreshButton = byId(\"tiSafeRefreshResults\");\r\n    var newSearchButton = byId(\"tiSafeNewSearch\");\r\n    var closeButton = byId(\"tiSafeCloseResults\");\r\n    var box = contentBox();\r\n\r\n    if(saveRecommendationsButton){\r\n      saveRecommendationsButton.addEventListener(\"click\",function(){\r\n        var profile = state.profile || collectProfile();\r\n\r\n        profile.lastSearchAt = new Date().toISOString();\r\n        profile.lastRecommendationHostIds =\r\n          state.matches.map(function(match){\r\n            return hostId(match.host);\r\n          });\r\n\r\n        saveProfile(profile);\r\n\r\n        writeJSON(RESULTS_KEY,{\r\n          version:2,\r\n          savedAt:new Date().toISOString(),\r\n          profileSignature:profileSignature(profile),\r\n          profile:profile,\r\n          hostIds:profile.lastRecommendationHostIds\r\n        });\r\n\r\n        state.savedSearch = true;\r\n        showToast(\"These recommendations were saved.\");\r\n      });\r\n    }\r\n\r\n    if(refreshButton){\r\n      refreshButton.addEventListener(\"click\",function(){\r\n        if(state.matches.length > PAGE_SIZE){\r\n          state.resultOffset =\r\n            (state.resultOffset + PAGE_SIZE) %\r\n            state.matches.length;\r\n\r\n          renderResults(false);\r\n        }else{\r\n          runSearch(\r\n            state.profile,\r\n            state.savedSearch,\r\n            true\r\n          );\r\n        }\r\n      });\r\n    }\r\n\r\n    if(newSearchButton){\r\n      newSearchButton.addEventListener(\"click\",function(){\r\n        runSearch(collectProfile(),false,true);\r\n      });\r\n    }\r\n\r\n    if(closeButton){\r\n      closeButton.addEventListener(\"click\",closePopup);\r\n    }\r\n\r\n    Array.prototype.forEach.call(\r\n      box.querySelectorAll(\"[data-ti-save-host]\"),\r\n      function(button){\r\n        button.addEventListener(\"click\",function(){\r\n          saveHostToJourney(\r\n            button.getAttribute(\"data-ti-save-host\")\r\n          );\r\n        });\r\n      }\r\n    );\r\n\r\n    Array.prototype.forEach.call(\r\n      box.querySelectorAll(\"[data-ti-reserve-host]\"),\r\n      function(button){\r\n        button.addEventListener(\"click\",function(){\r\n          reserveHost(\r\n            button.getAttribute(\"data-ti-reserve-host\")\r\n          );\r\n        });\r\n      }\r\n    );\r\n\r\n    Array.prototype.forEach.call(\r\n      box.querySelectorAll(\"[data-ti-gallery-prev]\"),\r\n      function(button){\r\n        button.addEventListener(\"click\",function(){\r\n          changeGallery(\r\n            button.getAttribute(\"data-ti-gallery-prev\"),\r\n            -1\r\n          );\r\n        });\r\n      }\r\n    );\r\n\r\n    Array.prototype.forEach.call(\r\n      box.querySelectorAll(\"[data-ti-gallery-next]\"),\r\n      function(button){\r\n        button.addEventListener(\"click\",function(){\r\n          changeGallery(\r\n            button.getAttribute(\"data-ti-gallery-next\"),\r\n            1\r\n          );\r\n        });\r\n      }\r\n    );\r\n  }\r\n\r\n  function changeGallery(hostKey,direction){\r\n    var selector =\r\n      '[data-ti-gallery-image=\"' +\r\n      CSS.escape(hostKey) +\r\n      '\"]';\r\n\r\n    var images = document.querySelectorAll(selector);\r\n\r\n    if(!images.length){\r\n      return;\r\n    }\r\n\r\n    var currentIndex = 0;\r\n\r\n    Array.prototype.forEach.call(\r\n      images,\r\n      function(image,index){\r\n        if(image.classList.contains(\"is-active\")){\r\n          currentIndex = index;\r\n        }\r\n      }\r\n    );\r\n\r\n    var nextIndex =\r\n      (currentIndex + direction + images.length) %\r\n      images.length;\r\n\r\n    images[currentIndex].classList.remove(\"is-active\");\r\n    images[nextIndex].classList.add(\"is-active\");\r\n\r\n    var count = document.querySelector(\r\n      '[data-ti-gallery-count=\"' +\r\n      CSS.escape(hostKey) +\r\n      '\"]'\r\n    );\r\n\r\n    if(count){\r\n      count.textContent =\r\n        (nextIndex + 1) + \" \/ \" + images.length;\r\n    }\r\n  }\r\n\r\n  function showLoading(){\r\n    var box = contentBox();\r\n\r\n    setPopupHeading(\r\n      \"Searching Bliss Hosts\",\r\n      \"Comparing your Travel Intelligence profile with the newest active host inventory.\"\r\n    );\r\n\r\n    box.innerHTML =\r\n      '<section class=\"ti-loading-card\">' +\r\n        '<h3>Searching real hosts<\/h3>' +\r\n        '<p>' +\r\n          'Loading the newest inventory and calculating compatibility.' +\r\n        '<\/p>' +\r\n      '<\/section>';\r\n  }\r\n\r\n  function runSearch(profile,saveSearch,refreshInventory){\r\n    if(state.loading){\r\n      return;\r\n    }\r\n\r\n    state.loading = true;\r\n    state.profile = profile;\r\n    state.savedSearch = Boolean(saveSearch);\r\n    state.resultOffset = 0;\r\n\r\n    showLoading();\r\n\r\n    getInventory(refreshInventory)\r\n      .then(function(items){\r\n        state.matches = findMatches(items,profile);\r\n\r\n        if(saveSearch){\r\n          profile.lastSearchAt = new Date().toISOString();\r\n          profile.lastRecommendationHostIds =\r\n            state.matches.map(function(match){\r\n              return hostId(match.host);\r\n            });\r\n\r\n          saveProfile(profile);\r\n\r\n          writeJSON(RESULTS_KEY,{\r\n            version:2,\r\n            savedAt:new Date().toISOString(),\r\n            profileSignature:profileSignature(profile),\r\n            profile:profile,\r\n            hostIds:profile.lastRecommendationHostIds\r\n          });\r\n        }\r\n\r\n        renderResults(false);\r\n      })\r\n      .catch(function(error){\r\n        var box = contentBox();\r\n\r\n        setPopupHeading(\r\n          \"Host Search Could Not Load\",\r\n          \"The Travel Intelligence popup stayed isolated, but the host inventory was unavailable.\"\r\n        );\r\n\r\n        box.innerHTML =\r\n          '<section class=\"ti-empty-card\">' +\r\n            '<h3>Connection error<\/h3>' +\r\n            '<p>' +\r\n              escapeHTML(\r\n                error && error.message\r\n                  ? error.message\r\n                  : \"The host inventory could not be loaded.\"\r\n              ) +\r\n            '<\/p>' +\r\n            '<div class=\"ti-popup-actions\">' +\r\n              '<button class=\"ti-btn ti-btn-cyan\" id=\"tiSafeTryAgain\" type=\"button\">' +\r\n                'Try Again' +\r\n              '<\/button>' +\r\n              '<button class=\"ti-btn ti-btn-outline\" id=\"tiSafeErrorClose\" type=\"button\">' +\r\n                'Close' +\r\n              '<\/button>' +\r\n            '<\/div>' +\r\n          '<\/section>';\r\n\r\n        byId(\"tiSafeTryAgain\").addEventListener(\"click\",function(){\r\n          runSearch(profile,saveSearch,true);\r\n        });\r\n\r\n        byId(\"tiSafeErrorClose\").addEventListener(\r\n          \"click\",\r\n          closePopup\r\n        );\r\n      })\r\n      .finally(function(){\r\n        state.loading = false;\r\n      });\r\n  }\r\n\r\n  function openSavedRecommendations(){\r\n    var savedResults = readJSON(RESULTS_KEY,null);\r\n\r\n    if(\r\n      !savedResults ||\r\n      !savedResults.profile ||\r\n      !toArray(savedResults.hostIds).length\r\n    ){\r\n      showToast(\"No saved recommendations are available yet.\");\r\n      return;\r\n    }\r\n\r\n    state.loading = true;\r\n    state.profile = savedResults.profile;\r\n    state.savedSearch = true;\r\n    state.resultOffset = 0;\r\n\r\n    showLoading();\r\n\r\n    getInventory(false)\r\n      .then(function(items){\r\n        var byHostId = {};\r\n\r\n        toArray(items).forEach(function(host){\r\n          byHostId[hostId(host)] = host;\r\n        });\r\n\r\n        state.matches = toArray(savedResults.hostIds)\r\n          .map(function(id){\r\n            var host = byHostId[toText(id)];\r\n\r\n            return host\r\n              ? scoreHost(host,state.profile)\r\n              : null;\r\n          })\r\n          .filter(Boolean);\r\n\r\n        \/*\r\n          If saved hosts were removed or changed, rebuild from\r\n          the current inventory instead of showing a broken list.\r\n        *\/\r\n        if(!state.matches.length){\r\n          state.matches = findMatches(\r\n            items,\r\n            state.profile\r\n          );\r\n        }\r\n\r\n        renderResults(true);\r\n      })\r\n      .catch(function(){\r\n        state.matches = [];\r\n        renderResults(true);\r\n      })\r\n      .finally(function(){\r\n        state.loading = false;\r\n      });\r\n  }\r\n\r\n  function findCurrentMatch(id){\r\n    return state.matches.find(function(match){\r\n      return hostId(match.host) === toText(id);\r\n    });\r\n  }\r\n\r\n  function hasLevel2(){\r\n    if(\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership.hasLevel === \"function\"\r\n    ){\r\n      try{\r\n        return Boolean(\r\n          window.BlissTravelMembership.hasLevel(2)\r\n        );\r\n      }catch(error){}\r\n    }\r\n\r\n    var owned =\r\n      window.gggPmsData &&\r\n      window.gggPmsData.owned;\r\n\r\n    if(Array.isArray(owned)){\r\n      return (\r\n        owned.indexOf(2) !== -1 ||\r\n        owned.indexOf(\"2\") !== -1\r\n      );\r\n    }\r\n\r\n    if(owned && typeof owned === \"object\"){\r\n      return Boolean(\r\n        owned[2] === true ||\r\n        owned[\"2\"] === true ||\r\n        Number(owned[2] || owned[\"2\"]) === 1\r\n      );\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  function saveHostToJourney(id){\r\n    if(!hasLevel2()){\r\n      showToast(\r\n        \"Saving recommendations to My Journey requires Level 2.\"\r\n      );\r\n      return false;\r\n    }\r\n\r\n    var match = findCurrentMatch(id);\r\n\r\n    if(!match){\r\n      showToast(\"This host is no longer available.\");\r\n      return false;\r\n    }\r\n\r\n    if(\r\n      !window.tc2JourneyV7 ||\r\n      typeof window.tc2JourneyV7.addItem !== \"function\"\r\n    ){\r\n      showToast(\r\n        \"My Journey is still loading. Please try again.\"\r\n      );\r\n      return false;\r\n    }\r\n\r\n    var host = match.host;\r\n    var name = hostName(host);\r\n\r\n    var saved = window.tc2JourneyV7.addItem({\r\n      journeyId:\"travel-intelligence-\" + hostId(host),\r\n      id:hostId(host),\r\n      hostId:hostId(host),\r\n      source:\"travel-intelligence\",\r\n      type:\r\n        \"Astro Travel - \" +\r\n        (\r\n          host.category ||\r\n          host.option ||\r\n          \"Recommendation\"\r\n        ),\r\n      title:name,\r\n      name:name,\r\n      image:hostImages(host)[0] || \"\",\r\n      images:hostImages(host),\r\n      description:hostDescription(host),\r\n      websiteUrl:hostWebsite(host),\r\n      reserveUrl:hostReserveURL(host),\r\n      location:host.location || \"\",\r\n      price:host.price || \"\",\r\n      sign:host.sign || \"\",\r\n      style:\r\n        host.style ||\r\n        host.suboption ||\r\n        \"\",\r\n      category:\r\n        host.category ||\r\n        host.option ||\r\n        \"\",\r\n      status:\"Saved\",\r\n      time:\"Travel Intelligence Match\",\r\n      matchPercent:match.percent,\r\n      matchReasons:match.reasons.slice()\r\n    });\r\n\r\n    if(saved !== false){\r\n      showToast(\r\n        name + \" was saved to My Journey.\"\r\n      );\r\n      return true;\r\n    }\r\n\r\n    showToast(\r\n      \"This host could not be saved right now.\"\r\n    );\r\n\r\n    return false;\r\n  }\r\n\r\n  function reserveHost(id){\r\n    if(!hasLevel2()){\r\n      showToast(\r\n        \"Reserve With Bliss requires Level 2.\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    var match = findCurrentMatch(id);\r\n\r\n    if(!match){\r\n      showToast(\"This host is no longer available.\");\r\n      return;\r\n    }\r\n\r\n    var reserveURL = hostReserveURL(match.host);\r\n\r\n    if(reserveURL){\r\n      window.open(\r\n        reserveURL,\r\n        \"_blank\",\r\n        \"noopener\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    if(saveHostToJourney(id)){\r\n      showToast(\r\n        \"Saved to My Journey so Bliss can confirm availability.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  function handleRecommendationClick(event){\r\n    if(event){\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n\r\n      if(\r\n        typeof event.stopImmediatePropagation === \"function\"\r\n      ){\r\n        event.stopImmediatePropagation();\r\n      }\r\n    }\r\n\r\n    var profile = collectProfile();\r\n\r\n    openPopup();\r\n    runSearch(profile,false,true);\r\n\r\n    return false;\r\n  }\r\n\r\n  window.BlissTravelRecommendations = {\r\n    open:function(){\r\n      var profile = collectProfile();\r\n\r\n      openPopup();\r\n      runSearch(profile,false,true);\r\n      return false;\r\n    },\r\n    close:closePopup,\r\n    refreshBinding:function(){\r\n      return bindRecommendationButton();\r\n    }\r\n  };\r\n\r\n  \/*\r\n    CORRECT BUTTON CONNECTION\r\n\r\n    Keep the original Travel Intelligence button ID:\r\n    #tiOpenRecommendations\r\n\r\n    Do not clone it.\r\n    Do not rename it.\r\n    Do not replace its HTML.\r\n  *\/\r\n  function connectRecommendationButton(){\r\n    var button = byId(\"tiOpenRecommendations\");\r\n\r\n    if(!button){\r\n      return false;\r\n    }\r\n\r\n    if(button.getAttribute(\"data-ti-popup-connected\") === \"1\"){\r\n      return true;\r\n    }\r\n\r\n    button.setAttribute(\"data-ti-popup-connected\",\"1\");\r\n    button.setAttribute(\"type\",\"button\");\r\n\r\n    button.addEventListener(\r\n      \"click\",\r\n      handleRecommendationClick,\r\n      true\r\n    );\r\n\r\n    return true;\r\n  }\r\n\r\n  \/*\r\n    Capture the original button before older Travel Club navigation\r\n    handlers can send the visitor to Explore Medellin.\r\n  *\/\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      var target = event.target;\r\n\r\n      var button =\r\n        target && target.closest\r\n          ? target.closest(\"#tiOpenRecommendations\")\r\n          : null;\r\n\r\n      if(!button){\r\n        return;\r\n      }\r\n\r\n      handleRecommendationClick(event);\r\n    },\r\n    true\r\n  );\r\n\r\n  function startRecommendationConnection(){\r\n    connectRecommendationButton();\r\n\r\n    var root =\r\n      byId(\"tc2BrainPage\") ||\r\n      byId(\"tc2Overlay\") ||\r\n      document.body;\r\n\r\n    var observer = new MutationObserver(function(){\r\n      connectRecommendationButton();\r\n    });\r\n\r\n    observer.observe(root,{\r\n      childList:true,\r\n      subtree:true\r\n    });\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      startRecommendationConnection\r\n    );\r\n  }else{\r\n    startRecommendationConnection();\r\n  }\r\n\r\n  console.log(\r\n    \"[Bliss Travel Intelligence] Host popup connected to #tiOpenRecommendations.\"\r\n  );\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS MY JOURNEY\r\nCUSTOMER ACCOUNT DIRECT CONNECTION V2\r\n\r\nSOURCE OF TRUTH:\r\nWordPress customer account \u2192 ggg_travel_journey\r\n\r\nNO PERMANENT LOCAL STORAGE\r\n========================================================= -->\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  const GET_ACTION =\r\n    \"bliss_member_get_journey\";\r\n\r\n  const SAVE_ACTION =\r\n    \"bliss_member_save_journey\";\r\n\r\n  const SESSION_CACHE_KEY =\r\n    \"GGG_TRAVEL_CLUB_V3_JOURNEY\";\r\n\r\n  let accountJourney = [];\r\n  let accountLoaded = false;\r\n  let activeLoad = null;\r\n  let activeSave = null;\r\n  let pendingSave = null;\r\n\r\n\r\n  \/* =====================================================\r\n     CONFIGURATION PROVIDED BY PHP\r\n  ===================================================== *\/\r\n\r\n  function config(){\r\n\r\n    return window.BlissJourneyMemberConfig || {\r\n      ajaxUrl:\r\n        \"\/GGG\/wp-admin\/admin-ajax.php\",\r\n\r\n      nonce:\r\n        \"\",\r\n\r\n      loggedIn:\r\n        false,\r\n\r\n      userId:\r\n        0,\r\n\r\n      hasLevel2:\r\n        false,\r\n\r\n      metaKey:\r\n        \"ggg_travel_journey\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  function canUseAccount(){\r\n\r\n    const current =\r\n      config();\r\n\r\n    return Boolean(\r\n      current.loggedIn &&\r\n      current.userId &&\r\n      current.hasLevel2 &&\r\n      current.nonce\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SERVER REQUEST\r\n  ===================================================== *\/\r\n\r\n  function post(action,payload){\r\n\r\n    const current =\r\n      config();\r\n\r\n    const formData =\r\n      new FormData();\r\n\r\n    formData.append(\r\n      \"action\",\r\n      action\r\n    );\r\n\r\n    formData.append(\r\n      \"nonce\",\r\n      current.nonce || \"\"\r\n    );\r\n\r\n    Object.keys(\r\n      payload || {}\r\n    ).forEach(function(key){\r\n\r\n      formData.append(\r\n        key,\r\n        payload[key]\r\n      );\r\n\r\n    });\r\n\r\n    return fetch(\r\n      current.ajaxUrl ||\r\n      \"\/GGG\/wp-admin\/admin-ajax.php\",\r\n      {\r\n        method:\"POST\",\r\n        credentials:\"same-origin\",\r\n        cache:\"no-store\",\r\n        body:formData\r\n      }\r\n    )\r\n    .then(function(response){\r\n\r\n      return response.json();\r\n\r\n    })\r\n    .then(function(result){\r\n\r\n      if(\r\n        !result ||\r\n        result.success !== true\r\n      ){\r\n\r\n        const message =\r\n          result &&\r\n          result.data &&\r\n          result.data.message\r\n            ? result.data.message\r\n            : \"My Journey request failed.\";\r\n\r\n        throw new Error(message);\r\n\r\n      }\r\n\r\n      return result.data || {};\r\n\r\n    });\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SESSION CACHE ONLY\r\n\r\n     This is not permanent storage.\r\n     It only makes the current page react immediately.\r\n  ===================================================== *\/\r\n\r\n  function writeSessionCache(items){\r\n\r\n    const safeItems =\r\n      Array.isArray(items)\r\n        ? items\r\n        : [];\r\n\r\n    try{\r\n\r\n      sessionStorage.setItem(\r\n        SESSION_CACHE_KEY,\r\n        JSON.stringify(safeItems)\r\n      );\r\n\r\n    }catch(error){}\r\n\r\n  }\r\n\r\n\r\n  function clearOldPermanentJourney(){\r\n\r\n    try{\r\n\r\n      localStorage.removeItem(\r\n        \"BLISS_TRAVEL_CLUB_SAVED_JOURNEY_V1\"\r\n      );\r\n\r\n    }catch(error){}\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     ITEM IDENTITY\r\n  ===================================================== *\/\r\n\r\n  function itemID(item){\r\n\r\n    return String(\r\n      item &&\r\n      (\r\n        item.journeyId ||\r\n        item.hostId ||\r\n        item.id\r\n      ) ||\r\n      [\r\n        item && item.type,\r\n        item && item.title,\r\n        item && item.location,\r\n        item && item.time\r\n      ]\r\n      .filter(Boolean)\r\n      .join(\"|\")\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function cleanItem(item){\r\n\r\n    const safe =\r\n      Object.assign(\r\n        {},\r\n        item || {}\r\n      );\r\n\r\n    if(!safe.journeyId){\r\n\r\n      safe.journeyId =\r\n        itemID(safe);\r\n\r\n    }\r\n\r\n    if(!safe.status){\r\n\r\n      safe.status =\r\n        \"Saved\";\r\n\r\n    }\r\n\r\n    return safe;\r\n\r\n  }\r\n\r\n\r\n  function deduplicate(items){\r\n\r\n    const map =\r\n      new Map();\r\n\r\n    (\r\n      Array.isArray(items)\r\n        ? items\r\n        : []\r\n    ).forEach(function(item){\r\n\r\n      if(!item){\r\n        return;\r\n      }\r\n\r\n      const cleaned =\r\n        cleanItem(item);\r\n\r\n      const id =\r\n        itemID(cleaned);\r\n\r\n      if(!id){\r\n        return;\r\n      }\r\n\r\n      map.set(\r\n        id,\r\n        cleaned\r\n      );\r\n\r\n    });\r\n\r\n    return Array.from(\r\n      map.values()\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     APPLY ACCOUNT DATA TO MY JOURNEY\r\n  ===================================================== *\/\r\n\r\n  function applyAccountJourney(items,messages){\r\n\r\n    accountJourney =\r\n      deduplicate(items);\r\n\r\n    accountLoaded = true;\r\n\r\n    writeSessionCache(\r\n      accountJourney\r\n    );\r\n\r\n    window.BlissJourneyMemberMessages =\r\n      Array.isArray(messages)\r\n        ? messages\r\n        : [];\r\n\r\n    \r\n\r\n    window.dispatchEvent(\r\n      new CustomEvent(\r\n        \"blissJourneyAccountUpdated\",\r\n        {\r\n          detail:{\r\n            items:\r\n              accountJourney.slice(),\r\n\r\n            messages:\r\n              window.BlissJourneyMemberMessages\r\n          }\r\n        }\r\n      )\r\n    );\r\n\r\n    return accountJourney;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOAD CUSTOMER JOURNEY FROM WORDPRESS\r\n  ===================================================== *\/\r\n\r\n  function loadAccountJourney(forceReload){\r\n\r\n    if(!canUseAccount()){\r\n\r\n      accountLoaded = true;\r\n      accountJourney = [];\r\n\r\n      writeSessionCache([]);\r\n\r\n      return Promise.resolve({\r\n        items:[],\r\n        messages:[]\r\n      });\r\n\r\n    }\r\n\r\n    if(\r\n      activeLoad &&\r\n      forceReload !== true\r\n    ){\r\n\r\n      return activeLoad;\r\n\r\n    }\r\n\r\n    activeLoad =\r\n      post(\r\n        GET_ACTION,\r\n        {}\r\n      )\r\n      .then(function(data){\r\n\r\n        const items =\r\n          Array.isArray(data.items)\r\n            ? data.items\r\n            : [];\r\n\r\n        const messages =\r\n          Array.isArray(data.messages)\r\n            ? data.messages\r\n            : [];\r\n\r\n        applyAccountJourney(\r\n          items,\r\n          messages\r\n        );\r\n\r\n        return {\r\n          items:\r\n            accountJourney.slice(),\r\n\r\n          messages:\r\n            messages\r\n        };\r\n\r\n      })\r\n      .catch(function(error){\r\n\r\n        console.error(\r\n          \"[Bliss Journey Account] Load failed:\",\r\n          error\r\n        );\r\n\r\n        accountLoaded = true;\r\n        accountJourney = [];\r\n\r\n        writeSessionCache([]);\r\n\r\n        throw error;\r\n\r\n      })\r\n      .finally(function(){\r\n\r\n        activeLoad = null;\r\n\r\n      });\r\n\r\n    return activeLoad;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SAVE COMPLETE CUSTOMER JOURNEY TO WORDPRESS\r\n  ===================================================== *\/\r\n\r\n  function saveAccountJourney(items){\r\n\r\n    const safeItems =\r\n      deduplicate(items);\r\n\r\n    if(!canUseAccount()){\r\n\r\n      return Promise.reject(\r\n        new Error(\r\n          \"Please sign in with an active Level 2 Travel Club account.\"\r\n        )\r\n      );\r\n\r\n    }\r\n\r\n    accountJourney =\r\n      safeItems;\r\n\r\n    writeSessionCache(\r\n      accountJourney\r\n    );\r\n\r\n    pendingSave =\r\n      safeItems.slice();\r\n\r\n    if(activeSave){\r\n\r\n      return activeSave;\r\n\r\n    }\r\n\r\n    const itemsBeingSaved =\r\n      pendingSave.slice();\r\n\r\n    pendingSave = null;\r\n\r\n    activeSave =\r\n      post(\r\n        SAVE_ACTION,\r\n        {\r\n          items:\r\n            JSON.stringify(\r\n              itemsBeingSaved\r\n            )\r\n        }\r\n      )\r\n      .then(function(data){\r\n\r\n        const finalItems =\r\n          Array.isArray(data.items)\r\n            ? data.items\r\n            : itemsBeingSaved;\r\n\r\n        applyAccountJourney(\r\n          finalItems,\r\n          Array.isArray(data.messages)\r\n            ? data.messages\r\n            : (\r\n                window.BlissJourneyMemberMessages ||\r\n                []\r\n              )\r\n        );\r\n\r\n        return accountJourney.slice();\r\n\r\n      })\r\n      .catch(function(error){\r\n\r\n        console.error(\r\n          \"[Bliss Journey Account] Save failed:\",\r\n          error\r\n        );\r\n\r\n        \/*\r\n         * Do not pretend the item was permanently saved.\r\n         *\/\r\n        loadAccountJourney(true)\r\n          .catch(function(){});\r\n\r\n        throw error;\r\n\r\n      })\r\n      .finally(function(){\r\n\r\n        activeSave = null;\r\n\r\n        if(pendingSave){\r\n\r\n          const newest =\r\n            pendingSave.slice();\r\n\r\n          pendingSave = null;\r\n\r\n          saveAccountJourney(\r\n            newest\r\n          ).catch(function(){});\r\n\r\n        }\r\n\r\n      });\r\n\r\n    return activeSave;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     ADD ONE CUSTOMER SELECTION\r\n  ===================================================== *\/\r\n\r\n  function addAccountItem(item){\r\n\r\n    if(!item){\r\n\r\n      return Promise.reject(\r\n        new Error(\r\n          \"No Journey selection was provided.\"\r\n        )\r\n      );\r\n\r\n    }\r\n\r\n    function performAdd(){\r\n\r\n      const newItem =\r\n        cleanItem(item);\r\n\r\n      const newID =\r\n        itemID(newItem);\r\n\r\n      const exists =\r\n        accountJourney.some(\r\n          function(savedItem){\r\n\r\n            return (\r\n              itemID(savedItem) ===\r\n              newID\r\n            );\r\n\r\n          }\r\n        );\r\n\r\n      if(exists){\r\n\r\n        return Promise.resolve({\r\n          saved:false,\r\n          duplicate:true,\r\n          items:\r\n            accountJourney.slice()\r\n        });\r\n\r\n      }\r\n\r\n      const updated =\r\n        [\r\n          newItem\r\n        ].concat(\r\n          accountJourney\r\n        );\r\n\r\n      return saveAccountJourney(\r\n        updated\r\n      )\r\n      .then(function(savedItems){\r\n\r\n        return {\r\n          saved:true,\r\n          duplicate:false,\r\n          item:newItem,\r\n          items:savedItems\r\n        };\r\n\r\n      });\r\n\r\n    }\r\n\r\n    if(!accountLoaded){\r\n\r\n      return loadAccountJourney()\r\n        .then(performAdd);\r\n\r\n    }\r\n\r\n    return performAdd();\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     REMOVE ONE CUSTOMER SELECTION\r\n  ===================================================== *\/\r\n\r\n  function removeAccountItem(id){\r\n\r\n    function performRemove(){\r\n\r\n      const updated =\r\n        accountJourney.filter(\r\n          function(item){\r\n\r\n            return (\r\n              itemID(item) !==\r\n              String(id)\r\n            );\r\n\r\n          }\r\n        );\r\n\r\n      return saveAccountJourney(\r\n        updated\r\n      );\r\n\r\n    }\r\n\r\n    if(!accountLoaded){\r\n\r\n      return loadAccountJourney()\r\n        .then(performRemove);\r\n\r\n    }\r\n\r\n    return performRemove();\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     UPDATE ONE CUSTOMER SELECTION\r\n  ===================================================== *\/\r\n\r\n  function updateAccountItem(id,changes){\r\n\r\n    function performUpdate(){\r\n\r\n      const updated =\r\n        accountJourney.map(\r\n          function(item){\r\n\r\n            if(\r\n              itemID(item) !==\r\n              String(id)\r\n            ){\r\n\r\n              return item;\r\n\r\n            }\r\n\r\n            return Object.assign(\r\n              {},\r\n              item,\r\n              changes || {},\r\n              {\r\n                journeyId:\r\n                  item.journeyId ||\r\n                  String(id)\r\n              }\r\n            );\r\n\r\n          }\r\n        );\r\n\r\n      return saveAccountJourney(\r\n        updated\r\n      );\r\n\r\n    }\r\n\r\n    if(!accountLoaded){\r\n\r\n      return loadAccountJourney()\r\n        .then(performUpdate);\r\n\r\n    }\r\n\r\n    return performUpdate();\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     PUBLIC ACCOUNT API\r\n  ===================================================== *\/\r\n\r\n  window.BlissJourneyAccount = {\r\n\r\n    load:\r\n      loadAccountJourney,\r\n\r\n    read:\r\n      function(){\r\n\r\n        return accountJourney.slice();\r\n\r\n      },\r\n\r\n    save:\r\n      saveAccountJourney,\r\n\r\n    addItem:\r\n      addAccountItem,\r\n\r\n    removeItem:\r\n      removeAccountItem,\r\n\r\n    updateItem:\r\n      updateAccountItem,\r\n\r\n    canSync:\r\n      canUseAccount,\r\n\r\n    loaded:\r\n      function(){\r\n\r\n        return accountLoaded;\r\n\r\n      },\r\n\r\n    messages:\r\n      function(){\r\n\r\n        return (\r\n          window.BlissJourneyMemberMessages ||\r\n          []\r\n        );\r\n\r\n      }\r\n\r\n  };\r\n\r\n\r\n  \/* =====================================================\r\n     REPLACE OLD JOURNEY DATA FUNCTIONS\r\n\r\n     Existing Travel Club modules can continue calling\r\n     window.tc2JourneyV7, but the account now owns the data.\r\n  ===================================================== *\/\r\n\r\n  function connectExistingJourneyAPI(){\r\n\r\n    if(!window.tc2JourneyV7){\r\n\r\n      window.tc2JourneyV7 = {};\r\n\r\n    }\r\n\r\n    window.tc2JourneyV7.read =\r\n      function(){\r\n\r\n        return accountJourney.slice();\r\n\r\n      };\r\n\r\n    window.tc2JourneyV7.write =\r\n      function(items){\r\n\r\n        saveAccountJourney(\r\n          items\r\n        ).catch(function(error){\r\n\r\n          alert(\r\n            error.message ||\r\n            \"Your Journey could not be saved.\"\r\n          );\r\n\r\n        });\r\n\r\n        return items;\r\n\r\n      };\r\n\r\n    window.tc2JourneyV7.addItem =\r\n      function(item){\r\n\r\n        addAccountItem(\r\n          item\r\n        )\r\n        .then(function(result){\r\n\r\n          if(result.duplicate){\r\n\r\n            alert(\r\n              (\r\n                item.title ||\r\n                \"This selection\"\r\n              ) +\r\n              \" is already in My Journey.\"\r\n            );\r\n\r\n            return;\r\n\r\n          }\r\n\r\n          alert(\r\n            (\r\n              item.title ||\r\n              \"Selection\"\r\n            ) +\r\n            \" was saved to your account.\"\r\n          );\r\n\r\n        })\r\n        .catch(function(error){\r\n\r\n          alert(\r\n            error.message ||\r\n            \"This selection could not be saved.\"\r\n          );\r\n\r\n        });\r\n\r\n        return true;\r\n\r\n      };\r\n\r\n    window.tc2JourneyV7.removeItem =\r\n      function(id){\r\n\r\n        removeAccountItem(\r\n          id\r\n        ).catch(function(error){\r\n\r\n          alert(\r\n            error.message ||\r\n            \"This Journey item could not be removed.\"\r\n          );\r\n\r\n        });\r\n\r\n        return true;\r\n\r\n      };\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     CAPTURE OLDER SAVE EVENTS\r\n\r\n     Older Explore and Astro modules may still write into\r\n     sessionStorage and dispatch tc2JourneyUpdated.\r\n\r\n     We take only the newly selected item from event.detail\r\n     and save it directly to the customer's account.\r\n  ===================================================== *\/\r\n\r\n  window.addEventListener(\r\n    \"tc2JourneyUpdated\",\r\n    function(event){\r\n\r\n      const detail =\r\n        event &&\r\n        event.detail\r\n          ? event.detail\r\n          : {};\r\n\r\n      if(detail.item){\r\n\r\n        addAccountItem(\r\n          detail.item\r\n        ).catch(function(error){\r\n\r\n          console.error(\r\n            \"[Bliss Journey Account] Event save failed:\",\r\n            error\r\n          );\r\n\r\n        });\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n  \/* =====================================================\r\n     STARTUP\r\n  ===================================================== *\/\r\n\r\n  clearOldPermanentJourney();\r\n\r\n  connectExistingJourneyAPI();\r\n\r\n  loadAccountJourney()\r\n    .then(function(){\r\n\r\n      console.log(\r\n        \"[Bliss Journey Account] Customer Journey loaded.\",\r\n        accountJourney.length\r\n      );\r\n\r\n    })\r\n    .catch(function(error){\r\n\r\n      console.error(\r\n        \"[Bliss Journey Account] Startup failed:\",\r\n        error\r\n      );\r\n\r\n    });\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS MY JOURNEY\r\nACCOUNT-DRIVEN RENDERER RECOVERY V2\r\n\r\nREADS ONLY:\r\nwindow.BlissJourneyAccount.read()\r\n\r\nDOES NOT READ OR WRITE LOCAL STORAGE\r\n========================================================= -->\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  let activeView = \"dashboard\";\r\n\r\n  function escapeHTML(value){\r\n    return String(value == null ? \"\" : value)\r\n      .replace(\/[&<>\"']\/g,function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      });\r\n  }\r\n\r\n  function accountItems(){\r\n    if(\r\n      window.BlissJourneyAccount &&\r\n      typeof window.BlissJourneyAccount.read === \"function\"\r\n    ){\r\n      const items = window.BlissJourneyAccount.read();\r\n      return Array.isArray(items) ? items : [];\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  function itemID(item,index){\r\n    return String(\r\n      item.journeyId ||\r\n      item.hostId ||\r\n      item.id ||\r\n      [\r\n        item.type,\r\n        item.title,\r\n        item.location,\r\n        item.time,\r\n        index\r\n      ].filter(Boolean).join(\"|\")\r\n    );\r\n  }\r\n\r\n  function itemText(item){\r\n    return [\r\n      item.category,\r\n      item.type,\r\n      item.source,\r\n      item.service,\r\n      item.title,\r\n      item.description,\r\n      item.location\r\n    ].filter(Boolean).join(\" \").toLowerCase();\r\n  }\r\n\r\n  function categoryOf(item){\r\n    const explicit =\r\n      String(item.category || \"\")\r\n        .trim()\r\n        .toLowerCase();\r\n\r\n    if(\r\n      [\r\n        \"accommodations\",\r\n        \"restaurants\",\r\n        \"transportation\",\r\n        \"experiences\",\r\n        \"services\"\r\n      ].includes(explicit)\r\n    ){\r\n      return explicit;\r\n    }\r\n\r\n    const text = itemText(item);\r\n\r\n    if(\r\n      \/hotel|accommodation|stay|suite|resort|villa|apartment|penthouse|mansion|eco.?stay|high.?rise\/.test(text)\r\n    ){\r\n      return \"accommodations\";\r\n    }\r\n\r\n    if(\r\n      \/restaurant|dining|dinner|food|cafe|coffee|gastronomic|breakfast|lunch|brunch|rooftop|bar\\b\/.test(text)\r\n    ){\r\n      return \"restaurants\";\r\n    }\r\n\r\n    if(\r\n      \/driver|airport|pickup|transport|car|vehicle|helicopter|yacht|boat|transfer|shuttle\/.test(text)\r\n    ){\r\n      return \"transportation\";\r\n    }\r\n\r\n    if(\r\n      item.source === \"local-services\" ||\r\n      item.source === \"local-services-request\" ||\r\n      item.service ||\r\n      \/concierge|translator|security|photographer|assistant|local service\/.test(text)\r\n    ){\r\n      return \"services\";\r\n    }\r\n\r\n    return \"experiences\";\r\n  }\r\n\r\n  function isReservation(item){\r\n    return \/request|waiting|working|confirm|complete\/.test(\r\n      String(item.status || \"Saved\").toLowerCase()\r\n    );\r\n  }\r\n\r\n  function groupsFor(items){\r\n    const groups = {\r\n      accommodations:[],\r\n      restaurants:[],\r\n      transportation:[],\r\n      experiences:[],\r\n      services:[],\r\n      favorites:[],\r\n      reservations:[]\r\n    };\r\n\r\n    items.forEach(function(item){\r\n      if(!item) return;\r\n\r\n      const category = categoryOf(item);\r\n\r\n      if(groups[category]){\r\n        groups[category].push(item);\r\n      }\r\n\r\n      if(item.favorite === true){\r\n        groups.favorites.push(item);\r\n      }\r\n\r\n      if(isReservation(item)){\r\n        groups.reservations.push(item);\r\n      }\r\n    });\r\n\r\n    return groups;\r\n  }\r\n\r\n  function updateText(id,value){\r\n    const element = document.getElementById(id);\r\n\r\n    if(element){\r\n      element.textContent = value;\r\n    }\r\n  }\r\n\r\n  function updateSummary(items,groups){\r\n    const first = items[0] || null;\r\n\r\n    updateText(\r\n      \"tc2MjDestination\",\r\n      first && first.location\r\n        ? first.location\r\n        : \"MedaYork\"\r\n    );\r\n\r\n    updateText(\r\n      \"tc2NextExperience\",\r\n      first\r\n        ? first.title || \"Saved Experience\"\r\n        : \"Waiting for selection\"\r\n    );\r\n\r\n    updateText(\r\n      \"tc2StatNext\",\r\n      first\r\n        ? first.title || \"Saved Experience\"\r\n        : \"Waiting\"\r\n    );\r\n\r\n    Object.keys(groups).forEach(function(key){\r\n      document\r\n        .querySelectorAll('[data-mj-count=\"' + key + '\"]')\r\n        .forEach(function(element){\r\n          element.textContent = groups[key].length;\r\n        });\r\n    });\r\n\r\n    const checks = [\r\n      groups.accommodations.length > 0,\r\n      groups.restaurants.length > 0,\r\n      groups.transportation.length > 0,\r\n      groups.experiences.length > 0,\r\n      groups.services.length > 0,\r\n      groups.reservations.length > 0\r\n    ];\r\n\r\n    const percent =\r\n      Math.round(\r\n        checks.filter(Boolean).length \/\r\n        checks.length *\r\n        100\r\n      );\r\n\r\n    updateText(\r\n      \"tc2MjReadinessPercent\",\r\n      percent + \"%\"\r\n    );\r\n\r\n    const progressBar =\r\n      document.getElementById(\"tc2MjProgressBar\");\r\n\r\n    if(progressBar){\r\n      progressBar.style.width = percent + \"%\";\r\n    }\r\n\r\n    const readinessMessage =\r\n      document.getElementById(\"tc2MjReadinessMessage\");\r\n\r\n    if(readinessMessage){\r\n      readinessMessage.textContent =\r\n        percent === 0\r\n          ? \"Start saving discoveries and Bliss will organize them here.\"\r\n          : percent < 50\r\n            ? \"Your Journey is beginning to take shape.\"\r\n            : percent < 100\r\n              ? \"Your Journey is progressing. A few details are still missing.\"\r\n              : \"Your Journey is ready for Bliss confirmation.\";\r\n    }\r\n  }\r\n\r\n  function dashboardCard(view,index,title,count,emptyText){\r\n    return `\r\n      <button\r\n        class=\"bliss-newJourneyCategory\"\r\n        data-account-journey-view=\"${escapeHTML(view)}\"\r\n        type=\"button\">\r\n\r\n        <span class=\"bliss-newJourneyIndex\">\r\n          ${escapeHTML(index)}\r\n        <\/span>\r\n\r\n        <strong class=\"bliss-newJourneyNumber\">\r\n          ${count}\r\n        <\/strong>\r\n\r\n        <h4>${escapeHTML(title)}<\/h4>\r\n\r\n        <p>\r\n          ${\r\n            count\r\n              ? escapeHTML(count + \" saved in your account.\")\r\n              : escapeHTML(emptyText)\r\n          }\r\n        <\/p>\r\n      <\/button>\r\n    `;\r\n  }\r\n\r\n  function dashboardHTML(groups){\r\n    return `\r\n      <div class=\"bliss-newJourneyDashboard\">\r\n\r\n        ${dashboardCard(\r\n          \"accommodations\",\r\n          \"01\",\r\n          \"Accommodations\",\r\n          groups.accommodations.length,\r\n          \"No place to stay selected yet.\"\r\n        )}\r\n\r\n        ${dashboardCard(\r\n          \"restaurants\",\r\n          \"02\",\r\n          \"Restaurants\",\r\n          groups.restaurants.length,\r\n          \"No dining selections saved yet.\"\r\n        )}\r\n\r\n        ${dashboardCard(\r\n          \"transportation\",\r\n          \"03\",\r\n          \"Transportation\",\r\n          groups.transportation.length,\r\n          \"No transportation selected yet.\"\r\n        )}\r\n\r\n        ${dashboardCard(\r\n          \"experiences\",\r\n          \"04\",\r\n          \"Tours & Experiences\",\r\n          groups.experiences.length,\r\n          \"No experiences saved yet.\"\r\n        )}\r\n\r\n        ${dashboardCard(\r\n          \"services\",\r\n          \"05\",\r\n          \"Local Services\",\r\n          groups.services.length,\r\n          \"No local services selected yet.\"\r\n        )}\r\n\r\n        ${dashboardCard(\r\n          \"reservations\",\r\n          \"06\",\r\n          \"Reservations\",\r\n          groups.reservations.length,\r\n          \"No reservation requests yet.\"\r\n        )}\r\n\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function itemHTML(item,index){\r\n    const id = itemID(item,index);\r\n\r\n    const image =\r\n      item.image ||\r\n      (\r\n        Array.isArray(item.images)\r\n          ? item.images[0]\r\n          : \"\"\r\n      ) ||\r\n      \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n\r\n    return `\r\n      <article class=\"bliss-newJourneyItem\">\r\n\r\n        <div\r\n          class=\"bliss-newJourneyImage\"\r\n          style=\"background-image:url('${escapeHTML(image)}')\">\r\n        <\/div>\r\n\r\n        <div class=\"bliss-newJourneyBody\">\r\n\r\n          <div class=\"bliss-newJourneyTop\">\r\n\r\n            <span class=\"bliss-newJourneyType\">\r\n              ${escapeHTML(item.type || categoryOf(item))}\r\n            <\/span>\r\n\r\n            <span class=\"bliss-newJourneyStatus\">\r\n              ${escapeHTML(item.status || \"Saved\")}\r\n            <\/span>\r\n\r\n          <\/div>\r\n\r\n          <h3 class=\"bliss-newJourneyTitle\">\r\n            ${escapeHTML(item.title || item.name || \"Journey Item\")}\r\n          <\/h3>\r\n\r\n          ${\r\n            item.location || item.time\r\n              ? `\r\n                <div class=\"bliss-newJourneyMeta\">\r\n                  ${escapeHTML(\r\n                    [item.location,item.time]\r\n                      .filter(Boolean)\r\n                      .join(\" \u00b7 \")\r\n                  )}\r\n                <\/div>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          ${\r\n            item.description\r\n              ? `\r\n                <div class=\"bliss-newJourneyDescription\">\r\n                  ${escapeHTML(item.description)}\r\n                <\/div>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          <div class=\"bliss-newJourneyActions\">\r\n\r\n            <button\r\n              class=\"bliss-newJourneyButton is-danger\"\r\n              data-account-journey-remove=\"${escapeHTML(id)}\"\r\n              type=\"button\">\r\n              Remove\r\n            <\/button>\r\n\r\n          <\/div>\r\n\r\n        <\/div>\r\n\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function renderJourney(){\r\n    const container =\r\n      document.getElementById(\"tc2PlanCards\");\r\n\r\n    if(!container){\r\n      return;\r\n    }\r\n\r\n    const items = accountItems();\r\n    const groups = groupsFor(items);\r\n\r\n    updateSummary(items,groups);\r\n\r\n    const title =\r\n      document.getElementById(\"tc2MjViewTitle\");\r\n\r\n    if(title){\r\n      const titles = {\r\n        dashboard:\"Mission Dashboard\",\r\n        accommodations:\"Accommodations\",\r\n        restaurants:\"Restaurants\",\r\n        transportation:\"Transportation\",\r\n        experiences:\"Tours & Experiences\",\r\n        services:\"Local Services\",\r\n        favorites:\"Favorites\",\r\n        reservations:\"Reservations\",\r\n        concierge:\"Bliss Concierge\"\r\n      };\r\n\r\n      title.textContent =\r\n        titles[activeView] ||\r\n        titles.dashboard;\r\n    }\r\n\r\n    if(activeView === \"dashboard\"){\r\n      container.innerHTML =\r\n        dashboardHTML(groups);\r\n\r\n      return;\r\n    }\r\n\r\n    const selected =\r\n      groups[activeView] || [];\r\n\r\n    container.innerHTML =\r\n      selected.length\r\n        ? `\r\n          <div class=\"bliss-newJourneyList\">\r\n            ${selected.map(itemHTML).join(\"\")}\r\n          <\/div>\r\n        `\r\n        : `\r\n          <div class=\"bliss-newJourneyEmpty\">\r\n            <h4>No saved items here yet<\/h4>\r\n            <p>\r\n              Customer-account selections will appear here automatically.\r\n            <\/p>\r\n          <\/div>\r\n        `;\r\n  }\r\n\r\n  function removeItem(id){\r\n    if(\r\n      !window.BlissJourneyAccount ||\r\n      typeof window.BlissJourneyAccount.removeItem !== \"function\"\r\n    ){\r\n      return;\r\n    }\r\n\r\n    window.BlissJourneyAccount\r\n      .removeItem(id)\r\n      .then(renderJourney)\r\n      .catch(function(error){\r\n        alert(\r\n          error.message ||\r\n          \"This Journey item could not be removed.\"\r\n        );\r\n      });\r\n  }\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n      const viewButton =\r\n        event.target.closest(\r\n          \"[data-account-journey-view]\"\r\n        );\r\n\r\n      if(viewButton){\r\n        activeView =\r\n          viewButton.getAttribute(\r\n            \"data-account-journey-view\"\r\n          ) || \"dashboard\";\r\n\r\n        renderJourney();\r\n        return;\r\n      }\r\n\r\n      const originalViewButton =\r\n        event.target.closest(\r\n          \"#tc2JourneyPage [data-mj-view]\"\r\n        );\r\n\r\n      if(originalViewButton){\r\n        activeView =\r\n          originalViewButton.getAttribute(\r\n            \"data-mj-view\"\r\n          ) || \"dashboard\";\r\n\r\n        setTimeout(renderJourney,10);\r\n        return;\r\n      }\r\n\r\n      const removeButton =\r\n        event.target.closest(\r\n          \"[data-account-journey-remove]\"\r\n        );\r\n\r\n      if(removeButton){\r\n        event.preventDefault();\r\n\r\n        removeItem(\r\n          removeButton.getAttribute(\r\n            \"data-account-journey-remove\"\r\n          )\r\n        );\r\n        return;\r\n      }\r\n\r\n      const openButton =\r\n        event.target.closest(\r\n          \"#tc2MainJourney,#tc2FloatJourney\"\r\n        );\r\n\r\n      if(openButton){\r\n        activeView = \"dashboard\";\r\n        setTimeout(renderJourney,30);\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n  window.addEventListener(\r\n    \"blissJourneyAccountUpdated\",\r\n    renderJourney\r\n  );\r\n\r\n  \/*\r\n   * Restore the missing runtime API.\r\n   *\/\r\n  window.tc2JourneyV7 =\r\n    window.tc2JourneyV7 || {};\r\n\r\n  window.tc2JourneyV7.read =\r\n    accountItems;\r\n\r\n  window.tc2JourneyV7.render =\r\n    renderJourney;\r\n\r\n  window.BlissAccountJourneyRenderer = {\r\n    render:renderJourney,\r\n    read:accountItems\r\n  };\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      function(){\r\n        setTimeout(renderJourney,100);\r\n      }\r\n    );\r\n  }else{\r\n    setTimeout(renderJourney,100);\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS MY JOURNEY\r\nACCOUNT RENDERER VISUAL RESTORE V1\r\n\r\nRESTORES THE FUTURISTIC DESIGN FOR:\r\n- Dashboard cards\r\n- Saved Journey items\r\n- Images\r\n- Buttons\r\n========================================================= -->\r\n\r\n<style>\r\n\r\n\/* =====================================================\r\n   DASHBOARD GRID\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyDashboard{\r\n  display:grid !important;\r\n  grid-template-columns:repeat(3,minmax(0,1fr)) !important;\r\n  gap:16px !important;\r\n  width:100% !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   DASHBOARD CARDS\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory{\r\n  position:relative !important;\r\n  display:block !important;\r\n  min-height:190px !important;\r\n  padding:22px !important;\r\n\r\n  border:1px solid rgba(83,243,255,.20) !important;\r\n  border-radius:24px !important;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 100% 0%,\r\n      rgba(83,243,255,.13),\r\n      transparent 40%\r\n    ),\r\n    radial-gradient(\r\n      circle at 0% 100%,\r\n      rgba(139,92,246,.12),\r\n      transparent 42%\r\n    ),\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(13,24,52,.97),\r\n      rgba(4,8,21,.99)\r\n    ) !important;\r\n\r\n  color:#fff !important;\r\n  text-align:left !important;\r\n  cursor:pointer !important;\r\n\r\n  box-shadow:\r\n    inset 0 0 0 1px rgba(255,255,255,.025),\r\n    0 16px 35px rgba(0,0,0,.30),\r\n    0 0 20px rgba(83,243,255,.06) !important;\r\n\r\n  overflow:hidden !important;\r\n  transition:\r\n    transform .24s ease,\r\n    border-color .24s ease,\r\n    box-shadow .24s ease !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory::before{\r\n  content:\"\" !important;\r\n  position:absolute !important;\r\n  inset:0 !important;\r\n\r\n  background:\r\n    linear-gradient(\r\n      120deg,\r\n      transparent 25%,\r\n      rgba(255,255,255,.07),\r\n      transparent 55%\r\n    ) !important;\r\n\r\n  transform:translateX(-120%) !important;\r\n  transition:transform .7s ease !important;\r\n  pointer-events:none !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory:hover{\r\n  transform:translateY(-5px) !important;\r\n\r\n  border-color:rgba(83,243,255,.55) !important;\r\n\r\n  box-shadow:\r\n    0 18px 45px rgba(0,0,0,.40),\r\n    0 0 28px rgba(83,243,255,.18) !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory:hover::before{\r\n  transform:translateX(120%) !important;\r\n}\r\n\r\n\r\n\/* NUMBER *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyNumber{\r\n  position:absolute !important;\r\n  top:18px !important;\r\n  right:20px !important;\r\n\r\n  color:#ffffff !important;\r\n\r\n  font-size:2.8rem !important;\r\n  line-height:1 !important;\r\n  font-weight:900 !important;\r\n\r\n  text-shadow:\r\n    0 0 12px rgba(83,243,255,.35),\r\n    0 0 28px rgba(139,92,246,.18) !important;\r\n}\r\n\r\n\r\n\/* INDEX *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyIndex{\r\n  display:block !important;\r\n\r\n  color:rgba(83,243,255,.70) !important;\r\n\r\n  font-size:.68rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.18em !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n\r\n\/* TITLE *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory h4{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  margin:56px 0 12px !important;\r\n\r\n  color:#ffffff !important;\r\n\r\n  font-size:1.25rem !important;\r\n  line-height:1.15 !important;\r\n  font-weight:900 !important;\r\n  text-transform:uppercase !important;\r\n  letter-spacing:-.01em !important;\r\n}\r\n\r\n\r\n\/* DESCRIPTION *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyCategory p{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  margin:0 !important;\r\n\r\n  color:rgba(240,248,255,.62) !important;\r\n\r\n  font-size:.86rem !important;\r\n  line-height:1.55 !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   SAVED ITEM LIST\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyList{\r\n  display:grid !important;\r\n  gap:18px !important;\r\n  width:100% !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   SAVED ITEM CARD\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyItem{\r\n  display:grid !important;\r\n  grid-template-columns:minmax(230px,32%) minmax(0,1fr) !important;\r\n\r\n  width:100% !important;\r\n  min-height:245px !important;\r\n\r\n  overflow:hidden !important;\r\n\r\n  border:1px solid rgba(83,243,255,.16) !important;\r\n  border-radius:28px !important;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 0% 0%,\r\n      rgba(83,243,255,.10),\r\n      transparent 38%\r\n    ),\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(12,23,49,.98),\r\n      rgba(4,8,20,.99)\r\n    ) !important;\r\n\r\n  box-shadow:\r\n    0 20px 50px rgba(0,0,0,.38),\r\n    0 0 24px rgba(83,243,255,.07) !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   SAVED ITEM IMAGE\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyImage{\r\n  position:relative !important;\r\n\r\n  min-height:245px !important;\r\n\r\n  background-position:center !important;\r\n  background-size:cover !important;\r\n  background-repeat:no-repeat !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyImage::after{\r\n  content:\"\" !important;\r\n  position:absolute !important;\r\n  inset:0 !important;\r\n\r\n  background:\r\n    linear-gradient(\r\n      90deg,\r\n      transparent 55%,\r\n      rgba(4,8,20,.92) 100%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      transparent 50%,\r\n      rgba(0,0,0,.48) 100%\r\n    ) !important;\r\n\r\n  pointer-events:none !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   SAVED ITEM CONTENT\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyBody{\r\n  display:grid !important;\r\n  align-content:center !important;\r\n  gap:12px !important;\r\n\r\n  min-width:0 !important;\r\n  padding:28px !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyTop{\r\n  display:flex !important;\r\n  align-items:center !important;\r\n  justify-content:space-between !important;\r\n  gap:12px !important;\r\n}\r\n\r\n\r\n\/* TYPE *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyType{\r\n  color:#53f3ff !important;\r\n\r\n  font-size:.70rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.15em !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n\r\n\/* STATUS *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyStatus{\r\n  display:inline-flex !important;\r\n  align-items:center !important;\r\n\r\n  min-height:30px !important;\r\n  padding:0 11px !important;\r\n\r\n  border:1px solid rgba(112,247,162,.28) !important;\r\n  border-radius:999px !important;\r\n\r\n  background:rgba(112,247,162,.08) !important;\r\n\r\n  color:#baffcf !important;\r\n\r\n  font-size:.65rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.08em !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n\r\n\/* TITLE *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyTitle{\r\n  margin:0 !important;\r\n\r\n  color:#ffffff !important;\r\n\r\n  font-size:clamp(1.65rem,3vw,2.5rem) !important;\r\n  line-height:1.05 !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:-.025em !important;\r\n}\r\n\r\n\r\n\/* META *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyMeta{\r\n  color:rgba(244,210,122,.88) !important;\r\n\r\n  font-size:.88rem !important;\r\n  font-weight:800 !important;\r\n  line-height:1.55 !important;\r\n}\r\n\r\n\r\n\/* DESCRIPTION *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyDescription{\r\n  color:rgba(240,248,255,.65) !important;\r\n\r\n  font-size:.92rem !important;\r\n  line-height:1.7 !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   ACTION BUTTONS\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyActions{\r\n  display:flex !important;\r\n  flex-wrap:wrap !important;\r\n  gap:10px !important;\r\n  margin-top:6px !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyButton{\r\n  min-height:42px !important;\r\n  padding:0 15px !important;\r\n\r\n  border:1px solid rgba(83,243,255,.28) !important;\r\n  border-radius:13px !important;\r\n\r\n  background:rgba(83,243,255,.08) !important;\r\n\r\n  color:#ffffff !important;\r\n\r\n  font-size:.75rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.04em !important;\r\n\r\n  cursor:pointer !important;\r\n\r\n  transition:\r\n    background .2s ease,\r\n    border-color .2s ease,\r\n    transform .2s ease !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyButton:hover{\r\n  transform:translateY(-2px) !important;\r\n\r\n  border-color:rgba(83,243,255,.58) !important;\r\n  background:rgba(83,243,255,.17) !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyButton.is-danger{\r\n  border-color:rgba(255,107,138,.35) !important;\r\n  background:rgba(255,107,138,.09) !important;\r\n  color:#ffd7e0 !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyButton.is-danger:hover{\r\n  border-color:rgba(255,107,138,.70) !important;\r\n  background:rgba(255,107,138,.18) !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   EMPTY STATE\r\n===================================================== *\/\r\n\r\n#tc2JourneyPage .bliss-newJourneyEmpty{\r\n  padding:48px 25px !important;\r\n\r\n  border:1px dashed rgba(83,243,255,.25) !important;\r\n  border-radius:26px !important;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 50% 0%,\r\n      rgba(83,243,255,.08),\r\n      transparent 45%\r\n    ),\r\n    rgba(255,255,255,.025) !important;\r\n\r\n  text-align:center !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyEmpty h4{\r\n  margin:0 0 10px !important;\r\n  color:#fff !important;\r\n  font-size:1.5rem !important;\r\n}\r\n\r\n#tc2JourneyPage .bliss-newJourneyEmpty p{\r\n  margin:0 !important;\r\n  color:rgba(240,248,255,.60) !important;\r\n  line-height:1.65 !important;\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   TABLET\r\n===================================================== *\/\r\n\r\n@media(max-width:1050px){\r\n\r\n  #tc2JourneyPage .bliss-newJourneyDashboard{\r\n    grid-template-columns:repeat(2,minmax(0,1fr)) !important;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* =====================================================\r\n   MOBILE\r\n===================================================== *\/\r\n\r\n@media(max-width:700px){\r\n\r\n  #tc2JourneyPage .bliss-newJourneyDashboard{\r\n    grid-template-columns:1fr !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyCategory{\r\n    min-height:165px !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyItem{\r\n    grid-template-columns:1fr !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyImage{\r\n    min-height:210px !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyImage::after{\r\n    background:\r\n      linear-gradient(\r\n        180deg,\r\n        transparent 55%,\r\n        rgba(4,8,20,.94) 100%\r\n      ) !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyBody{\r\n    padding:21px !important;\r\n  }\r\n\r\n  #tc2JourneyPage .bliss-newJourneyTop{\r\n    align-items:flex-start !important;\r\n    flex-direction:column !important;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n<!-- =========================================================\r\nBLISS MY JOURNEY\r\nMOBILE SECTIONS DRAWER REPAIR V1\r\n\r\nMOBILE:\r\n- Shows a visible Sections button\r\n- Opens the Journey navigation as a drawer\r\n- Adds dark background behind drawer\r\n- Closes after selecting a section\r\n========================================================= -->\r\n\r\n<style>\r\n\r\n\/* Desktop remains unchanged *\/\r\n#tc2JourneyPage #tc2MjMobileNav{\r\n  cursor:pointer !important;\r\n}\r\n\r\n\/* Drawer backdrop *\/\r\n#tc2JourneyPage .tc2-mj-mobileBackdrop{\r\n  display:none;\r\n}\r\n\r\n@media(max-width:900px){\r\n\r\n  \/* Make sure the command area uses the full mobile width *\/\r\n  #tc2JourneyPage .tc2-mj-command{\r\n    display:block !important;\r\n    width:100% !important;\r\n    min-width:0 !important;\r\n  }\r\n\r\n  #tc2JourneyPage .tc2-mj-workspace{\r\n    width:100% !important;\r\n    min-width:0 !important;\r\n  }\r\n\r\n  \/* Keep title and Sections button visible *\/\r\n  #tc2JourneyPage .tc2-mj-workspaceTop{\r\n    position:sticky !important;\r\n    top:0 !important;\r\n    z-index:80 !important;\r\n\r\n    display:flex !important;\r\n    align-items:center !important;\r\n    justify-content:space-between !important;\r\n    gap:12px !important;\r\n\r\n    margin:0 0 16px !important;\r\n    padding:12px 4px 14px !important;\r\n\r\n    background:\r\n      linear-gradient(\r\n        180deg,\r\n        rgba(4,9,21,.98),\r\n        rgba(4,9,21,.88)\r\n      ) !important;\r\n\r\n    backdrop-filter:blur(16px) !important;\r\n    -webkit-backdrop-filter:blur(16px) !important;\r\n  }\r\n\r\n  \/* The mobile button *\/\r\n  #tc2JourneyPage #tc2MjMobileNav{\r\n    display:inline-flex !important;\r\n    align-items:center !important;\r\n    justify-content:center !important;\r\n    gap:8px !important;\r\n\r\n    flex:0 0 auto !important;\r\n    min-height:44px !important;\r\n    padding:0 17px !important;\r\n\r\n    border:1px solid rgba(83,243,255,.48) !important;\r\n    border-radius:999px !important;\r\n\r\n    background:\r\n      linear-gradient(\r\n        135deg,\r\n        rgba(83,243,255,.18),\r\n        rgba(139,92,246,.16)\r\n      ) !important;\r\n\r\n    color:#ffffff !important;\r\n\r\n    font-size:.76rem !important;\r\n    font-weight:900 !important;\r\n    letter-spacing:.08em !important;\r\n    text-transform:uppercase !important;\r\n\r\n    box-shadow:\r\n      0 0 18px rgba(83,243,255,.14),\r\n      inset 0 0 0 1px rgba(255,255,255,.035) !important;\r\n\r\n    visibility:visible !important;\r\n    opacity:1 !important;\r\n    pointer-events:auto !important;\r\n  }\r\n\r\n  #tc2JourneyPage #tc2MjMobileNav::before{\r\n    content:\"\u2630\" !important;\r\n    display:inline-block !important;\r\n    color:#53f3ff !important;\r\n    font-size:1rem !important;\r\n  }\r\n\r\n  #tc2JourneyPage #tc2MjMobileNav.is-open::before{\r\n    content:\"\u00d7\" !important;\r\n    font-size:1.3rem !important;\r\n  }\r\n\r\n  \/* Mobile sidebar becomes a fixed drawer *\/\r\n  #tc2JourneyPage .tc2-mj-sidebar{\r\n    position:fixed !important;\r\n\r\n    top:0 !important;\r\n    left:0 !important;\r\n    bottom:0 !important;\r\n\r\n    z-index:2147483646 !important;\r\n\r\n    display:grid !important;\r\n    grid-template-columns:1fr !important;\r\n    align-content:start !important;\r\n    gap:8px !important;\r\n\r\n    width:min(86vw,360px) !important;\r\n    max-width:360px !important;\r\n    height:100dvh !important;\r\n\r\n    margin:0 !important;\r\n    padding:\r\n      calc(24px + env(safe-area-inset-top))\r\n      16px\r\n      calc(28px + env(safe-area-inset-bottom)) !important;\r\n\r\n    overflow-y:auto !important;\r\n    overscroll-behavior:contain !important;\r\n\r\n    border:none !important;\r\n    border-right:1px solid rgba(83,243,255,.22) !important;\r\n    border-radius:0 26px 26px 0 !important;\r\n\r\n    background:\r\n      radial-gradient(\r\n        circle at 0% 0%,\r\n        rgba(83,243,255,.13),\r\n        transparent 34%\r\n      ),\r\n      linear-gradient(\r\n        180deg,\r\n        rgba(5,11,27,.995),\r\n        rgba(2,5,14,.995)\r\n      ) !important;\r\n\r\n    box-shadow:\r\n      30px 0 80px rgba(0,0,0,.65),\r\n      0 0 35px rgba(83,243,255,.10) !important;\r\n\r\n    transform:translateX(-110%) !important;\r\n    visibility:hidden !important;\r\n    opacity:0 !important;\r\n    pointer-events:none !important;\r\n\r\n    transition:\r\n      transform .28s ease,\r\n      opacity .22s ease,\r\n      visibility .22s ease !important;\r\n  }\r\n\r\n  #tc2JourneyPage .tc2-mj-sidebar.is-open{\r\n    transform:translateX(0) !important;\r\n    visibility:visible !important;\r\n    opacity:1 !important;\r\n    pointer-events:auto !important;\r\n  }\r\n\r\n  \/* Section buttons inside the drawer *\/\r\n  #tc2JourneyPage .tc2-mj-sidebar .tc2-mj-nav{\r\n    display:grid !important;\r\n    grid-template-columns:34px minmax(0,1fr) auto !important;\r\n    align-items:center !important;\r\n    gap:10px !important;\r\n\r\n    width:100% !important;\r\n    min-height:52px !important;\r\n    padding:11px 13px !important;\r\n\r\n    border:1px solid rgba(255,255,255,.08) !important;\r\n    border-radius:16px !important;\r\n\r\n    background:rgba(255,255,255,.035) !important;\r\n    color:#ffffff !important;\r\n\r\n    text-align:left !important;\r\n  }\r\n\r\n  #tc2JourneyPage .tc2-mj-sidebar .tc2-mj-nav.is-active{\r\n    border-color:rgba(83,243,255,.55) !important;\r\n\r\n    background:\r\n      linear-gradient(\r\n        135deg,\r\n        rgba(83,243,255,.16),\r\n        rgba(139,92,246,.13)\r\n      ) !important;\r\n\r\n    box-shadow:0 0 20px rgba(83,243,255,.10) !important;\r\n  }\r\n\r\n  \/* Full-screen backdrop *\/\r\n  #tc2JourneyPage .tc2-mj-mobileBackdrop{\r\n    position:fixed !important;\r\n    inset:0 !important;\r\n    z-index:2147483645 !important;\r\n\r\n    display:block !important;\r\n\r\n    background:rgba(0,0,0,.64) !important;\r\n    backdrop-filter:blur(4px) !important;\r\n    -webkit-backdrop-filter:blur(4px) !important;\r\n\r\n    opacity:0 !important;\r\n    visibility:hidden !important;\r\n    pointer-events:none !important;\r\n\r\n    transition:\r\n      opacity .22s ease,\r\n      visibility .22s ease !important;\r\n  }\r\n\r\n  #tc2JourneyPage .tc2-mj-mobileBackdrop.is-open{\r\n    opacity:1 !important;\r\n    visibility:visible !important;\r\n    pointer-events:auto !important;\r\n  }\r\n\r\n}\r\n\r\n@media(max-width:520px){\r\n\r\n  #tc2JourneyPage .tc2-mj-workspaceTop h3{\r\n    font-size:1.45rem !important;\r\n  }\r\n\r\n  #tc2JourneyPage #tc2MjMobileNav{\r\n    min-height:42px !important;\r\n    padding:0 13px !important;\r\n    font-size:.68rem !important;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  function journeyPage(){\r\n    return document.getElementById(\"tc2JourneyPage\");\r\n  }\r\n\r\n  function sidebar(){\r\n    const page = journeyPage();\r\n\r\n    return page\r\n      ? page.querySelector(\".tc2-mj-sidebar\")\r\n      : null;\r\n  }\r\n\r\n  function button(){\r\n    return document.getElementById(\"tc2MjMobileNav\");\r\n  }\r\n\r\n  function getBackdrop(){\r\n    const page = journeyPage();\r\n\r\n    if(!page){\r\n      return null;\r\n    }\r\n\r\n    let backdrop =\r\n      page.querySelector(\".tc2-mj-mobileBackdrop\");\r\n\r\n    if(!backdrop){\r\n      backdrop = document.createElement(\"div\");\r\n      backdrop.className = \"tc2-mj-mobileBackdrop\";\r\n      backdrop.setAttribute(\"aria-hidden\",\"true\");\r\n      page.appendChild(backdrop);\r\n    }\r\n\r\n    return backdrop;\r\n  }\r\n\r\n  function setOpen(shouldOpen){\r\n    const nav = sidebar();\r\n    const trigger = button();\r\n    const backdrop = getBackdrop();\r\n\r\n    if(!nav){\r\n      return;\r\n    }\r\n\r\n    nav.classList.toggle(\r\n      \"is-open\",\r\n      Boolean(shouldOpen)\r\n    );\r\n\r\n    if(trigger){\r\n      trigger.classList.toggle(\r\n        \"is-open\",\r\n        Boolean(shouldOpen)\r\n      );\r\n\r\n      trigger.setAttribute(\r\n        \"aria-expanded\",\r\n        shouldOpen ? \"true\" : \"false\"\r\n      );\r\n\r\n      trigger.textContent =\r\n        shouldOpen\r\n          ? \"Close\"\r\n          : \"Sections\";\r\n    }\r\n\r\n    if(backdrop){\r\n      backdrop.classList.toggle(\r\n        \"is-open\",\r\n        Boolean(shouldOpen)\r\n      );\r\n\r\n      backdrop.setAttribute(\r\n        \"aria-hidden\",\r\n        shouldOpen ? \"false\" : \"true\"\r\n      );\r\n    }\r\n\r\n    document.body.classList.toggle(\r\n      \"tc2-journey-mobile-nav-open\",\r\n      Boolean(shouldOpen)\r\n    );\r\n  }\r\n\r\n  function toggle(){\r\n    const nav = sidebar();\r\n\r\n    setOpen(\r\n      !(\r\n        nav &&\r\n        nav.classList.contains(\"is-open\")\r\n      )\r\n    );\r\n  }\r\n\r\n  \/*\r\n   * Capture mode makes this final mobile repair run\r\n   * before older Journey click handlers.\r\n   *\/\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const target = event.target;\r\n\r\n      if(\r\n        !target ||\r\n        typeof target.closest !== \"function\"\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const trigger =\r\n        target.closest(\"#tc2MjMobileNav\");\r\n\r\n      if(trigger){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        toggle();\r\n        return;\r\n      }\r\n\r\n      const backdrop =\r\n        target.closest(\".tc2-mj-mobileBackdrop\");\r\n\r\n      if(backdrop){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        setOpen(false);\r\n        return;\r\n      }\r\n\r\n      const section =\r\n        target.closest(\r\n          \"#tc2JourneyPage .tc2-mj-sidebar [data-mj-view]\"\r\n        );\r\n\r\n      if(section && window.innerWidth <= 900){\r\n        setTimeout(\r\n          function(){\r\n            setOpen(false);\r\n          },\r\n          20\r\n        );\r\n      }\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"keydown\",\r\n    function(event){\r\n      if(event.key === \"Escape\"){\r\n        setOpen(false);\r\n      }\r\n    }\r\n  );\r\n\r\n  window.addEventListener(\r\n    \"resize\",\r\n    function(){\r\n      if(window.innerWidth > 900){\r\n        setOpen(false);\r\n      }\r\n    }\r\n  );\r\n\r\n  const trigger = button();\r\n\r\n  if(trigger){\r\n    trigger.setAttribute(\r\n      \"aria-expanded\",\r\n      \"false\"\r\n    );\r\n\r\n    trigger.setAttribute(\r\n      \"aria-controls\",\r\n      \"tc2JourneyMobileSections\"\r\n    );\r\n  }\r\n\r\n  const nav = sidebar();\r\n\r\n  if(nav){\r\n    nav.id = \"tc2JourneyMobileSections\";\r\n  }\r\n\r\n  getBackdrop();\r\n\r\n  window.BlissJourneyMobileSections = {\r\n    open:function(){\r\n      setOpen(true);\r\n    },\r\n    close:function(){\r\n      setOpen(false);\r\n    },\r\n    toggle:toggle\r\n  };\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS MY JOURNEY\r\nSEND FULL JOURNEY TO CONCIERGE V1\r\n========================================================= -->\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  let submissionInProgress = false;\r\n\r\n  function getConfig() {\r\n    return window.BlissJourneyMemberConfig || {};\r\n  }\r\n\r\n  function findSubmitButton(target) {\r\n    if (!target || !target.closest) {\r\n      return null;\r\n    }\r\n\r\n    return target.closest(\r\n      [\r\n        \"#tc2SendFullJourney\",\r\n        \"#tc2SendJourneyToConcierge\",\r\n        \"#tc2SubmitJourney\",\r\n        \"[data-bliss-submit-full-journey]\",\r\n        '[data-mj-action=\"submit-full-journey\"]'\r\n      ].join(\",\")\r\n    );\r\n  }\r\n\r\n  function setButtonLoading(button, loading) {\r\n    if (!button) {\r\n      return;\r\n    }\r\n\r\n    if (loading) {\r\n      button.dataset.originalText =\r\n        button.dataset.originalText ||\r\n        button.textContent.trim();\r\n\r\n      button.disabled = true;\r\n      button.setAttribute(\"aria-busy\", \"true\");\r\n      button.textContent = \"Sending Journey to Bliss...\";\r\n    } else {\r\n      button.disabled = false;\r\n      button.removeAttribute(\"aria-busy\");\r\n\r\n      if (button.dataset.originalText) {\r\n        button.textContent = button.dataset.originalText;\r\n      }\r\n    }\r\n  }\r\n\r\n  function showJourneyMessage(message, type) {\r\n    const messageBox =\r\n      document.getElementById(\"tc2JourneySubmitMessage\") ||\r\n      document.querySelector(\"[data-bliss-journey-message]\");\r\n\r\n    if (messageBox) {\r\n      messageBox.hidden = false;\r\n      messageBox.textContent = message;\r\n      messageBox.dataset.status = type || \"info\";\r\n      return;\r\n    }\r\n\r\n    alert(message);\r\n  }\r\n\r\n  async function submitFullJourney(button) {\r\n    if (submissionInProgress) {\r\n      return;\r\n    }\r\n\r\n    const config = getConfig();\r\n\r\n    if (!config.loggedIn) {\r\n      showJourneyMessage(\r\n        \"Please sign in before sending your Journey to Bliss.\",\r\n        \"error\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    if (!config.hasLevel2) {\r\n      showJourneyMessage(\r\n        \"Sending your Journey to Concierge requires Travel Club Level 2.\",\r\n        \"error\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    if (!config.ajaxUrl || !config.nonce) {\r\n      showJourneyMessage(\r\n        \"The Journey connection is unavailable. Please refresh the page and try again.\",\r\n        \"error\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    const journeyItems =\r\n      window.BlissJourneyAccount &&\r\n      typeof window.BlissJourneyAccount.read === \"function\"\r\n        ? window.BlissJourneyAccount.read()\r\n        : [];\r\n\r\n    if (!Array.isArray(journeyItems) || journeyItems.length === 0) {\r\n      showJourneyMessage(\r\n        \"Your Journey is empty. Add at least one selection before sending it to Bliss.\",\r\n        \"error\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    submissionInProgress = true;\r\n    setButtonLoading(button, true);\r\n\r\n    try {\r\n      const body = new URLSearchParams();\r\n\r\n      body.set(\r\n        \"action\",\r\n        \"bliss_member_submit_full_journey\"\r\n      );\r\n\r\n      body.set(\r\n        \"nonce\",\r\n        config.nonce\r\n      );\r\n\r\n      const response = await fetch(\r\n        config.ajaxUrl,\r\n        {\r\n          method: \"POST\",\r\n          credentials: \"same-origin\",\r\n          headers: {\r\n            \"Content-Type\":\r\n              \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n          },\r\n          body: body.toString()\r\n        }\r\n      );\r\n\r\n      const result = await response.json();\r\n\r\n      if (!response.ok || !result || result.success !== true) {\r\n        const errorMessage =\r\n          result &&\r\n          result.data &&\r\n          result.data.message\r\n            ? result.data.message\r\n            : \"Your Journey could not be sent to Bliss.\";\r\n\r\n        throw new Error(errorMessage);\r\n      }\r\n\r\n      const data = result.data || {};\r\n\r\n      \/*\r\n       * Reload the account Journey so the browser immediately\r\n       * receives the new Requested statuses from WordPress.\r\n       *\/\r\n      if (\r\n        window.BlissJourneyAccount &&\r\n        typeof window.BlissJourneyAccount.load === \"function\"\r\n      ) {\r\n        await window.BlissJourneyAccount.load(true);\r\n      }\r\n\r\n      \/*\r\n       * Redraw My Journey after the statuses update.\r\n       *\/\r\n      \r\n\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissJourneySubmitted\",\r\n          {\r\n            detail: data\r\n          }\r\n        )\r\n      );\r\n\r\n      showJourneyMessage(\r\n        data.message ||\r\n        \"Your full Journey was sent to Bliss. Our Concierge team can now review your requests.\",\r\n        \"success\"\r\n      );\r\n\r\n      button.textContent = \"Journey Sent to Bliss\";\r\n      button.disabled = true;\r\n      button.setAttribute(\r\n        \"data-journey-submitted\",\r\n        \"true\"\r\n      );\r\n\r\n    } catch (error) {\r\n      console.error(\r\n        \"BLISS FULL JOURNEY SUBMISSION ERROR:\",\r\n        error\r\n      );\r\n\r\n      showJourneyMessage(\r\n        error.message ||\r\n        \"Your Journey could not be sent. Please try again.\",\r\n        \"error\"\r\n      );\r\n\r\n      setButtonLoading(button, false);\r\n    } finally {\r\n      submissionInProgress = false;\r\n    }\r\n  }\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function (event) {\r\n      let button = findSubmitButton(event.target);\r\n\r\n      \/*\r\n       * Backup detection for the existing button when it has\r\n       * no ID or data attribute yet.\r\n       *\/\r\n      if (!button && event.target.closest) {\r\n        const possibleButton =\r\n          event.target.closest(\"button, a\");\r\n\r\n        if (possibleButton) {\r\n          const text =\r\n            possibleButton.textContent\r\n              .trim()\r\n              .toLowerCase();\r\n\r\n          if (\r\n            text.includes(\"send full journey\") ||\r\n            text.includes(\"send journey request\") ||\r\n            text.includes(\"send to bliss concierge\")\r\n          ) {\r\n            button = possibleButton;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!button) {\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n\r\n      submitFullJourney(button);\r\n    },\r\n    true\r\n  );\r\n\r\n  window.BlissSubmitFullJourney =\r\n    submitFullJourney;\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nLOCAL SERVICES \u2192 CONTROL PANEL SERVER CONNECTION V1\r\n\r\nPASTE AT THE VERY BOTTOM OF THE TRAVEL CLUB PAGE\r\n\r\nREADS:\r\nwindow.travelClubInventory\r\n\r\nCONTROL PANEL FORMAT:\r\nsection: \"services\"\r\nservice: \"Private Driver\"\r\nhost\/provider information\r\n\r\nCONNECTS:\r\n- Dynamic service options\r\n- Dynamic providers\r\n- Visit Website\r\n- Save to My Journey\r\n- Reserve With Bliss\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   CONNECTED LOCAL SERVICES\r\n========================================================= *\/\r\n\r\n#tc2ServicesGrid.bliss-services-connected{\r\n  display:grid !important;\r\n  grid-template-columns:\r\n    repeat(auto-fit,minmax(220px,1fr));\r\n  gap:16px;\r\n  width:100%;\r\n}\r\n\r\n#tc2ServicesGrid .bliss-service-option{\r\n  appearance:none;\r\n  width:100%;\r\n  min-height:185px;\r\n  position:relative;\r\n  overflow:hidden;\r\n  padding:22px;\r\n  border-radius:26px;\r\n  border:1px solid rgba(83,243,255,.22);\r\n  background:\r\n    radial-gradient(\r\n      circle at top left,\r\n      rgba(83,243,255,.13),\r\n      transparent 38%\r\n    ),\r\n    radial-gradient(\r\n      circle at bottom right,\r\n      rgba(139,92,246,.12),\r\n      transparent 42%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(11,22,46,.96),\r\n      rgba(2,6,17,.99)\r\n    );\r\n  color:#f8fbff;\r\n  text-align:left;\r\n  cursor:pointer;\r\n  box-shadow:\r\n    inset 0 0 0 1px rgba(255,255,255,.025),\r\n    0 18px 40px rgba(0,0,0,.28);\r\n  transition:\r\n    transform .24s ease,\r\n    border-color .24s ease,\r\n    box-shadow .24s ease;\r\n}\r\n\r\n#tc2ServicesGrid .bliss-service-option:hover,\r\n#tc2ServicesGrid .bliss-service-option.is-selected{\r\n  transform:translateY(-4px);\r\n  border-color:rgba(83,243,255,.75);\r\n  box-shadow:\r\n    0 0 24px rgba(83,243,255,.16),\r\n    0 22px 48px rgba(0,0,0,.38);\r\n}\r\n\r\n#tc2ServicesGrid .bliss-service-option.is-selected{\r\n  background:\r\n    radial-gradient(\r\n      circle at top left,\r\n      rgba(83,243,255,.20),\r\n      transparent 42%\r\n    ),\r\n    radial-gradient(\r\n      circle at bottom right,\r\n      rgba(139,92,246,.18),\r\n      transparent 45%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(12,30,58,.98),\r\n      rgba(3,8,22,.99)\r\n    );\r\n}\r\n\r\n.bliss-service-number{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  min-width:38px;\r\n  height:30px;\r\n  padding:0 10px;\r\n  margin-bottom:20px;\r\n  border-radius:999px;\r\n  border:1px solid rgba(83,243,255,.32);\r\n  background:rgba(83,243,255,.08);\r\n  color:#53f3ff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n}\r\n\r\n.bliss-service-option h3{\r\n  margin:0 0 10px;\r\n  color:#fff;\r\n  font-size:1.18rem;\r\n  line-height:1.25;\r\n}\r\n\r\n.bliss-service-option p{\r\n  margin:0;\r\n  color:rgba(248,251,255,.66);\r\n  font-size:.9rem;\r\n  line-height:1.55;\r\n}\r\n\r\n.bliss-service-option .bliss-service-count{\r\n  display:inline-flex;\r\n  margin-top:17px;\r\n  padding:7px 11px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.055);\r\n  border:1px solid rgba(255,255,255,.08);\r\n  color:rgba(248,251,255,.82);\r\n  font-size:.75rem;\r\n  font-weight:800;\r\n}\r\n\r\n\/* Provider results *\/\r\n\r\n#tc2ServicePreview.bliss-provider-preview{\r\n  display:block;\r\n  width:100%;\r\n}\r\n\r\n.bliss-provider-heading{\r\n  margin-bottom:18px;\r\n  padding:20px;\r\n  border-radius:24px;\r\n  border:1px solid rgba(83,243,255,.16);\r\n  background:\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(10,20,42,.92),\r\n      rgba(3,8,20,.96)\r\n    );\r\n}\r\n\r\n.bliss-provider-heading span{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:#53f3ff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bliss-provider-heading h3{\r\n  margin:0 0 8px;\r\n  color:#fff;\r\n  font-size:clamp(1.45rem,4vw,2.15rem);\r\n}\r\n\r\n.bliss-provider-heading p{\r\n  margin:0;\r\n  color:rgba(248,251,255,.68);\r\n  line-height:1.6;\r\n}\r\n\r\n.bliss-provider-grid{\r\n  display:grid;\r\n  grid-template-columns:\r\n    repeat(auto-fit,minmax(270px,1fr));\r\n  gap:18px;\r\n}\r\n\r\n.bliss-provider-card{\r\n  overflow:hidden;\r\n  border-radius:28px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  background:\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(12,21,44,.96),\r\n      rgba(3,8,20,.99)\r\n    );\r\n  box-shadow:0 20px 55px rgba(0,0,0,.34);\r\n}\r\n\r\n.bliss-provider-media{\r\n  position:relative;\r\n  width:100%;\r\n  aspect-ratio:16\/10;\r\n  overflow:hidden;\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      rgba(83,243,255,.12),\r\n      rgba(139,92,246,.14)\r\n    );\r\n}\r\n\r\n.bliss-provider-media img{\r\n  width:100%;\r\n  height:100%;\r\n  object-fit:cover;\r\n  display:block;\r\n  transition:transform .4s ease;\r\n}\r\n\r\n.bliss-provider-card:hover\r\n.bliss-provider-media img{\r\n  transform:scale(1.045);\r\n}\r\n\r\n.bliss-provider-featured{\r\n  position:absolute;\r\n  top:13px;\r\n  left:13px;\r\n  padding:7px 11px;\r\n  border-radius:999px;\r\n  background:rgba(2,5,13,.82);\r\n  border:1px solid rgba(244,210,122,.48);\r\n  color:#f4d27a;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.1em;\r\n  text-transform:uppercase;\r\n  backdrop-filter:blur(12px);\r\n}\r\n\r\n.bliss-provider-body{\r\n  padding:20px;\r\n}\r\n\r\n.bliss-provider-type{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:#53f3ff;\r\n  font-size:.7rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bliss-provider-body h4{\r\n  margin:0 0 9px;\r\n  color:#fff;\r\n  font-size:1.25rem;\r\n}\r\n\r\n.bliss-provider-location{\r\n  margin-bottom:12px;\r\n  color:rgba(248,251,255,.58);\r\n  font-size:.83rem;\r\n}\r\n\r\n.bliss-provider-description{\r\n  min-height:48px;\r\n  margin:0 0 16px;\r\n  color:rgba(248,251,255,.72);\r\n  line-height:1.58;\r\n  font-size:.91rem;\r\n}\r\n\r\n.bliss-provider-meta{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:7px;\r\n  margin-bottom:17px;\r\n}\r\n\r\n.bliss-provider-chip{\r\n  padding:6px 9px;\r\n  border-radius:999px;\r\n  border:1px solid rgba(255,255,255,.09);\r\n  background:rgba(255,255,255,.045);\r\n  color:rgba(248,251,255,.72);\r\n  font-size:.72rem;\r\n}\r\n\r\n.bliss-provider-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:9px;\r\n}\r\n\r\n.bliss-provider-actions .tc2-btn{\r\n  flex:1 1 145px;\r\n}\r\n\r\n.bliss-service-empty{\r\n  padding:26px;\r\n  border-radius:26px;\r\n  border:1px dashed rgba(83,243,255,.25);\r\n  background:rgba(255,255,255,.025);\r\n  text-align:center;\r\n}\r\n\r\n.bliss-service-empty h3{\r\n  margin:0 0 10px;\r\n  color:#fff;\r\n}\r\n\r\n.bliss-service-empty p{\r\n  margin:0;\r\n  color:rgba(248,251,255,.66);\r\n  line-height:1.65;\r\n}\r\n\r\n.bliss-service-loading{\r\n  padding:28px;\r\n  border-radius:26px;\r\n  border:1px solid rgba(83,243,255,.17);\r\n  background:rgba(255,255,255,.025);\r\n  color:rgba(248,251,255,.76);\r\n  text-align:center;\r\n}\r\n\r\n@media(max-width:700px){\r\n  #tc2ServicesGrid.bliss-services-connected{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .bliss-provider-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .bliss-provider-actions{\r\n    flex-direction:column;\r\n  }\r\n\r\n  .bliss-provider-actions .tc2-btn{\r\n    width:100%;\r\n    flex:none;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  \/* =========================================================\r\n     CONFIGURATION\r\n  ========================================================= *\/\r\n\r\n  const DEFAULT_IMAGE =\r\n    \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n\r\n  const CONTROL_PANEL_SERVICES = [\r\n    {\r\n      name:\"Private Driver\",\r\n      description:\r\n        \"Airport pickups, city movement, private routes and dedicated transportation.\"\r\n    },\r\n    {\r\n      name:\"Concierge\",\r\n      description:\r\n        \"Personal support coordinating plans, reservations and special travel needs.\"\r\n    },\r\n    {\r\n      name:\"Translator\",\r\n      description:\r\n        \"Language support for appointments, meetings, experiences and local services.\"\r\n    },\r\n    {\r\n      name:\"Local Guide\",\r\n      description:\r\n        \"Local experts for culture, food, neighborhoods, nature and private experiences.\"\r\n    },\r\n    {\r\n      name:\"Nightlife Help\",\r\n      description:\r\n        \"Support with nightlife routes, tables, drivers, access and safe movement.\"\r\n    },\r\n    {\r\n      name:\"Reservations\",\r\n      description:\r\n        \"Restaurants, rooftops, attractions, entertainment and private access.\"\r\n    },\r\n    {\r\n      name:\"Security Support\",\r\n      description:\r\n        \"Discreet security and higher-touch support for movement, events and travel.\"\r\n    },\r\n    {\r\n      name:\"VIP Custom Support\",\r\n      description:\r\n        \"A flexible private service for requests that do not fit a standard category.\"\r\n    }\r\n  ];\r\n\r\n  let selectedService = \"\";\r\n  let lastInventorySignature = \"\";\r\n\r\n  \/* =========================================================\r\n     HELPERS\r\n  ========================================================= *\/\r\n\r\n  function normalize(value){\r\n    return String(value == null ? \"\" : value)\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(\/&\/g,\"and\")\r\n      .replace(\/[^a-z0-9]+\/g,\" \")\r\n      .replace(\/\\s+\/g,\" \")\r\n      .trim();\r\n  }\r\n\r\n  function escapeHTML(value){\r\n    return String(value == null ? \"\" : value)\r\n      .replace(\/[&<>\"']\/g,function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      });\r\n  }\r\n\r\n  function safeURL(value){\r\n    const raw =\r\n      String(value || \"\").trim();\r\n\r\n    if(!raw){\r\n      return \"\";\r\n    }\r\n\r\n    try{\r\n      const url =\r\n        new URL(raw,window.location.origin);\r\n\r\n      if(\r\n        url.protocol !== \"http:\" &&\r\n        url.protocol !== \"https:\"\r\n      ){\r\n        return \"\";\r\n      }\r\n\r\n      return url.href;\r\n    }catch(error){\r\n      return \"\";\r\n    }\r\n  }\r\n\r\n  function booleanValue(value){\r\n    return !(\r\n      value === false ||\r\n      value === 0 ||\r\n      value === \"0\" ||\r\n      value === \"false\" ||\r\n      value === \"inactive\" ||\r\n      value === \"hidden\"\r\n    );\r\n  }\r\n\r\n  function unique(values){\r\n    const found = new Set();\r\n\r\n    return values.filter(function(value){\r\n      const key = normalize(value);\r\n\r\n      if(!key || found.has(key)){\r\n        return false;\r\n      }\r\n\r\n      found.add(key);\r\n      return true;\r\n    });\r\n  }\r\n\r\n  function showMessage(title,message){\r\n    const modal =\r\n      document.getElementById(\"tc2Modal\");\r\n\r\n    const modalTitle =\r\n      document.getElementById(\"tc2ModalTitle\");\r\n\r\n    const modalText =\r\n      document.getElementById(\"tc2ModalText\");\r\n\r\n    if(modal && modalTitle && modalText){\r\n      modalTitle.textContent = title;\r\n      modalText.textContent = message;\r\n      modal.classList.add(\"open\");\r\n      return;\r\n    }\r\n\r\n    alert(\r\n      title + \"\\n\\n\" + message\r\n    );\r\n  }\r\n\r\n  \/* =========================================================\r\n     INVENTORY CONNECTION\r\n  ========================================================= *\/\r\n\r\n  function isServicesSection(host){\r\n    const section =\r\n      normalize(\r\n        host &&\r\n        (\r\n          host.section ||\r\n          host.ecosystem ||\r\n          host.module\r\n        )\r\n      );\r\n\r\n    return (\r\n      section === \"services\" ||\r\n      section === \"service\" ||\r\n      section === \"local services\" ||\r\n      section === \"local service\"\r\n    );\r\n  }\r\n\r\n  function serviceNameFromHost(host){\r\n    if(!host){\r\n      return \"\";\r\n    }\r\n\r\n    const direct =\r\n      host.service ||\r\n      host.category ||\r\n      host.parent ||\r\n      host.serviceType ||\r\n      host.type ||\r\n      \"\";\r\n\r\n    if(direct){\r\n      return String(direct).trim();\r\n    }\r\n\r\n    const key =\r\n      String(\r\n        host.serviceKey ||\r\n        host.routeKey ||\r\n        \"\"\r\n      );\r\n\r\n    if(key.includes(\"|\")){\r\n      return key.split(\"|\").pop().trim();\r\n    }\r\n\r\n    return key.trim();\r\n  }\r\n\r\n  function readServerProviders(){\r\n    const inventory =\r\n      Array.isArray(window.travelClubInventory)\r\n        ? window.travelClubInventory\r\n        : [];\r\n\r\n    const seen = new Set();\r\n\r\n    return inventory\r\n      .filter(function(host){\r\n\r\n        if(!host || !isServicesSection(host)){\r\n          return false;\r\n        }\r\n\r\n        if(!booleanValue(host.active)){\r\n          return false;\r\n        }\r\n\r\n        const id =\r\n          String(\r\n            host.id ||\r\n            [\r\n              host.section,\r\n              serviceNameFromHost(host),\r\n              host.name,\r\n              host.title\r\n            ].join(\"|\")\r\n          );\r\n\r\n        if(seen.has(id)){\r\n          return false;\r\n        }\r\n\r\n        seen.add(id);\r\n        return true;\r\n      })\r\n      .sort(function(a,b){\r\n\r\n        if(\r\n          Boolean(a.featured) !==\r\n          Boolean(b.featured)\r\n        ){\r\n          return a.featured ? -1 : 1;\r\n        }\r\n\r\n        return (\r\n          Number(a.order || 10) -\r\n          Number(b.order || 10)\r\n        );\r\n      });\r\n  }\r\n\r\n  function providerID(host){\r\n    return String(\r\n      host.id ||\r\n      [\r\n        host.section,\r\n        serviceNameFromHost(host),\r\n        host.name,\r\n        host.title\r\n      ].join(\"|\")\r\n    );\r\n  }\r\n\r\n  function findProvider(id){\r\n    return readServerProviders()\r\n      .find(function(host){\r\n        return providerID(host) === String(id);\r\n      }) || null;\r\n  }\r\n\r\n  function providersForService(serviceName){\r\n    const requested =\r\n      normalize(serviceName);\r\n\r\n    return readServerProviders()\r\n      .filter(function(host){\r\n        return (\r\n          normalize(\r\n            serviceNameFromHost(host)\r\n          ) === requested\r\n        );\r\n      });\r\n  }\r\n\r\n  \/* =========================================================\r\n     SERVICE DEFINITIONS\r\n\r\n     Includes the Control Panel's eight normal options,\r\n     plus any future service name discovered in inventory.\r\n  ========================================================= *\/\r\n\r\n  function allServiceDefinitions(){\r\n    const known =\r\n      CONTROL_PANEL_SERVICES.map(function(service){\r\n        return {\r\n          name:service.name,\r\n          description:service.description\r\n        };\r\n      });\r\n\r\n    const knownNames =\r\n      new Set(\r\n        known.map(function(service){\r\n          return normalize(service.name);\r\n        })\r\n      );\r\n\r\n    readServerProviders()\r\n      .forEach(function(host){\r\n        const name =\r\n          serviceNameFromHost(host);\r\n\r\n        const key =\r\n          normalize(name);\r\n\r\n        if(name && !knownNames.has(key)){\r\n          knownNames.add(key);\r\n\r\n          known.push({\r\n            name:name,\r\n            description:\r\n              \"Connected Local Service providers available through Bliss.\"\r\n          });\r\n        }\r\n      });\r\n\r\n    return known;\r\n  }\r\n\r\n  \/* =========================================================\r\n     SERVICE OPTIONS\r\n  ========================================================= *\/\r\n\r\n  function serviceOptionHTML(service,index){\r\n    const providers =\r\n      providersForService(service.name);\r\n\r\n    const selected =\r\n      normalize(selectedService) ===\r\n      normalize(service.name);\r\n\r\n    return `\r\n      <button\r\n        class=\"bliss-service-option ${\r\n          selected ? \"is-selected\" : \"\"\r\n        }\"\r\n        data-bliss-service-option=\"${\r\n          escapeHTML(service.name)\r\n        }\"\r\n        type=\"button\">\r\n\r\n        <span class=\"bliss-service-number\">\r\n          ${String(index + 1).padStart(2,\"0\")}\r\n        <\/span>\r\n\r\n        <h3>\r\n          ${escapeHTML(service.name)}\r\n        <\/h3>\r\n\r\n        <p>\r\n          ${escapeHTML(service.description)}\r\n        <\/p>\r\n\r\n        <span class=\"bliss-service-count\">\r\n          ${\r\n            providers.length === 1\r\n              ? \"1 Connected Provider\"\r\n              : providers.length +\r\n                \" Connected Providers\"\r\n          }\r\n        <\/span>\r\n      <\/button>\r\n    `;\r\n  }\r\n\r\n  function renderServiceOptions(){\r\n    const grid =\r\n      document.getElementById(\r\n        \"tc2ServicesGrid\"\r\n      );\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n    const services =\r\n      allServiceDefinitions();\r\n\r\n    grid.classList.add(\r\n      \"bliss-services-connected\"\r\n    );\r\n\r\n    grid.innerHTML =\r\n      services\r\n        .map(serviceOptionHTML)\r\n        .join(\"\");\r\n  }\r\n\r\n  \/* =========================================================\r\n     PROVIDER CARDS\r\n  ========================================================= *\/\r\n\r\n  function providerLanguages(host){\r\n    if(Array.isArray(host.languages)){\r\n      return unique(host.languages);\r\n    }\r\n\r\n    const raw =\r\n      host.languages ||\r\n      host.language ||\r\n      \"\";\r\n\r\n    return unique(\r\n      String(raw)\r\n        .split(\/[,|\/]+\/)\r\n        .map(function(value){\r\n          return value.trim();\r\n        })\r\n    );\r\n  }\r\n\r\n  function providerImage(host){\r\n    if(host.image){\r\n      return host.image;\r\n    }\r\n\r\n    if(\r\n      Array.isArray(host.images) &&\r\n      host.images.length\r\n    ){\r\n      const first =\r\n        host.images[0];\r\n\r\n      if(typeof first === \"string\"){\r\n        return first;\r\n      }\r\n\r\n      if(first && first.url){\r\n        return first.url;\r\n      }\r\n    }\r\n\r\n    return DEFAULT_IMAGE;\r\n  }\r\n\r\n  function providerCardHTML(host){\r\n    const id =\r\n      providerID(host);\r\n\r\n    const service =\r\n      serviceNameFromHost(host) ||\r\n      selectedService ||\r\n      \"Local Service\";\r\n\r\n    const title =\r\n      host.name ||\r\n      host.title ||\r\n      service + \" Provider\";\r\n\r\n    const description =\r\n      host.description ||\r\n      host.desc ||\r\n      host.shortExplanation ||\r\n      host.explanation ||\r\n      service +\r\n        \" provider connected through Bliss Local Services.\";\r\n\r\n    const location =\r\n      host.location ||\r\n      host.city ||\r\n      \"MedaYork \u00b7 Medell\u00edn\";\r\n\r\n    const website =\r\n      safeURL(\r\n        host.websiteUrl ||\r\n        host.website ||\r\n        host.url ||\r\n        \"\"\r\n      );\r\n\r\n    const languages =\r\n      providerLanguages(host);\r\n\r\n    const availability =\r\n      host.availability ||\r\n      host.schedule ||\r\n      \"\";\r\n\r\n    return `\r\n      <article class=\"bliss-provider-card\">\r\n\r\n        <div class=\"bliss-provider-media\">\r\n          <img decoding=\"async\"\r\n            src=\"${escapeHTML(providerImage(host))}\"\r\n            alt=\"${escapeHTML(title)}\"\r\n            loading=\"lazy\"\r\n          >\r\n\r\n          ${\r\n            host.featured\r\n              ? `\r\n                <span class=\"bliss-provider-featured\">\r\n                  Featured Provider\r\n                <\/span>\r\n              `\r\n              : \"\"\r\n          }\r\n        <\/div>\r\n\r\n        <div class=\"bliss-provider-body\">\r\n\r\n          <span class=\"bliss-provider-type\">\r\n            ${escapeHTML(service)}\r\n          <\/span>\r\n\r\n          <h4>\r\n            ${escapeHTML(title)}\r\n          <\/h4>\r\n\r\n          <div class=\"bliss-provider-location\">\r\n            ${escapeHTML(location)}\r\n          <\/div>\r\n\r\n          <p class=\"bliss-provider-description\">\r\n            ${escapeHTML(description)}\r\n          <\/p>\r\n\r\n          ${\r\n            languages.length ||\r\n            availability\r\n              ? `\r\n                <div class=\"bliss-provider-meta\">\r\n\r\n                  ${languages.map(function(language){\r\n                    return `\r\n                      <span class=\"bliss-provider-chip\">\r\n                        ${escapeHTML(language)}\r\n                      <\/span>\r\n                    `;\r\n                  }).join(\"\")}\r\n\r\n                  ${\r\n                    availability\r\n                      ? `\r\n                        <span class=\"bliss-provider-chip\">\r\n                          ${escapeHTML(availability)}\r\n                        <\/span>\r\n                      `\r\n                      : \"\"\r\n                  }\r\n\r\n                <\/div>\r\n              `\r\n              : \"\"\r\n          }\r\n\r\n          <div class=\"bliss-provider-actions\">\r\n\r\n            ${\r\n              website\r\n                ? `\r\n                  <button\r\n                    class=\"tc2-btn tc2-btn-outline\"\r\n                    data-bliss-provider-website=\"${\r\n                      escapeHTML(id)\r\n                    }\"\r\n                    type=\"button\">\r\n                    Visit Host Website\r\n                  <\/button>\r\n                `\r\n                : \"\"\r\n            }\r\n\r\n            <button\r\n              class=\"tc2-btn tc2-btn-gold\"\r\n              data-bliss-provider-save=\"${\r\n                escapeHTML(id)\r\n              }\"\r\n              type=\"button\">\r\n              Save to My Journey\r\n            <\/button>\r\n\r\n            <button\r\n              class=\"tc2-btn tc2-btn-cyan\"\r\n              data-bliss-provider-reserve=\"${\r\n                escapeHTML(id)\r\n              }\"\r\n              type=\"button\">\r\n              Reserve With Bliss\r\n            <\/button>\r\n\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function renderProviders(serviceName){\r\n    const preview =\r\n      document.getElementById(\r\n        \"tc2ServicePreview\"\r\n      );\r\n\r\n    if(!preview){\r\n      return;\r\n    }\r\n\r\n    selectedService =\r\n      String(serviceName || \"\").trim();\r\n\r\n    renderServiceOptions();\r\n\r\n    const providers =\r\n      providersForService(\r\n        selectedService\r\n      );\r\n\r\n    preview.classList.add(\r\n      \"bliss-provider-preview\"\r\n    );\r\n\r\n    if(!providers.length){\r\n      preview.innerHTML = `\r\n        <div class=\"bliss-service-empty\">\r\n          <h3>\r\n            ${escapeHTML(selectedService)}\r\n          <\/h3>\r\n\r\n          <p>\r\n            There are no active providers connected to this\r\n            service yet. Add a provider in the Control Panel\r\n            under Local Services, select\r\n            <strong>${escapeHTML(selectedService)}<\/strong>,\r\n            and press Save All to Website.\r\n          <\/p>\r\n        <\/div>\r\n      `;\r\n\r\n      updateSelectedServiceFields(\r\n        selectedService\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    preview.innerHTML = `\r\n      <div class=\"bliss-provider-heading\">\r\n        <span>Connected through the Control Panel<\/span>\r\n\r\n        <h3>\r\n          ${escapeHTML(selectedService)}\r\n        <\/h3>\r\n\r\n        <p>\r\n          ${\r\n            providers.length === 1\r\n              ? \"1 active provider is available.\"\r\n              : providers.length +\r\n                \" active providers are available.\"\r\n          }\r\n          Choose a provider to visit its website,\r\n          save it to My Journey, or request service\r\n          through Bliss.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bliss-provider-grid\">\r\n        ${providers.map(providerCardHTML).join(\"\")}\r\n      <\/div>\r\n    `;\r\n\r\n    updateSelectedServiceFields(\r\n      selectedService\r\n    );\r\n  }\r\n\r\n  function updateSelectedServiceFields(serviceName){\r\n    const chip =\r\n      document.getElementById(\r\n        \"tc2ServiceTypeChip\"\r\n      );\r\n\r\n    const notes =\r\n      document.getElementById(\r\n        \"tc2ServiceShortNotes\"\r\n      );\r\n\r\n    if(chip){\r\n      chip.textContent =\r\n        serviceName + \" Selected\";\r\n    }\r\n\r\n    if(notes && !notes.value.trim()){\r\n      notes.value =\r\n        \"I need help with \" +\r\n        serviceName +\r\n        \".\";\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     MY JOURNEY CONNECTION\r\n  ========================================================= *\/\r\n\r\n  function journeyItemFromProvider(\r\n    host,\r\n    status\r\n  ){\r\n    const service =\r\n      serviceNameFromHost(host) ||\r\n      selectedService ||\r\n      \"Local Service\";\r\n\r\n    const requested =\r\n      status === \"Requested\";\r\n\r\n    return {\r\n      journeyId:\r\n        \"service-host|\" +\r\n        providerID(host),\r\n\r\n      hostId:\r\n        providerID(host),\r\n\r\n      source:\r\n        \"local-services\",\r\n\r\n      requestSource:\r\n        requested\r\n          ? \"local-services-reserve\"\r\n          : \"local-services-save\",\r\n\r\n      category:\r\n        \/driver|airport|pickup|transport|car|vehicle|transfer|shuttle\/i\r\n          .test(service)\r\n            ? \"Transportation\"\r\n            : \"Local Services\",\r\n\r\n      type:\r\n        \"Local Services \u00b7 \" +\r\n        service,\r\n\r\n      service:\r\n        service,\r\n\r\n      title:\r\n        host.name ||\r\n        host.title ||\r\n        service + \" Provider\",\r\n\r\n      location:\r\n        host.location ||\r\n        host.city ||\r\n        \"MedaYork \u00b7 Medell\u00edn\",\r\n\r\n      time:\r\n        host.availability ||\r\n        host.schedule ||\r\n        \"Schedule Pending\",\r\n\r\n      status:\r\n        status,\r\n\r\n      reservationStatus:\r\n        requested\r\n          ? \"Requested\"\r\n          : \"Saved\",\r\n\r\n      requestedAt:\r\n        requested\r\n          ? new Date().toISOString()\r\n          : \"\",\r\n\r\n      image:\r\n        providerImage(host),\r\n\r\n      images:\r\n        Array.isArray(host.images)\r\n          ? host.images\r\n          : [],\r\n\r\n      description:\r\n        host.description ||\r\n        host.desc ||\r\n        host.shortExplanation ||\r\n        service +\r\n          \" provider connected through Local Services.\",\r\n\r\n      websiteUrl:\r\n        host.websiteUrl ||\r\n        host.website ||\r\n        host.url ||\r\n        \"\",\r\n\r\n      reserveUrl:\r\n        host.reserveUrl ||\r\n        \"\",\r\n\r\n      checkoutUrl:\r\n        host.checkoutUrl ||\r\n        \"\",\r\n\r\n      phone:\r\n        host.phone ||\r\n        \"\",\r\n\r\n      whatsapp:\r\n        host.whatsapp ||\r\n        \"\",\r\n\r\n      email:\r\n        host.email ||\r\n        \"\"\r\n    };\r\n  }\r\n\r\n  async function refreshJourney(){\r\n    if(\r\n      window.BlissJourneyAccount &&\r\n      typeof window.BlissJourneyAccount.load ===\r\n        \"function\"\r\n    ){\r\n      await window.BlissJourneyAccount.load(\r\n        true\r\n      );\r\n    }\r\n\r\n    if(\r\n      window.tc2JourneyV7 &&\r\n      typeof window.tc2JourneyV7.render ===\r\n        \"function\"\r\n    ){\r\n      window.tc2JourneyV7.render();\r\n    }\r\n  }\r\n\r\n  async function saveProvider(host){\r\n    if(!host){\r\n      return;\r\n    }\r\n\r\n    if(\r\n      !window.BlissJourneyAccount ||\r\n      typeof window.BlissJourneyAccount.addItem !==\r\n        \"function\"\r\n    ){\r\n      showMessage(\r\n        \"Journey Not Ready\",\r\n        \"Your account Journey is still connecting. Refresh the page and try again.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const item =\r\n      journeyItemFromProvider(\r\n        host,\r\n        \"Saved\"\r\n      );\r\n\r\n    try{\r\n      const result =\r\n        await window.BlissJourneyAccount\r\n          .addItem(item);\r\n\r\n      if(result && result.duplicate){\r\n        showMessage(\r\n          \"Already Saved\",\r\n          item.title +\r\n          \" is already in My Journey.\"\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n     \r\n\r\n      showMessage(\r\n        \"Saved to My Journey\",\r\n        item.title +\r\n        \" was saved to your account.\"\r\n      );\r\n\r\n    }catch(error){\r\n      console.error(\r\n        \"[Bliss Local Services] Save failed:\",\r\n        error\r\n      );\r\n\r\n      showMessage(\r\n        \"Service Not Saved\",\r\n        error.message ||\r\n        \"This provider could not be saved.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  async function reserveProvider(host){\r\n    if(!host){\r\n      return;\r\n    }\r\n\r\n    const config =\r\n      window.BlissJourneyMemberConfig ||\r\n      {};\r\n\r\n    if(!config.loggedIn){\r\n      showMessage(\r\n        \"Sign In Required\",\r\n        \"Please sign in before requesting a Local Service.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    if(!config.hasLevel2){\r\n      showMessage(\r\n        \"Travel Club Level 2 Required\",\r\n        \"Reserve With Bliss is available with Travel Club Level 2.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    if(\r\n      !window.BlissJourneyAccount ||\r\n      typeof window.BlissJourneyAccount.addItem !==\r\n        \"function\"\r\n    ){\r\n      showMessage(\r\n        \"Journey Not Ready\",\r\n        \"Your account Journey is still connecting. Refresh the page and try again.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const item =\r\n      journeyItemFromProvider(\r\n        host,\r\n        \"Requested\"\r\n      );\r\n\r\n    try{\r\n      const result =\r\n        await window.BlissJourneyAccount\r\n          .addItem(item);\r\n\r\n      \/*\r\n       * The provider may already be saved.\r\n       * In that case, change the existing selection\r\n       * from Saved to Requested.\r\n       *\/\r\n      if(\r\n        result &&\r\n        result.duplicate &&\r\n        typeof window.BlissJourneyAccount.updateItem ===\r\n          \"function\"\r\n      ){\r\n        await window.BlissJourneyAccount.updateItem(\r\n          item.journeyId,\r\n          {\r\n            status:\r\n              \"Requested\",\r\n\r\n            reservationStatus:\r\n              \"Requested\",\r\n\r\n            requestedAt:\r\n              item.requestedAt,\r\n\r\n            requestSource:\r\n              \"local-services-reserve\"\r\n          }\r\n        );\r\n      }\r\n\r\n      \r\n\r\n      window.dispatchEvent(\r\n        new CustomEvent(\r\n          \"blissLocalServiceRequested\",\r\n          {\r\n            detail:{\r\n              item:item,\r\n              host:host\r\n            }\r\n          }\r\n        )\r\n      );\r\n\r\n      showMessage(\r\n        \"Service Request Sent\",\r\n        item.title +\r\n        \" was added to My Journey as a requested Local Service.\"\r\n      );\r\n\r\n    }catch(error){\r\n      console.error(\r\n        \"[Bliss Local Services] Request failed:\",\r\n        error\r\n      );\r\n\r\n      showMessage(\r\n        \"Request Not Sent\",\r\n        error.message ||\r\n        \"This service request could not be sent.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     CLICK CONNECTIONS\r\n\r\n     Capture mode prevents older Local Services handlers\r\n     from taking control of these newly generated buttons.\r\n  ========================================================= *\/\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const target =\r\n        event.target;\r\n\r\n      if(\r\n        !target ||\r\n        typeof target.closest !==\r\n          \"function\"\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const serviceButton =\r\n        target.closest(\r\n          \"[data-bliss-service-option]\"\r\n        );\r\n\r\n      if(serviceButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        renderProviders(\r\n          serviceButton.getAttribute(\r\n            \"data-bliss-service-option\"\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      const websiteButton =\r\n        target.closest(\r\n          \"[data-bliss-provider-website]\"\r\n        );\r\n\r\n      if(websiteButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        const host =\r\n          findProvider(\r\n            websiteButton.getAttribute(\r\n              \"data-bliss-provider-website\"\r\n            )\r\n          );\r\n\r\n        const url =\r\n          host\r\n            ? safeURL(\r\n                host.websiteUrl ||\r\n                host.website ||\r\n                host.url ||\r\n                \"\"\r\n              )\r\n            : \"\";\r\n\r\n        if(!url){\r\n          showMessage(\r\n            \"Website Not Available\",\r\n            \"This provider does not have a website URL in the Control Panel yet.\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        window.open(\r\n          url,\r\n          \"_blank\",\r\n          \"noopener\"\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      const saveButton =\r\n        target.closest(\r\n          \"[data-bliss-provider-save]\"\r\n        );\r\n\r\n      if(saveButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        saveProvider(\r\n          findProvider(\r\n            saveButton.getAttribute(\r\n              \"data-bliss-provider-save\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      const reserveButton =\r\n        target.closest(\r\n          \"[data-bliss-provider-reserve]\"\r\n        );\r\n\r\n      if(reserveButton){\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        reserveProvider(\r\n          findProvider(\r\n            reserveButton.getAttribute(\r\n              \"data-bliss-provider-reserve\"\r\n            )\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  \/* =========================================================\r\n     INVENTORY REFRESH\r\n  ========================================================= *\/\r\n\r\n  function inventorySignature(){\r\n    return JSON.stringify(\r\n      readServerProviders().map(function(host){\r\n        return [\r\n          providerID(host),\r\n          serviceNameFromHost(host),\r\n          host.active,\r\n          host.order\r\n        ];\r\n      })\r\n    );\r\n  }\r\n\r\n  function refreshConnectedServices(){\r\n    const signature =\r\n      inventorySignature();\r\n\r\n    lastInventorySignature =\r\n      signature;\r\n\r\n    renderServiceOptions();\r\n\r\n    if(selectedService){\r\n      renderProviders(\r\n        selectedService\r\n      );\r\n    }\r\n  }\r\n\r\n  window.addEventListener(\r\n    \"travelClubInventoryReady\",\r\n    function(){\r\n      refreshConnectedServices();\r\n    }\r\n  );\r\n\r\n  \/*\r\n   * This also catches cases where the inventory loaded\r\n   * before this bottom patch was reached.\r\n   *\/\r\n  function boot(){\r\n    const grid =\r\n      document.getElementById(\r\n        \"tc2ServicesGrid\"\r\n      );\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n    renderServiceOptions();\r\n\r\n    \/*\r\n     * Reload from WordPress if the existing loader is\r\n     * available and no inventory has arrived yet.\r\n     *\/\r\n    if(\r\n      (\r\n        !Array.isArray(\r\n          window.travelClubInventory\r\n        ) ||\r\n        !window.travelClubInventory.length\r\n      ) &&\r\n      typeof window.loadTravelClubInventory ===\r\n        \"function\"\r\n    ){\r\n      Promise.resolve(\r\n        window.loadTravelClubInventory()\r\n      )\r\n      .then(function(){\r\n        refreshConnectedServices();\r\n      })\r\n      .catch(function(error){\r\n        console.error(\r\n          \"[Bliss Local Services] Inventory load failed:\",\r\n          error\r\n        );\r\n\r\n        renderServiceOptions();\r\n      });\r\n    }\r\n  }\r\n\r\n  \/*\r\n   * Expose a small public controller for testing.\r\n   *\/\r\n  window.BlissConnectedLocalServices = {\r\n    refresh:\r\n      refreshConnectedServices,\r\n\r\n    providers:\r\n      readServerProviders,\r\n\r\n    services:\r\n      allServiceDefinitions,\r\n\r\n    open:\r\n      renderProviders\r\n  };\r\n\r\n  if(\r\n    document.readyState ===\r\n      \"loading\"\r\n  ){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      boot,\r\n      {once:true}\r\n    );\r\n  }else{\r\n    boot();\r\n  }\r\n\r\n  \/*\r\n   * Watch briefly for the original Travel Club HTML\r\n   * when WordPress scripts assemble it later.\r\n   *\/\r\n  let bootAttempts = 0;\r\n\r\n  const bootWatcher =\r\n    setInterval(function(){\r\n\r\n      bootAttempts += 1;\r\n\r\n      const grid =\r\n        document.getElementById(\r\n          \"tc2ServicesGrid\"\r\n        );\r\n\r\n      if(grid){\r\n        boot();\r\n      }\r\n\r\n      const currentSignature =\r\n        inventorySignature();\r\n\r\n      if(\r\n        currentSignature !==\r\n        lastInventorySignature\r\n      ){\r\n        refreshConnectedServices();\r\n      }\r\n\r\n      if(bootAttempts >= 30){\r\n        clearInterval(\r\n          bootWatcher\r\n        );\r\n      }\r\n\r\n    },500);\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS LOCAL SERVICES\r\nSAFE TAP \u2192 TRANSFORM REQUEST FORM V3\r\n\r\nDELETE THE PREVIOUS TRANSFORM\/SCROLL BLOCK FIRST.\r\nPASTE THIS AT THE VERY BOTTOM.\r\n========================================================= -->\r\n\r\n<style>\r\n#tc2ServiceRequestHeading{\r\n  display:none;\r\n  margin:24px 0 18px;\r\n  padding:22px;\r\n  border-radius:24px;\r\n  border:1px solid rgba(83,243,255,.32);\r\n  background:\r\n    radial-gradient(\r\n      circle at top left,\r\n      rgba(83,243,255,.14),\r\n      transparent 44%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(10,24,48,.96),\r\n      rgba(3,8,20,.98)\r\n    );\r\n  box-shadow:\r\n    0 0 24px rgba(83,243,255,.08),\r\n    0 18px 42px rgba(0,0,0,.28);\r\n}\r\n\r\n#tc2ServiceRequestHeading.is-active{\r\n  display:block;\r\n}\r\n\r\n#tc2ServiceRequestHeading .bliss-request-label{\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:#53f3ff;\r\n  font-size:.72rem;\r\n  font-weight:900;\r\n  letter-spacing:.15em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#tc2ServiceRequestHeading h3{\r\n  margin:0 0 8px;\r\n  color:#fff;\r\n  font-size:clamp(1.5rem,4vw,2.25rem);\r\n  line-height:1.15;\r\n}\r\n\r\n#tc2ServiceRequestHeading p{\r\n  margin:0;\r\n  color:rgba(248,251,255,.72);\r\n  line-height:1.65;\r\n}\r\n\r\n#tc2ServiceRequestFields{\r\n  scroll-margin-top:20px;\r\n  transition:\r\n    border-color .25s ease,\r\n    background .25s ease,\r\n    box-shadow .25s ease;\r\n}\r\n\r\n#tc2ServiceRequestFields.is-active{\r\n  margin-top:4px;\r\n  padding:18px;\r\n  border-radius:26px;\r\n  border:1px solid rgba(83,243,255,.32);\r\n  background:rgba(83,243,255,.025);\r\n  box-shadow:0 0 26px rgba(83,243,255,.08);\r\n}\r\n\r\n#tc2ServiceTypeChip.bliss-selected-service{\r\n  border-color:rgba(83,243,255,.72) !important;\r\n  background:rgba(83,243,255,.12) !important;\r\n  color:#efffff !important;\r\n  box-shadow:0 0 16px rgba(83,243,255,.14);\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  \/*\r\n   * Prevent this corrected version from loading twice.\r\n   *\/\r\n  if(window.BlissSafeServiceFormV3){\r\n    return;\r\n  }\r\n\r\n  window.BlissSafeServiceFormV3 = true;\r\n\r\n  let selectedService = \"\";\r\n\r\n  let touchStart = null;\r\n\r\n  const MAX_MOVEMENT = 12;\r\n  const MAX_PRESS_TIME = 900;\r\n\r\n  const SERVICE_COPY = {\r\n\r\n    \"private driver\":{\r\n      title:\"Private Driver Request\",\r\n      text:\r\n        \"Enter your pickup location, schedule, number of travelers and transportation requirements.\",\r\n      location:\r\n        \"Airport, hotel, pickup address or meeting point...\",\r\n      quick:\r\n        \"Vehicle type, luggage, child seat or number of stops...\",\r\n      notes:\r\n        \"Describe the route, return trip, waiting time or special transportation needs...\"\r\n    },\r\n\r\n    \"concierge\":{\r\n      title:\"Concierge Request\",\r\n      text:\r\n        \"Tell Bliss what you need organized, coordinated or arranged during your trip.\",\r\n      location:\r\n        \"Hotel, accommodation, neighborhood or destination...\",\r\n      quick:\r\n        \"Luxury level, occasion, family needs or priorities...\",\r\n      notes:\r\n        \"Describe everything you would like Bliss Concierge to coordinate...\"\r\n    },\r\n\r\n    \"translator\":{\r\n      title:\"Translator Request\",\r\n      text:\r\n        \"Enter the languages, location and type of translation assistance you need.\",\r\n      location:\r\n        \"Appointment, hospital, hotel, meeting place or online...\",\r\n      quick:\r\n        \"Languages, in-person or remote, type of appointment...\",\r\n      notes:\r\n        \"Explain the meeting, appointment or situation requiring translation...\"\r\n    },\r\n\r\n    \"local guide\":{\r\n      title:\"Local Guide Request\",\r\n      text:\r\n        \"Describe the type of guided experience you would like Bliss to coordinate.\",\r\n      location:\r\n        \"Hotel, starting point, neighborhood or attraction...\",\r\n      quick:\r\n        \"Food, culture, history, nature, family or private tour...\",\r\n      notes:\r\n        \"Describe your interests, preferred pace and places you would like to visit...\"\r\n    },\r\n\r\n    \"nightlife help\":{\r\n      title:\"Nightlife Support Request\",\r\n      text:\r\n        \"Tell Bliss what kind of evening you are planning and the support you need.\",\r\n      location:\r\n        \"Hotel, venue, neighborhood or starting location...\",\r\n      quick:\r\n        \"Rooftop, dancing, music, VIP table or private driver...\",\r\n      notes:\r\n        \"Describe the atmosphere, group size, reservations and transportation needs...\"\r\n    },\r\n\r\n    \"reservations\":{\r\n      title:\"Reservation Request\",\r\n      text:\r\n        \"Enter the venue, preferred date and time, number of guests and any special requirements.\",\r\n      location:\r\n        \"Restaurant, attraction, venue or preferred area...\",\r\n      quick:\r\n        \"Restaurant, rooftop, event, attraction or special access...\",\r\n      notes:\r\n        \"Add preferred seating, occasion, allergies or other requirements...\"\r\n    },\r\n\r\n    \"security support\":{\r\n      title:\"Security Support Request\",\r\n      text:\r\n        \"Privately describe the schedule, destination and type of support required.\",\r\n      location:\r\n        \"Hotel, event, route, meeting point or destination...\",\r\n      quick:\r\n        \"Movement support, event support or private protection...\",\r\n      notes:\r\n        \"Explain the schedule, route and type of assistance required...\"\r\n    },\r\n\r\n    \"vip custom support\":{\r\n      title:\"VIP Custom Support Request\",\r\n      text:\r\n        \"Describe your complete request and Bliss will review a personalized solution.\",\r\n      location:\r\n        \"Hotel, residence, venue or destination...\",\r\n      quick:\r\n        \"Special occasion, luxury support or private access...\",\r\n      notes:\r\n        \"Describe your complete request, timing, preferences and special requirements...\"\r\n    }\r\n  };\r\n\r\n  function normalize(value){\r\n    return String(value || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(\/&\/g,\"and\")\r\n      .replace(\/[^a-z0-9]+\/g,\" \")\r\n      .replace(\/\\s+\/g,\" \")\r\n      .trim();\r\n  }\r\n\r\n  function escapeHTML(value){\r\n    return String(value || \"\")\r\n      .replace(\/[&<>\"']\/g,function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      });\r\n  }\r\n\r\n  function getServiceCopy(serviceName){\r\n\r\n    return (\r\n      SERVICE_COPY[normalize(serviceName)] ||\r\n      {\r\n        title:serviceName + \" Request\",\r\n\r\n        text:\r\n          \"Complete the request below and choose whether to save it to My Journey or send it through WhatsApp.\",\r\n\r\n        location:\r\n          \"Hotel, address, pickup point or meeting location...\",\r\n\r\n        quick:\r\n          \"Preferences, requirements or important details...\",\r\n\r\n        notes:\r\n          \"Explain what you need, when you need it and any special requirements...\"\r\n      }\r\n    );\r\n  }\r\n\r\n  \/*\r\n   * Create only the heading and request-field wrapper.\r\n   * This does not rebuild or remove the existing form.\r\n   *\/\r\n  function prepareRequestArea(){\r\n\r\n    const chip =\r\n      document.getElementById(\r\n        \"tc2ServiceTypeChip\"\r\n      );\r\n\r\n    if(!chip){\r\n      return null;\r\n    }\r\n\r\n    const chipRow =\r\n      chip.closest(\".tc2-chipRow\");\r\n\r\n    if(!chipRow){\r\n      return null;\r\n    }\r\n\r\n    let heading =\r\n      document.getElementById(\r\n        \"tc2ServiceRequestHeading\"\r\n      );\r\n\r\n    if(!heading){\r\n\r\n      heading =\r\n        document.createElement(\"div\");\r\n\r\n      heading.id =\r\n        \"tc2ServiceRequestHeading\";\r\n\r\n      chipRow.parentNode.insertBefore(\r\n        heading,\r\n        chipRow\r\n      );\r\n    }\r\n\r\n    let fields =\r\n      document.getElementById(\r\n        \"tc2ServiceRequestFields\"\r\n      );\r\n\r\n    if(!fields){\r\n\r\n      fields =\r\n        document.createElement(\"div\");\r\n\r\n      fields.id =\r\n        \"tc2ServiceRequestFields\";\r\n\r\n      chipRow.parentNode.insertBefore(\r\n        fields,\r\n        chipRow\r\n      );\r\n\r\n      \/*\r\n       * Move the existing request controls into one\r\n       * visual section. They are not recreated.\r\n       *\/\r\n      let element = chipRow;\r\n\r\n      while(element){\r\n\r\n        const next =\r\n          element.nextElementSibling;\r\n\r\n        fields.appendChild(element);\r\n\r\n        if(\r\n          element.matches(\".tc2-btnRow\") ||\r\n          (\r\n            element.querySelector &&\r\n            element.querySelector(\r\n              \"#tc2ServiceWhatsAppBtn\"\r\n            )\r\n          )\r\n        ){\r\n          break;\r\n        }\r\n\r\n        element = next;\r\n      }\r\n    }\r\n\r\n    return {\r\n      chip:chip,\r\n      heading:heading,\r\n      fields:fields\r\n    };\r\n  }\r\n\r\n  function updateRequestForm(serviceName){\r\n\r\n    const area =\r\n      prepareRequestArea();\r\n\r\n    if(!area){\r\n      return;\r\n    }\r\n\r\n    const copy =\r\n      getServiceCopy(serviceName);\r\n\r\n    area.heading.innerHTML = `\r\n      <span class=\"bliss-request-label\">\r\n        Bliss Local Services\r\n      <\/span>\r\n\r\n      <h3>\r\n        ${escapeHTML(copy.title)}\r\n      <\/h3>\r\n\r\n      <p>\r\n        ${escapeHTML(copy.text)}\r\n      <\/p>\r\n    `;\r\n\r\n    area.heading.classList.add(\r\n      \"is-active\"\r\n    );\r\n\r\n    area.fields.classList.add(\r\n      \"is-active\"\r\n    );\r\n\r\n    area.chip.classList.add(\r\n      \"bliss-selected-service\"\r\n    );\r\n\r\n    area.chip.textContent =\r\n      serviceName + \" Selected\";\r\n\r\n    const location =\r\n      document.getElementById(\r\n        \"tc2ServiceLocation\"\r\n      );\r\n\r\n    const shortNotes =\r\n      document.getElementById(\r\n        \"tc2ServiceShortNotes\"\r\n      );\r\n\r\n    const notes =\r\n      document.getElementById(\r\n        \"tc2ServiceNotes\"\r\n      );\r\n\r\n    if(location){\r\n      location.placeholder =\r\n        copy.location;\r\n    }\r\n\r\n    if(shortNotes){\r\n\r\n      shortNotes.placeholder =\r\n        copy.quick;\r\n\r\n      \/*\r\n       * Replace the automatic service sentence only\r\n       * when it is blank or was generated previously.\r\n       *\/\r\n      if(\r\n        !shortNotes.value.trim() ||\r\n        \/^I need help with .+\\.$\/i.test(\r\n          shortNotes.value.trim()\r\n        )\r\n      ){\r\n        shortNotes.value =\r\n          \"I need help with \" +\r\n          serviceName +\r\n          \".\";\r\n      }\r\n    }\r\n\r\n    if(notes){\r\n      notes.placeholder =\r\n        copy.notes;\r\n    }\r\n\r\n    \/*\r\n     * Scroll the Travel Club overlay only once.\r\n     * Do not focus an input and do not open the keyboard.\r\n     *\/\r\n    const overlay =\r\n      document.getElementById(\r\n        \"tc2Overlay\"\r\n      );\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    requestAnimationFrame(function(){\r\n\r\n      requestAnimationFrame(function(){\r\n\r\n        const overlayBox =\r\n          overlay.getBoundingClientRect();\r\n\r\n        const headingBox =\r\n          area.heading.getBoundingClientRect();\r\n\r\n        const targetPosition =\r\n          overlay.scrollTop +\r\n          headingBox.top -\r\n          overlayBox.top -\r\n          18;\r\n\r\n        overlay.scrollTo({\r\n          top:Math.max(0,targetPosition),\r\n          behavior:\"smooth\"\r\n        });\r\n\r\n      });\r\n\r\n    });\r\n  }\r\n\r\n  function selectService(serviceName){\r\n\r\n    serviceName =\r\n      String(serviceName || \"\").trim();\r\n\r\n    if(!serviceName){\r\n      return;\r\n    }\r\n\r\n    selectedService =\r\n      serviceName;\r\n\r\n    \/*\r\n     * This is the real Control Panel Local Services\r\n     * controller already present in your code.\r\n     *\r\n     * It selects the service and renders its providers.\r\n     *\/\r\n    if(\r\n      window.BlissConnectedLocalServices &&\r\n      typeof window.BlissConnectedLocalServices.open ===\r\n        \"function\"\r\n    ){\r\n      window.BlissConnectedLocalServices.open(\r\n        serviceName\r\n      );\r\n    }\r\n\r\n    updateRequestForm(\r\n      serviceName\r\n    );\r\n  }\r\n\r\n  \/*\r\n   * Record where the finger or mouse started.\r\n   * This does not choose a service.\r\n   *\/\r\n  document.addEventListener(\r\n    \"pointerdown\",\r\n    function(event){\r\n\r\n      const button =\r\n        event.target.closest(\r\n          \"[data-bliss-service-option]\"\r\n        );\r\n\r\n      if(!button){\r\n        touchStart = null;\r\n        return;\r\n      }\r\n\r\n      touchStart = {\r\n        pointerId:event.pointerId,\r\n        button:button,\r\n        service:\r\n          button.getAttribute(\r\n            \"data-bliss-service-option\"\r\n          ),\r\n        x:event.clientX,\r\n        y:event.clientY,\r\n        time:Date.now()\r\n      };\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  \/*\r\n   * Choose the service only after the finger is released\r\n   * and only when the finger did not move enough to scroll.\r\n   *\/\r\n  document.addEventListener(\r\n    \"pointerup\",\r\n    function(event){\r\n\r\n      if(!touchStart){\r\n        return;\r\n      }\r\n\r\n      const original =\r\n        touchStart;\r\n\r\n      touchStart = null;\r\n\r\n      if(\r\n        original.pointerId !==\r\n        event.pointerId\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const movedX =\r\n        Math.abs(\r\n          event.clientX -\r\n          original.x\r\n        );\r\n\r\n      const movedY =\r\n        Math.abs(\r\n          event.clientY -\r\n          original.y\r\n        );\r\n\r\n      const pressTime =\r\n        Date.now() -\r\n        original.time;\r\n\r\n      \/*\r\n       * A movement larger than 12 pixels is treated\r\n       * as scrolling, not as a service selection.\r\n       *\/\r\n      if(\r\n        movedX > MAX_MOVEMENT ||\r\n        movedY > MAX_MOVEMENT ||\r\n        pressTime > MAX_PRESS_TIME\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const releasedButton =\r\n        event.target.closest(\r\n          \"[data-bliss-service-option]\"\r\n        );\r\n\r\n      \/*\r\n       * The finger must be released on the same card\r\n       * where it began.\r\n       *\/\r\n      if(\r\n        !releasedButton ||\r\n        releasedButton !==\r\n          original.button\r\n      ){\r\n        return;\r\n      }\r\n\r\n      selectService(\r\n        original.service\r\n      );\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"pointercancel\",\r\n    function(){\r\n      touchStart = null;\r\n    },\r\n    true\r\n  );\r\n\r\n  \/*\r\n   * Keyboard access.\r\n   *\/\r\n  document.addEventListener(\r\n    \"keydown\",\r\n    function(event){\r\n\r\n      if(\r\n        event.key !== \"Enter\" &&\r\n        event.key !== \" \"\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const button =\r\n        event.target.closest(\r\n          \"[data-bliss-service-option]\"\r\n        );\r\n\r\n      if(!button){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n\r\n      selectService(\r\n        button.getAttribute(\r\n          \"data-bliss-service-option\"\r\n        )\r\n      );\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  window.BlissServiceRequestForm = {\r\n    open:selectService,\r\n\r\n    selected:function(){\r\n      return selectedService;\r\n    }\r\n  };\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nCONCIERGE OFFER POPUP \u2014 FREE UNTIL SEPTEMBER 1, 2026\r\n\r\nCONNECTS TO EXISTING BUTTONS:\r\n#tc2SendPlanBtn\r\n#tc2SendPlanBtnMirror\r\n\r\nCURRENT ACTION:\r\n- Shows regular concierge price: $6.99 USD\r\n- Free promotional access until September 1, 2026\r\n- Sends the existing Journey through:\r\n  window.BlissSubmitFullJourney()\r\n\r\nFUTURE:\r\nAdd an external payment URL in:\r\nwindow.BLISS_CONCIERGE_PAYMENT_URL\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   CONCIERGE OFFER POPUP\r\n========================================================= *\/\r\n\r\n#blissConciergeOfferOverlay{\r\n  position:fixed;\r\n  inset:0;\r\n  z-index:2147483647;\r\n\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  padding:20px;\r\n\r\n  background:rgba(0,0,0,.82);\r\n  backdrop-filter:blur(14px);\r\n  -webkit-backdrop-filter:blur(14px);\r\n}\r\n\r\n#blissConciergeOfferOverlay.is-open{\r\n  display:flex;\r\n}\r\n\r\n#blissConciergeOfferCard{\r\n  position:relative;\r\n\r\n  width:min(100%,520px);\r\n  max-height:90vh;\r\n  overflow-y:auto;\r\n\r\n  padding:30px 24px 24px;\r\n\r\n  border:1px solid rgba(83,243,255,.38);\r\n  border-radius:28px;\r\n\r\n  color:#f8fbff;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at top,\r\n      rgba(83,243,255,.13),\r\n      transparent 38%\r\n    ),\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(10,18,40,.98),\r\n      rgba(2,5,13,.99)\r\n    );\r\n\r\n  box-shadow:\r\n    0 30px 100px rgba(0,0,0,.7),\r\n    0 0 35px rgba(83,243,255,.16);\r\n}\r\n\r\n#blissConciergeOfferClose{\r\n  position:absolute;\r\n  top:14px;\r\n  right:14px;\r\n\r\n  width:40px;\r\n  height:40px;\r\n\r\n  border:1px solid rgba(255,255,255,.12);\r\n  border-radius:50%;\r\n\r\n  background:rgba(255,255,255,.06);\r\n  color:#fff;\r\n\r\n  font-size:22px;\r\n  line-height:1;\r\n  cursor:pointer;\r\n}\r\n\r\n.bliss-concierge-label{\r\n  display:inline-flex;\r\n  align-items:center;\r\n\r\n  min-height:32px;\r\n  padding:0 12px;\r\n\r\n  border:1px solid rgba(83,243,255,.35);\r\n  border-radius:999px;\r\n\r\n  color:#9eefff;\r\n  background:rgba(83,243,255,.08);\r\n\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n#blissConciergeOfferTitle{\r\n  margin:20px 0 10px;\r\n\r\n  font-size:clamp(30px,7vw,48px);\r\n  line-height:.95;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bliss-concierge-description{\r\n  margin:0;\r\n\r\n  color:rgba(248,251,255,.78);\r\n  font-size:16px;\r\n  line-height:1.65;\r\n}\r\n\r\n.bliss-concierge-priceBox{\r\n  margin-top:22px;\r\n  padding:20px;\r\n\r\n  text-align:center;\r\n\r\n  border:1px solid rgba(244,210,122,.28);\r\n  border-radius:22px;\r\n\r\n  background:rgba(244,210,122,.06);\r\n}\r\n\r\n.bliss-concierge-priceLabel{\r\n  display:block;\r\n\r\n  color:rgba(248,251,255,.58);\r\n\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.15em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bliss-concierge-price{\r\n  display:block;\r\n  margin-top:8px;\r\n\r\n  color:#f4d27a;\r\n\r\n  font-size:38px;\r\n  font-weight:900;\r\n}\r\n\r\n.bliss-concierge-freeBadge{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  margin-top:12px;\r\n  padding:8px 14px;\r\n\r\n  border:1px solid rgba(112,247,162,.38);\r\n  border-radius:999px;\r\n\r\n  color:#9fffc0;\r\n  background:rgba(112,247,162,.10);\r\n\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bliss-concierge-benefits{\r\n  display:grid;\r\n  gap:10px;\r\n\r\n  margin:22px 0 0;\r\n  padding:0;\r\n\r\n  list-style:none;\r\n}\r\n\r\n.bliss-concierge-benefits li{\r\n  position:relative;\r\n\r\n  padding:13px 14px 13px 42px;\r\n\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:16px;\r\n\r\n  color:rgba(248,251,255,.84);\r\n  background:rgba(255,255,255,.035);\r\n\r\n  line-height:1.45;\r\n}\r\n\r\n.bliss-concierge-benefits li::before{\r\n  content:\"\u2713\";\r\n\r\n  position:absolute;\r\n  left:15px;\r\n  top:13px;\r\n\r\n  color:#70f7a2;\r\n  font-weight:900;\r\n}\r\n\r\n.bliss-concierge-actions{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n\r\n  gap:10px;\r\n  margin-top:24px;\r\n}\r\n\r\n.bliss-concierge-action{\r\n  width:100%;\r\n  min-height:52px;\r\n\r\n  padding:12px 18px;\r\n\r\n  border:none;\r\n  border-radius:16px;\r\n\r\n  font-size:14px;\r\n  font-weight:900;\r\n  letter-spacing:.04em;\r\n  text-transform:uppercase;\r\n\r\n  cursor:pointer;\r\n}\r\n\r\n#blissConciergeContinue{\r\n  color:#021015;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      #53f3ff,\r\n      #70f7a2\r\n    );\r\n\r\n  box-shadow:0 0 24px rgba(83,243,255,.22);\r\n}\r\n\r\n#blissConciergeContinue:disabled{\r\n  opacity:.55;\r\n  cursor:wait;\r\n}\r\n\r\n#blissConciergeCancel{\r\n  color:#f8fbff;\r\n\r\n  border:1px solid rgba(255,255,255,.12);\r\n  background:rgba(255,255,255,.05);\r\n}\r\n\r\n#blissConciergePaymentNotice{\r\n  display:none;\r\n\r\n  margin-top:16px;\r\n  padding:13px;\r\n\r\n  border:1px solid rgba(255,107,138,.25);\r\n  border-radius:14px;\r\n\r\n  color:#ffd5df;\r\n  background:rgba(255,107,138,.08);\r\n\r\n  line-height:1.5;\r\n  text-align:center;\r\n}\r\n\r\n#blissConciergePaymentNotice.is-visible{\r\n  display:block;\r\n}\r\n\r\n@media (min-width:560px){\r\n  .bliss-concierge-actions{\r\n    grid-template-columns:1fr 1fr;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div\r\n  id=\"blissConciergeOfferOverlay\"\r\n  role=\"dialog\"\r\n  aria-modal=\"true\"\r\n  aria-labelledby=\"blissConciergeOfferTitle\"\r\n  aria-hidden=\"true\">\r\n\r\n  <div id=\"blissConciergeOfferCard\">\r\n\r\n    <button\r\n      id=\"blissConciergeOfferClose\"\r\n      type=\"button\"\r\n      aria-label=\"Close concierge offer\">\r\n      \u00d7\r\n    <\/button>\r\n\r\n    <span class=\"bliss-concierge-label\">\r\n      Bliss Live Concierge\r\n    <\/span>\r\n\r\n    <h2 id=\"blissConciergeOfferTitle\">\r\n      Send Your Journey to a Concierge\r\n    <\/h2>\r\n\r\n    <p class=\"bliss-concierge-description\">\r\n      Send your complete My Journey dashboard to a real Bliss\r\n      concierge who can review your selections, help verify\r\n      availability, and personally assist with your requests.\r\n    <\/p>\r\n\r\n    <div class=\"bliss-concierge-priceBox\">\r\n\r\n      <span class=\"bliss-concierge-priceLabel\">\r\n        Concierge Request\r\n      <\/span>\r\n\r\n      <strong class=\"bliss-concierge-price\">\r\n        $6.99 USD\r\n      <\/strong>\r\n\r\n      <span\r\n        id=\"blissConciergePromotionBadge\"\r\n        class=\"bliss-concierge-freeBadge\">\r\n        Free until September 1, 2026\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n    <ul class=\"bliss-concierge-benefits\">\r\n      <li>Your entire saved Journey is sent together.<\/li>\r\n\r\n      <li>\r\n        A live human reviews your accommodation, restaurant,\r\n        transportation, experience, and service requests.\r\n      <\/li>\r\n\r\n      <li>\r\n        Bliss can contact you when additional information or\r\n        confirmation is needed.\r\n      <\/li>\r\n    <\/ul>\r\n\r\n    <div\r\n      id=\"blissConciergePaymentNotice\">\r\n    <\/div>\r\n\r\n    <div class=\"bliss-concierge-actions\">\r\n\r\n      <button\r\n        id=\"blissConciergeContinue\"\r\n        class=\"bliss-concierge-action\"\r\n        type=\"button\">\r\n        Send My Journey Free\r\n      <\/button>\r\n\r\n      <button\r\n        id=\"blissConciergeCancel\"\r\n        class=\"bliss-concierge-action\"\r\n        type=\"button\">\r\n        Not Right Now\r\n      <\/button>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  \/*\r\n   * Add the external payment URL here later.\r\n   *\r\n   * Examples:\r\n   * PayPal payment link\r\n   * Square payment link\r\n   * Stripe Payment Link\r\n   * Another secure hosted checkout\r\n   *\r\n   * Leave blank during the free promotion.\r\n   *\/\r\n  window.BLISS_CONCIERGE_PAYMENT_URL =\r\n    window.BLISS_CONCIERGE_PAYMENT_URL || \"\";\r\n\r\n  const PROMOTION_END =\r\n    new Date(\"2026-09-01T00:00:00\");\r\n\r\n  const REGULAR_PRICE =\r\n    \"$6.99 USD\";\r\n\r\n  let originalJourneyButton = null;\r\n  let actionInProgress = false;\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function promotionIsActive(){\r\n    return new Date() < PROMOTION_END;\r\n  }\r\n\r\n  function getJourneyButton(target){\r\n\r\n    if(!target || !target.closest){\r\n      return null;\r\n    }\r\n\r\n    return target.closest(\r\n      \"#tc2SendPlanBtn, #tc2SendPlanBtnMirror\"\r\n    );\r\n  }\r\n\r\n  function openConciergeOffer(button){\r\n\r\n    const overlay =\r\n      byId(\"blissConciergeOfferOverlay\");\r\n\r\n    const continueButton =\r\n      byId(\"blissConciergeContinue\");\r\n\r\n    const promotionBadge =\r\n      byId(\"blissConciergePromotionBadge\");\r\n\r\n    const notice =\r\n      byId(\"blissConciergePaymentNotice\");\r\n\r\n    if(!overlay || !continueButton){\r\n      return;\r\n    }\r\n\r\n    originalJourneyButton = button;\r\n    actionInProgress = false;\r\n\r\n    continueButton.disabled = false;\r\n    notice.classList.remove(\"is-visible\");\r\n    notice.textContent = \"\";\r\n\r\n    if(promotionIsActive()){\r\n\r\n      promotionBadge.style.display =\r\n        \"inline-flex\";\r\n\r\n      promotionBadge.textContent =\r\n        \"Free until September 1, 2026\";\r\n\r\n      continueButton.textContent =\r\n        \"Send My Journey Free\";\r\n\r\n    }else{\r\n\r\n      promotionBadge.style.display =\r\n        \"none\";\r\n\r\n      continueButton.textContent =\r\n        \"Pay \" + REGULAR_PRICE;\r\n\r\n    }\r\n\r\n    overlay.classList.add(\"is-open\");\r\n    overlay.setAttribute(\"aria-hidden\",\"false\");\r\n\r\n    document.documentElement.style.overflow =\r\n      \"hidden\";\r\n  }\r\n\r\n  function closeConciergeOffer(){\r\n\r\n    const overlay =\r\n      byId(\"blissConciergeOfferOverlay\");\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    overlay.classList.remove(\"is-open\");\r\n    overlay.setAttribute(\"aria-hidden\",\"true\");\r\n\r\n    document.documentElement.style.overflow =\r\n      \"\";\r\n\r\n    if(!actionInProgress){\r\n      originalJourneyButton = null;\r\n    }\r\n  }\r\n\r\n  function showNotice(message){\r\n\r\n    const notice =\r\n      byId(\"blissConciergePaymentNotice\");\r\n\r\n    if(!notice){\r\n      return;\r\n    }\r\n\r\n    notice.textContent = message;\r\n    notice.classList.add(\"is-visible\");\r\n  }\r\n\r\n  function submitJourneyDuringPromotion(){\r\n\r\n    const continueButton =\r\n      byId(\"blissConciergeContinue\");\r\n\r\n    if(actionInProgress){\r\n      return;\r\n    }\r\n\r\n    if(\r\n      typeof window.BlissSubmitFullJourney !==\r\n      \"function\"\r\n    ){\r\n\r\n      showNotice(\r\n        \"The Journey submission connection is not available yet. Please reload the page and try again.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    actionInProgress = true;\r\n\r\n    continueButton.disabled = true;\r\n    continueButton.textContent =\r\n      \"Sending Journey...\";\r\n\r\n    \/*\r\n     * Close the offer first.\r\n     * The existing Bliss submission system will then:\r\n     *\r\n     * 1. Send the complete Journey to WordPress.\r\n     * 2. Reload the customer's Journey.\r\n     * 3. Update statuses to Requested.\r\n     * 4. Display the existing success message.\r\n     *\/\r\n    closeConciergeOffer();\r\n\r\n    try{\r\n\r\n      window.BlissSubmitFullJourney(\r\n        originalJourneyButton\r\n      );\r\n\r\n    }catch(error){\r\n\r\n      console.error(\r\n        \"[Bliss Concierge Offer] Submission failed:\",\r\n        error\r\n      );\r\n\r\n      actionInProgress = false;\r\n\r\n      openConciergeOffer(\r\n        originalJourneyButton\r\n      );\r\n\r\n      showNotice(\r\n        error.message ||\r\n        \"Your Journey could not be sent. Please try again.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  function beginExternalPayment(){\r\n\r\n    const paymentURL =\r\n      String(\r\n        window.BLISS_CONCIERGE_PAYMENT_URL || \"\"\r\n      ).trim();\r\n\r\n    if(!paymentURL){\r\n\r\n      showNotice(\r\n        \"Secure online payment is being prepared. Concierge requests remain free during the current promotional period.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * Opens a secure payment page hosted by whichever\r\n     * provider you choose later.\r\n     *\/\r\n    window.open(\r\n      paymentURL,\r\n      \"_blank\",\r\n      \"noopener,noreferrer\"\r\n    );\r\n  }\r\n\r\n  function continueConciergeRequest(){\r\n\r\n    if(promotionIsActive()){\r\n      submitJourneyDuringPromotion();\r\n      return;\r\n    }\r\n\r\n    beginExternalPayment();\r\n  }\r\n\r\n  \/*\r\n   * IMPORTANT:\r\n   *\r\n   * Listen on WINDOW during capture.\r\n   * Window receives the click before the older document-level\r\n   * Journey handlers, preventing duplicate submission systems\r\n   * from running before this popup opens.\r\n   *\/\r\n  window.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const button =\r\n        getJourneyButton(event.target);\r\n\r\n      if(!button){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n\r\n      if(\r\n        typeof event.stopImmediatePropagation ===\r\n        \"function\"\r\n      ){\r\n        event.stopImmediatePropagation();\r\n      }\r\n\r\n      openConciergeOffer(button);\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const closeButton =\r\n        event.target.closest(\r\n          \"#blissConciergeOfferClose, #blissConciergeCancel\"\r\n        );\r\n\r\n      if(closeButton){\r\n        event.preventDefault();\r\n        closeConciergeOffer();\r\n        return;\r\n      }\r\n\r\n      if(\r\n        event.target.closest(\r\n          \"#blissConciergeContinue\"\r\n        )\r\n      ){\r\n        event.preventDefault();\r\n        continueConciergeRequest();\r\n        return;\r\n      }\r\n\r\n      const overlay =\r\n        byId(\"blissConciergeOfferOverlay\");\r\n\r\n      if(event.target === overlay){\r\n        closeConciergeOffer();\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"keydown\",\r\n    function(event){\r\n\r\n      if(event.key === \"Escape\"){\r\n        closeConciergeOffer();\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB\r\nCONCIERGE POPUP VISIBILITY + JOURNEY FULL IMAGE REPAIR V1\r\n\r\nFIXES:\r\n1. Moves the existing concierge popup inside #tc2Overlay.\r\n2. Makes the popup visible under body.tc2Hide.\r\n3. Reconnects both existing Journey buttons.\r\n4. Shows the entire saved host image without cropping.\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   CONCIERGE POPUP VISIBILITY REPAIR\r\n========================================================= *\/\r\n\r\nbody.tc2Hide #tc2Overlay #blissConciergeOfferOverlay,\r\nbody.tc2Hide #tc2Overlay #blissConciergeOfferOverlay *,\r\n#tc2Overlay #blissConciergeOfferOverlay,\r\n#tc2Overlay #blissConciergeOfferOverlay *{\r\n  visibility:visible !important;\r\n}\r\n\r\n#tc2Overlay #blissConciergeOfferOverlay{\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n\r\n  width:100vw !important;\r\n  width:100dvw !important;\r\n\r\n  height:100vh !important;\r\n  height:100dvh !important;\r\n\r\n  margin:0 !important;\r\n\r\n  z-index:2147483647 !important;\r\n\r\n  opacity:1 !important;\r\n  transform:none !important;\r\n}\r\n\r\n#tc2Overlay #blissConciergeOfferOverlay:not(.is-open){\r\n  display:none !important;\r\n}\r\n\r\n#tc2Overlay #blissConciergeOfferOverlay.is-open{\r\n  display:flex !important;\r\n  align-items:center !important;\r\n  justify-content:center !important;\r\n}\r\n\r\n\/* Ensure the popup itself stays above all Travel Club content *\/\r\n#tc2Overlay #blissConciergeOfferCard{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  visibility:visible !important;\r\n  opacity:1 !important;\r\n  transform:none !important;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MY JOURNEY \u2014 SHOW COMPLETE HOST IMAGE\r\n========================================================= *\/\r\n\r\n\/*\r\n * Main account-driven My Journey renderer.\r\n *\r\n * \"contain\" shows the entire image.\r\n * It may leave some empty space around portrait or wide images,\r\n * but it will no longer cut off the image edges.\r\n *\/\r\n#tc2Overlay #tc2JourneyPage .bliss-newJourneyImage{\r\n  min-height:280px !important;\r\n\r\n  background-color:#050b18 !important;\r\n  background-size:contain !important;\r\n  background-position:center center !important;\r\n  background-repeat:no-repeat !important;\r\n}\r\n\r\n\/*\r\n * Earlier Journey renderer backup.\r\n * This keeps the image correct if the older renderer appears\r\n * temporarily before the account renderer finishes loading.\r\n *\/\r\n#tc2Overlay #tc2JourneyPage .tc2-mj-itemMedia{\r\n  min-height:280px !important;\r\n\r\n  background-color:#050b18 !important;\r\n  background-size:contain !important;\r\n  background-position:center center !important;\r\n  background-repeat:no-repeat !important;\r\n}\r\n\r\n\/*\r\n * The existing dark gradient was covering part of the image.\r\n * Keep a much softer gradient so the complete image is visible.\r\n *\/\r\n#tc2Overlay #tc2JourneyPage .bliss-newJourneyImage::after{\r\n  background:\r\n    linear-gradient(\r\n      180deg,\r\n      transparent 72%,\r\n      rgba(0,0,0,.24) 100%\r\n    ) !important;\r\n}\r\n\r\n\/* Mobile image height *\/\r\n@media(max-width:620px){\r\n\r\n  #tc2Overlay #tc2JourneyPage .bliss-newJourneyImage,\r\n  #tc2Overlay #tc2JourneyPage .tc2-mj-itemMedia{\r\n    min-height:240px !important;\r\n  }\r\n\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  \/*\r\n   * Prevent this repair from connecting more than once.\r\n   *\/\r\n  if(window.BlissConciergeVisibilityRepairV1){\r\n    return;\r\n  }\r\n\r\n  window.BlissConciergeVisibilityRepairV1 = true;\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function promotionIsActive(){\r\n\r\n    \/*\r\n     * Free through August 31, 2026.\r\n     * The regular $6.99 offer begins September 1, 2026.\r\n     *\/\r\n    return new Date() <\r\n      new Date(\"2026-09-01T00:00:00\");\r\n  }\r\n\r\n  function movePopupInsideTravelClub(){\r\n\r\n    const travelClub =\r\n      byId(\"tc2Overlay\");\r\n\r\n    const popup =\r\n      byId(\"blissConciergeOfferOverlay\");\r\n\r\n    if(!travelClub || !popup){\r\n      return false;\r\n    }\r\n\r\n    \/*\r\n     * The popup was originally outside #tc2Overlay.\r\n     * That caused body.tc2Hide to hide it.\r\n     *\r\n     * Moving the same element preserves its existing buttons\r\n     * and existing event connections.\r\n     *\/\r\n    if(popup.parentElement !== travelClub){\r\n      travelClub.appendChild(popup);\r\n    }\r\n\r\n    popup.style.setProperty(\r\n      \"visibility\",\r\n      \"visible\",\r\n      \"important\"\r\n    );\r\n\r\n    return true;\r\n  }\r\n\r\n  function openPopup(button){\r\n\r\n    movePopupInsideTravelClub();\r\n\r\n    const popup =\r\n      byId(\"blissConciergeOfferOverlay\");\r\n\r\n    const continueButton =\r\n      byId(\"blissConciergeContinue\");\r\n\r\n    const promotionBadge =\r\n      byId(\"blissConciergePromotionBadge\");\r\n\r\n    const notice =\r\n      byId(\"blissConciergePaymentNotice\");\r\n\r\n    if(!popup){\r\n      console.error(\r\n        \"[Bliss Concierge] Popup element was not found.\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * Preserve the Journey button for the existing\r\n     * concierge submission code.\r\n     *\/\r\n    window.BlissConciergeOriginalButton =\r\n      button || null;\r\n\r\n    if(notice){\r\n      notice.textContent = \"\";\r\n      notice.classList.remove(\"is-visible\");\r\n    }\r\n\r\n    if(continueButton){\r\n\r\n      continueButton.disabled = false;\r\n\r\n      continueButton.textContent =\r\n        promotionIsActive()\r\n          ? \"Send My Journey Free\"\r\n          : \"Continue \u2014 $6.99 USD\";\r\n    }\r\n\r\n    if(promotionBadge){\r\n\r\n      promotionBadge.style.display =\r\n        promotionIsActive()\r\n          ? \"inline-flex\"\r\n          : \"none\";\r\n\r\n      promotionBadge.textContent =\r\n        \"Free until September 1, 2026\";\r\n    }\r\n\r\n    popup.classList.add(\"is-open\");\r\n\r\n    popup.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n\r\n    popup.style.setProperty(\r\n      \"display\",\r\n      \"flex\",\r\n      \"important\"\r\n    );\r\n\r\n    popup.style.setProperty(\r\n      \"visibility\",\r\n      \"visible\",\r\n      \"important\"\r\n    );\r\n  }\r\n\r\n  \/*\r\n   * Capture the click at window level.\r\n   *\r\n   * This runs before the older document-level\r\n   * sendFullJourney() handler in the original page.\r\n   *\/\r\n  window.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const target =\r\n        event.target;\r\n\r\n      if(!target || !target.closest){\r\n        return;\r\n      }\r\n\r\n      const journeyButton =\r\n        target.closest(\r\n          \"#tc2SendPlanBtn,\" +\r\n          \"#tc2SendPlanBtnMirror\"\r\n        );\r\n\r\n      if(!journeyButton){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n\r\n      if(\r\n        typeof event.stopImmediatePropagation ===\r\n        \"function\"\r\n      ){\r\n        event.stopImmediatePropagation();\r\n      }\r\n\r\n      openPopup(journeyButton);\r\n\r\n    },\r\n    true\r\n  );\r\n\r\n  \/*\r\n   * Move the popup immediately when possible.\r\n   *\/\r\n  function startRepair(){\r\n\r\n    if(movePopupInsideTravelClub()){\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * WordPress may finish inserting Travel Club after\r\n     * this bottom patch runs. Retry briefly and stop\r\n     * immediately after the popup is connected.\r\n     *\/\r\n    let attempts = 0;\r\n\r\n    const timer =\r\n      setInterval(function(){\r\n\r\n        attempts += 1;\r\n\r\n        if(\r\n          movePopupInsideTravelClub() ||\r\n          attempts >= 20\r\n        ){\r\n          clearInterval(timer);\r\n        }\r\n\r\n      },200);\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      startRepair,\r\n      { once:true }\r\n    );\r\n\r\n  }else{\r\n\r\n    startRepair();\r\n\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS EXPLORE MEDELL\u00cdN\r\nLEVEL 3 RESCUE-CARD MEMBERSHIP LOCK\r\nPASTE AT THE ABSOLUTE BOTTOM\r\n========================================================= -->\r\n\r\n<style>\r\n\/* Level 3 cards while locked *\/\r\n#tc2ExplorePage .tc2-rescue-card.tc2-level3-locked{\r\nposition:relative !important;\r\nopacity:.58 !important;\r\nfilter:grayscale(.35) brightness(.68) saturate(.65) !important;\r\ncursor:not-allowed !important;\r\n}\r\n\r\n\/* Locked label *\/\r\n#tc2ExplorePage .tc2-rescue-card.tc2-level3-locked::after{\r\ncontent:\"LEVEL 3 LOCKED\";\r\nposition:absolute;\r\ntop:12px;\r\nright:12px;\r\nz-index:5;\r\n\r\npadding:6px 9px;\r\nborder-radius:999px;\r\n\r\nborder:1px solid rgba(244,210,122,.65);\r\nbackground:rgba(5,8,18,.88);\r\n\r\ncolor:#fff0c4;\r\nfont-size:9px;\r\nline-height:1;\r\nfont-weight:900;\r\nletter-spacing:.12em;\r\ntext-transform:uppercase;\r\n\r\nbox-shadow:\r\n0 0 12px rgba(244,210,122,.18);\r\n}\r\n\r\n\/* Purchased Level 3 cards *\/\r\n#tc2ExplorePage .tc2-rescue-card.tc2-level3-unlocked{\r\nopacity:1 !important;\r\nfilter:none !important;\r\ncursor:pointer !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n\"use strict\";\r\n\r\nconst LEVEL_3_GUIDES = [\r\n\"Discover\",\r\n\"Entertainment\",\r\n\"Medical Tourism\"\r\n ];\r\n\r\nfunction normalize(value){\r\nreturn String(value || \"\")\r\n.trim()\r\n.toLowerCase()\r\n.normalize(\"NFD\")\r\n.replace(\/[\\u0300-\\u036f]\/g,\"\");\r\n}\r\n\r\nfunction isLevel3Guide(name){\r\n\r\nconst normalizedName =\r\nnormalize(name);\r\n\r\nreturn LEVEL_3_GUIDES.some(\r\nfunction(guide){\r\nreturn normalize(guide) ===\r\nnormalizedName;\r\n}\r\n);\r\n\r\n}\r\n\r\nfunction ownsLevel3(){\r\n\r\n\/*\r\n* Use the official Travel Club membership system first.\r\n*\/\r\nif(\r\nwindow.BlissTravelMembership &&\r\ntypeof window.BlissTravelMembership.hasLevel ===\r\n\"function\"\r\n){\r\ntry{\r\nreturn Boolean(\r\nwindow.BlissTravelMembership.hasLevel(3)\r\n);\r\n}catch(error){}\r\n}\r\n\r\n\/*\r\n* Backup membership information.\r\n*\/\r\nconst data =\r\nwindow.gggPmsData || {};\r\n\r\nconst owned =\r\ndata.owned || {};\r\n\r\nreturn Boolean(\r\ndata.loggedIn &&\r\n(\r\nowned[3] === true ||\r\nowned[\"3\"] === true ||\r\nowned[3] === 1 ||\r\nowned[\"3\"] === 1 ||\r\nowned[3] === \"1\" ||\r\nowned[\"3\"] === \"1\"\r\n)\r\n);\r\n\r\n}\r\n\r\nfunction cardName(card){\r\n\r\nif(!card){\r\nreturn \"\";\r\n}\r\n\r\nconst name =\r\ncard.querySelector(\r\n\".tc2-rescue-name\"\r\n);\r\n\r\nreturn name\r\n? name.textContent.trim()\r\n: card.textContent.trim();\r\n\r\n}\r\n\r\nfunction applyLevel3Cards(){\r\n\r\nconst hasAccess =\r\nownsLevel3();\r\n\r\ndocument\r\n.querySelectorAll(\r\n\"#tc2ExplorePage \" +\r\n\"[data-tc2-rescue-section]\"\r\n)\r\n.forEach(function(card){\r\n\r\nconst name =\r\ncardName(card);\r\n\r\nif(!isLevel3Guide(name)){\r\ncard.classList.remove(\r\n\"tc2-level3-locked\",\r\n\"tc2-level3-unlocked\"\r\n);\r\n\r\ncard.removeAttribute(\r\n\"data-tc2-level3\"\r\n);\r\n\r\ncard.removeAttribute(\r\n\"aria-disabled\"\r\n);\r\n\r\nreturn;\r\n}\r\n\r\ncard.setAttribute(\r\n\"data-tc2-level3\",\r\n\"true\"\r\n);\r\n\r\ncard.classList.toggle(\r\n\"tc2-level3-locked\",\r\n!hasAccess\r\n);\r\n\r\ncard.classList.toggle(\r\n\"tc2-level3-unlocked\",\r\nhasAccess\r\n);\r\n\r\ncard.setAttribute(\r\n\"aria-disabled\",\r\nhasAccess ? \"false\" : \"true\"\r\n);\r\n\r\ncard.title =\r\nhasAccess\r\n? \"Open \" + name\r\n: name +\r\n\" requires Level 3 membership.\";\r\n\r\n});\r\n\r\n}\r\n\r\nfunction showLevel3Requirement(name){\r\n\r\n\/*\r\n* Use the existing membership popup.\r\n*\/\r\nif(\r\nwindow.BlissTravelMembership &&\r\ntypeof window.BlissTravelMembership\r\n.requireLevel ===\r\n\"function\"\r\n){\r\nwindow.BlissTravelMembership\r\n.requireLevel(\r\n3,\r\nname\r\n);\r\n\r\nreturn;\r\n}\r\n\r\n\/*\r\n* Backup message if the membership modal\r\n* has not loaded yet.\r\n*\/\r\nwindow.alert(\r\nname +\r\n\" requires Level 3 membership.\"\r\n);\r\n\r\n}\r\n\r\n\/*\r\n\u2022 Window capture runs before the older rescue\r\n\u2022 document click handler.\r\n\u2022 This prevents the locked card from opening.\r\n*\/\r\nwindow.addEventListener(\r\n\"click\",\r\nfunction(event){\r\n\r\nconst card =\r\nevent.target &&\r\nevent.target.closest\r\n? event.target.closest(\r\n\"#tc2ExplorePage \" +\r\n\"[data-tc2-rescue-section]\"\r\n)\r\n: null;\r\n\r\nif(!card){\r\nreturn;\r\n}\r\n\r\nconst name =\r\ncardName(card);\r\n\r\nif(\r\n!isLevel3Guide(name) ||\r\nownsLevel3()\r\n){\r\nreturn;\r\n}\r\n\r\nevent.preventDefault();\r\nevent.stopPropagation();\r\nevent.stopImmediatePropagation();\r\n\r\nshowLevel3Requirement(\r\nname\r\n);\r\n\r\n},\r\ntrue\r\n);\r\n\r\n\/*\r\n\u2022 The Rescue renderer repeatedly rebuilds\r\n\u2022 the cards, so reapply the locks whenever\r\n\u2022 Explore changes.\r\n*\/\r\nfunction installObserver(){\r\n\r\nconst grid =\r\ndocument.getElementById(\r\n\"tc2GuideGrid\"\r\n);\r\n\r\nif(!grid){\r\nreturn false;\r\n}\r\n\r\nif(\r\ngrid.dataset.level3LockObserver ===\r\n\"1\"\r\n){\r\napplyLevel3Cards();\r\nreturn true;\r\n}\r\n\r\ngrid.dataset.level3LockObserver =\r\n\"1\";\r\n\r\nconst observer =\r\nnew MutationObserver(\r\nfunction(){\r\napplyLevel3Cards();\r\n}\r\n);\r\n\r\nobserver.observe(\r\ngrid,\r\n{\r\nchildList:true,\r\nsubtree:true\r\n}\r\n);\r\n\r\napplyLevel3Cards();\r\n\r\nreturn true;\r\n\r\n}\r\n\r\n\/*\r\n\u2022 Refresh after the real membership result arrives.\r\n*\/\r\nwindow.addEventListener(\r\n\"blissMembershipLoaded\",\r\nfunction(){\r\nsetTimeout(\r\napplyLevel3Cards,\r\n0\r\n);\r\n}\r\n);\r\n\r\nwindow.addEventListener(\r\n\"blissAuthStateLoaded\",\r\nfunction(){\r\nsetTimeout(\r\napplyLevel3Cards,\r\n0\r\n);\r\n}\r\n);\r\n\r\nif(\r\ndocument.readyState === \"loading\"\r\n){\r\ndocument.addEventListener(\r\n\"DOMContentLoaded\",\r\ninstallObserver,\r\n{once:true}\r\n);\r\n}else{\r\ninstallObserver();\r\n}\r\n\r\nsetTimeout(\r\ninstallObserver,\r\n300\r\n);\r\n\r\nsetTimeout(\r\ninstallObserver,\r\n1000\r\n);\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS EXPLORE MEDELL\u00cdN\r\nBX5 ROUTE GRID VISUAL REPAIR\r\nPASTE AT THE ABSOLUTE BOTTOM\r\n========================================================= -->\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   ENSURE EXPLORE CAN USE THE FULL SCREEN AND SCROLL\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage{\r\n  width:100% !important;\r\n  min-height:100vh !important;\r\n  overflow:visible !important;\r\n}\r\n\r\n#tc2ExplorePage .tc2-shell{\r\n  width:100% !important;\r\n  max-width:1500px !important;\r\n  margin:0 auto !important;\r\n  padding:88px 18px 120px !important;\r\n}\r\n\r\n#tc2ExplorePage .tc2-section{\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-height:calc(100vh - 120px) !important;\r\n  overflow:visible !important;\r\n}\r\n\r\n#tc2GuideGrid{\r\n  display:block !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-width:0 !important;\r\n  margin:24px 0 0 !important;\r\n  overflow:visible !important;\r\n}\r\n\r\n\/* Prevent old one-card grid rules from shrinking the new app *\/\r\n\r\n#tc2GuideGrid > .bx3-app{\r\n  display:block !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-width:0 !important;\r\n  margin:0 !important;\r\n}\r\n\r\n\/* =========================================================\r\n   COMPLETE EXPLORE ROUTE SCREEN\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeStage{\r\n  display:block !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-width:0 !important;\r\n  padding:8px 0 28px !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeHead{\r\n  width:100% !important;\r\n  max-width:1000px !important;\r\n  margin:0 auto 28px !important;\r\n  text-align:center !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeKicker{\r\n  display:inline-flex !important;\r\n  align-items:center !important;\r\n  justify-content:center !important;\r\n  min-height:36px !important;\r\n  padding:7px 15px !important;\r\n  border-radius:999px !important;\r\n  border:1px solid rgba(83,243,255,.32) !important;\r\n  background:rgba(83,243,255,.08) !important;\r\n  color:#8ff7ff !important;\r\n  font-size:.7rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.17em !important;\r\n  line-height:1.2 !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeTitle{\r\n  margin:14px 0 0 !important;\r\n  color:#ffffff !important;\r\n  font-size:clamp(2rem,7vw,4.6rem) !important;\r\n  line-height:.95 !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:-.045em !important;\r\n  text-transform:uppercase !important;\r\n  overflow-wrap:anywhere !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCopy{\r\n  max-width:850px !important;\r\n  margin:16px auto 0 !important;\r\n  color:rgba(248,251,255,.76) !important;\r\n  font-size:clamp(.95rem,2vw,1.08rem) !important;\r\n  line-height:1.65 !important;\r\n}\r\n\r\n\/* =========================================================\r\n   THE OPTIONS GRID\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeGrid{\r\n  display:grid !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-width:0 !important;\r\n  grid-template-columns:\r\n    repeat(3, minmax(0, 1fr)) !important;\r\n  align-items:stretch !important;\r\n  gap:20px !important;\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n}\r\n\r\n\/* =========================================================\r\n   INDIVIDUAL OPTION CARD\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeCard{\r\n  appearance:none !important;\r\n  -webkit-appearance:none !important;\r\n\r\n  display:flex !important;\r\n  flex-direction:column !important;\r\n  align-items:flex-start !important;\r\n\r\n  position:relative !important;\r\n  width:100% !important;\r\n  min-width:0 !important;\r\n  min-height:250px !important;\r\n  height:auto !important;\r\n\r\n  margin:0 !important;\r\n  padding:24px !important;\r\n\r\n  border:1px solid rgba(83,243,255,.23) !important;\r\n  border-radius:27px !important;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 18% 5%,\r\n      rgba(83,243,255,.18),\r\n      transparent 35%\r\n    ),\r\n    radial-gradient(\r\n      circle at 92% 100%,\r\n      rgba(139,92,246,.18),\r\n      transparent 40%\r\n    ),\r\n    linear-gradient(\r\n      155deg,\r\n      rgba(13,24,48,.98),\r\n      rgba(4,8,20,.99)\r\n    ) !important;\r\n\r\n  color:#ffffff !important;\r\n  text-align:left !important;\r\n  white-space:normal !important;\r\n  overflow:hidden !important;\r\n  cursor:pointer !important;\r\n\r\n  box-shadow:\r\n    inset 0 0 0 1px rgba(255,255,255,.035),\r\n    0 18px 44px rgba(0,0,0,.34),\r\n    0 0 25px rgba(83,243,255,.07) !important;\r\n\r\n  transform:none !important;\r\n  opacity:1 !important;\r\n  visibility:visible !important;\r\n\r\n  transition:\r\n    transform .22s ease,\r\n    border-color .22s ease,\r\n    box-shadow .22s ease !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCard::before{\r\n  content:\"\" !important;\r\n  position:absolute !important;\r\n  inset:0 !important;\r\n  pointer-events:none !important;\r\n  background:\r\n    linear-gradient(\r\n      125deg,\r\n      transparent 15%,\r\n      rgba(255,255,255,.055),\r\n      transparent 48%\r\n    ) !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCard:hover{\r\n  transform:translateY(-5px) !important;\r\n  border-color:rgba(83,243,255,.62) !important;\r\n  box-shadow:\r\n    inset 0 0 0 1px rgba(255,255,255,.055),\r\n    0 24px 54px rgba(0,0,0,.42),\r\n    0 0 32px rgba(83,243,255,.18) !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCard:active{\r\n  transform:translateY(-1px) scale(.99) !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCard:focus-visible{\r\n  outline:3px solid rgba(83,243,255,.82) !important;\r\n  outline-offset:4px !important;\r\n}\r\n\r\n\/* =========================================================\r\n   CONTENT INSIDE EACH CARD\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeIcon{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  display:flex !important;\r\n  align-items:center !important;\r\n  justify-content:center !important;\r\n\r\n  width:64px !important;\r\n  height:64px !important;\r\n  flex:0 0 64px !important;\r\n\r\n  margin:0 0 18px !important;\r\n  border-radius:20px !important;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle,\r\n      rgba(255,255,255,.16),\r\n      rgba(83,243,255,.08)\r\n    ) !important;\r\n\r\n  border:1px solid rgba(255,255,255,.15) !important;\r\n\r\n  color:#ffffff !important;\r\n  font-size:2rem !important;\r\n  line-height:1 !important;\r\n\r\n  box-shadow:\r\n    0 0 24px rgba(83,243,255,.20),\r\n    inset 0 0 18px rgba(255,255,255,.05) !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeLevel{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  display:inline-flex !important;\r\n  width:auto !important;\r\n\r\n  margin:0 0 10px !important;\r\n  padding:6px 10px !important;\r\n\r\n  border-radius:999px !important;\r\n  border:1px solid rgba(83,243,255,.22) !important;\r\n  background:rgba(83,243,255,.07) !important;\r\n\r\n  color:#8ff7ff !important;\r\n  font-size:.65rem !important;\r\n  line-height:1.2 !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.14em !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCardTitle{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  display:block !important;\r\n  width:100% !important;\r\n\r\n  margin:0 !important;\r\n\r\n  color:#ffffff !important;\r\n  font-size:clamp(1.3rem,2.2vw,1.8rem) !important;\r\n  line-height:1.05 !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:-.025em !important;\r\n  text-transform:uppercase !important;\r\n\r\n  overflow-wrap:anywhere !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeMeta{\r\n  position:relative !important;\r\n  z-index:2 !important;\r\n\r\n  display:block !important;\r\n  width:100% !important;\r\n\r\n  margin:14px 0 0 !important;\r\n\r\n  color:rgba(248,251,255,.70) !important;\r\n  font-size:.92rem !important;\r\n  line-height:1.55 !important;\r\n  font-weight:500 !important;\r\n\r\n  white-space:normal !important;\r\n  overflow-wrap:anywhere !important;\r\n}\r\n\r\n\/* =========================================================\r\n   LOCKED LEVEL 3 ROUTES\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeCard.is-locked{\r\n  opacity:.64 !important;\r\n  filter:saturate(.65) brightness(.78) !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeCard.is-locked::after{\r\n  content:\"LOCKED\" !important;\r\n  position:absolute !important;\r\n  top:18px !important;\r\n  right:18px !important;\r\n  z-index:5 !important;\r\n\r\n  padding:6px 9px !important;\r\n  border-radius:999px !important;\r\n\r\n  background:rgba(0,0,0,.62) !important;\r\n  border:1px solid rgba(255,107,138,.40) !important;\r\n\r\n  color:#ff9cb1 !important;\r\n  font-size:.61rem !important;\r\n  font-weight:900 !important;\r\n  letter-spacing:.13em !important;\r\n}\r\n\r\n\/* =========================================================\r\n   FOOTER AND BACK BUTTON\r\n========================================================= *\/\r\n\r\n#tc2ExplorePage .bx5-routeFooter{\r\n  display:flex !important;\r\n  align-items:center !important;\r\n  justify-content:space-between !important;\r\n  flex-wrap:wrap !important;\r\n  gap:12px !important;\r\n  width:100% !important;\r\n  margin-top:26px !important;\r\n}\r\n\r\n#tc2ExplorePage .bx5-routeHint{\r\n  color:rgba(248,251,255,.46) !important;\r\n  font-size:.7rem !important;\r\n  font-weight:800 !important;\r\n  letter-spacing:.15em !important;\r\n  text-transform:uppercase !important;\r\n}\r\n\r\n#tc2ExplorePage .bx3-back{\r\n  appearance:none !important;\r\n  min-height:46px !important;\r\n  padding:0 18px !important;\r\n  border-radius:15px !important;\r\n  border:1px solid rgba(83,243,255,.28) !important;\r\n  background:rgba(83,243,255,.08) !important;\r\n  color:#ffffff !important;\r\n  font-weight:900 !important;\r\n  cursor:pointer !important;\r\n}\r\n\r\n\/* =========================================================\r\n   TABLETS\r\n========================================================= *\/\r\n\r\n@media (max-width:1050px){\r\n\r\n  #tc2ExplorePage .bx5-routeGrid{\r\n    grid-template-columns:\r\n      repeat(2, minmax(0, 1fr)) !important;\r\n  }\r\n\r\n}\r\n\r\n\/* =========================================================\r\n   PHONES\r\n========================================================= *\/\r\n\r\n@media (max-width:680px){\r\n\r\n  #tc2ExplorePage .tc2-shell{\r\n    padding:\r\n      78px 12px 110px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .tc2-section{\r\n    padding:18px 12px 28px !important;\r\n    border-radius:24px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeHead{\r\n    margin-bottom:20px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeGrid{\r\n    grid-template-columns:\r\n      minmax(0, 1fr) !important;\r\n    gap:14px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeCard{\r\n    min-height:210px !important;\r\n    padding:20px !important;\r\n    border-radius:23px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeIcon{\r\n    width:56px !important;\r\n    height:56px !important;\r\n    flex-basis:56px !important;\r\n    border-radius:17px !important;\r\n    font-size:1.7rem !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeCardTitle{\r\n    font-size:1.35rem !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeMeta{\r\n    font-size:.88rem !important;\r\n  }\r\n\r\n}\r\n\r\n\/* =========================================================\r\n   VERY SMALL PHONES\r\n========================================================= *\/\r\n\r\n@media (max-width:390px){\r\n\r\n  #tc2ExplorePage .tc2-shell{\r\n    padding-left:8px !important;\r\n    padding-right:8px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .tc2-section{\r\n    padding-left:10px !important;\r\n    padding-right:10px !important;\r\n  }\r\n\r\n  #tc2ExplorePage .bx5-routeCard{\r\n    padding:18px !important;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Sign In \/ Sign Up Fractional Club Real Estate Discounts &amp; Investments Travel Club Explore Journey Services Story \u2190 \u2630 Travel Club A private membership to discover, plan, experience, and remember destinations. The Club Travel Brain Service Scope Disclosures Terms Privacy Contact The Travel Club helps members explore Medell\u00edn, build a journey, request local services, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3539","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/3539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/comments?post=3539"}],"version-history":[{"count":515,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/3539\/revisions"}],"predecessor-version":[{"id":9723,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/3539\/revisions\/9723"}],"wp:attachment":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/media?parent=3539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}