{"id":7100,"date":"2026-03-30T22:30:27","date_gmt":"2026-03-30T22:30:27","guid":{"rendered":"https:\/\/godsgalaxygame.com\/GGG\/password-reset\/"},"modified":"2026-09-01T21:33:47","modified_gmt":"2026-09-01T21:33:47","slug":"password-reset","status":"publish","type":"page","link":"https:\/\/godsgalaxygame.com\/GGG\/password-reset\/","title":{"rendered":"Password Reset"},"content":{"rendered":"<div class=\"pms-block-container\">\n<form id=\"pms_recover_password_form\" class=\"pms-form \"  method=\"post\" action=\"\">\n\n    <input type=\"hidden\" id=\"pmstkn\" name=\"pmstkn\" value=\"2acdb75ff2\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/GGG\/wp-json\/wp\/v2\/pages\/7100\" \/>\n    <p>Please enter your username or email address.<br \/>You will receive a link to create a new password via email.<\/p>\n    <ul class=\"pms-form-fields-wrapper\">\n\n        \n                <li class=\"pms-field \">\n            <label for=\"pms_username_email\">Username or Email<\/label>\n            <input id=\"pms_username_email\" name=\"pms_username_email\" type=\"text\" value=\"\" \/>\n\n                    <\/li>\n\n        \n    <\/ul>\n\n    \n    <input type=\"submit\" name=\"wp-submit\" value=\"Reset Password\"\/>\n\n<\/form>\n\n\n\n<\/div>\r\n\r\n\r\n<style>\r\n\/* =========================================\r\n   GODS GALAXY GAME - PASSWORD RESET PAGE\r\n========================================= *\/\r\n\r\n\/* PAGE BACKGROUND *\/\r\nhtml,\r\nbody,\r\n.wp-site-blocks,\r\nmain,\r\n.entry-content,\r\n.post-content,\r\n.site-content {\r\n  background:\r\n    radial-gradient(circle at top, rgba(0,255,255,0.08), transparent 25%),\r\n    radial-gradient(circle at 80% 20%, rgba(128,0,255,0.12), transparent 25%),\r\n    linear-gradient(180deg, #050814 0%, #000000 55%, #050814 100%) !important;\r\n  color: #eafcff !important;\r\n  overflow-x: hidden !important;\r\n}\r\n\r\n\/* MAIN RESET WRAPPER *\/\r\nbody .pms-recover-password-container,\r\nbody .pms-recover-password-form,\r\nbody form[id*=\"pms_recover_password\"],\r\nbody form[class*=\"recover\"],\r\nbody .entry-content form {\r\n  max-width: 820px !important;\r\n  margin: 40px auto !important;\r\n  padding: 28px !important;\r\n  border-radius: 24px !important;\r\n  background: linear-gradient(180deg, rgba(9,15,35,0.92), rgba(0,0,0,0.9)) !important;\r\n  border: 1px solid rgba(0,255,255,0.25) !important;\r\n  box-shadow:\r\n    0 0 0 1px rgba(255,255,255,0.03) inset,\r\n    0 0 24px rgba(0,255,255,0.08),\r\n    0 0 55px rgba(91,0,255,0.10) !important;\r\n  backdrop-filter: blur(6px) !important;\r\n  color: #eafcff !important;\r\n}\r\n\r\n\/* HEADINGS + TEXT *\/\r\nbody .pms-recover-password-container h1,\r\nbody .pms-recover-password-container h2,\r\nbody .pms-recover-password-container h3,\r\nbody .pms-recover-password-form h1,\r\nbody .pms-recover-password-form h2,\r\nbody .pms-recover-password-form h3,\r\nbody .entry-content h1,\r\nbody .entry-content h2,\r\nbody .entry-content h3 {\r\n  color: #ffffff !important;\r\n  -webkit-text-fill-color: #ffffff !important;\r\n  text-shadow: 0 0 14px rgba(0,255,255,0.22) !important;\r\n}\r\n\r\nbody .pms-recover-password-container p,\r\nbody .pms-recover-password-container label,\r\nbody .pms-recover-password-form p,\r\nbody .pms-recover-password-form label,\r\nbody .entry-content form p,\r\nbody .entry-content form label {\r\n  color: #eafcff !important;\r\n  -webkit-text-fill-color: #eafcff !important;\r\n}\r\n\r\n\/* LABELS *\/\r\nbody .pms-recover-password-container label,\r\nbody .pms-recover-password-form label,\r\nbody .entry-content form label {\r\n  display: block !important;\r\n  margin: 0 0 10px 0 !important;\r\n  color: #7df9ff !important;\r\n  -webkit-text-fill-color: #7df9ff !important;\r\n  font-weight: 700 !important;\r\n  text-transform: uppercase !important;\r\n  font-size: 12px !important;\r\n  letter-spacing: .5px !important;\r\n  text-shadow: 0 0 8px rgba(125,249,255,0.35) !important;\r\n  background: rgba(0, 20, 40, 0.72) !important;\r\n  padding: 4px 10px !important;\r\n  border-radius: 8px !important;\r\n  width: fit-content !important;\r\n}\r\n\r\n\/* INPUT *\/\r\nbody .pms-recover-password-container input[type=\"text\"],\r\nbody .pms-recover-password-container input[type=\"email\"],\r\nbody .pms-recover-password-form input[type=\"text\"],\r\nbody .pms-recover-password-form input[type=\"email\"],\r\nbody .entry-content form input[type=\"text\"],\r\nbody .entry-content form input[type=\"email\"] {\r\n  width: 100% !important;\r\n  box-sizing: border-box !important;\r\n  padding: 16px !important;\r\n  border-radius: 16px !important;\r\n  border: 1px solid rgba(0,255,255,0.20) !important;\r\n  background: rgba(255,255,255,0.08) !important;\r\n  color: #ffffff !important;\r\n  -webkit-text-fill-color: #ffffff !important;\r\n  box-shadow:\r\n    0 0 0 1px rgba(255,255,255,0.03) inset,\r\n    0 0 10px rgba(0,255,255,0.04) !important;\r\n}\r\n\r\n\/* BUTTON *\/\r\nbody .pms-recover-password-container input[type=\"submit\"],\r\nbody .pms-recover-password-container button,\r\nbody .pms-recover-password-form input[type=\"submit\"],\r\nbody .pms-recover-password-form button,\r\nbody .entry-content form input[type=\"submit\"],\r\nbody .entry-content form button {\r\n  display: inline-block !important;\r\n  padding: 14px 24px !important;\r\n  border-radius: 16px !important;\r\n  text-decoration: none !important;\r\n  font-weight: 700 !important;\r\n  font-size: 16px !important;\r\n  letter-spacing: .4px !important;\r\n  color: #ffffff !important;\r\n  -webkit-text-fill-color: #ffffff !important;\r\n  background: linear-gradient(135deg, rgba(0,255,255,0.16), rgba(91,0,255,0.20), rgba(255,215,0,0.10)) !important;\r\n  border: 1px solid rgba(0,255,255,0.35) !important;\r\n  box-shadow:\r\n    0 0 12px rgba(0,255,255,0.14),\r\n    0 0 26px rgba(91,0,255,0.10) !important;\r\n}\r\n\r\n\/* HOVER *\/\r\nbody .pms-recover-password-container input[type=\"submit\"]:hover,\r\nbody .pms-recover-password-container button:hover,\r\nbody .pms-recover-password-form input[type=\"submit\"]:hover,\r\nbody .pms-recover-password-form button:hover,\r\nbody .entry-content form input[type=\"submit\"]:hover,\r\nbody .entry-content form button:hover {\r\n  transform: translateY(-1px) !important;\r\n  box-shadow:\r\n    0 0 16px rgba(0,255,255,0.22),\r\n    0 0 30px rgba(91,0,255,0.16) !important;\r\n}\r\n\r\n\/* MOBILE *\/\r\n@media (max-width: 767px) {\r\n  body .pms-recover-password-container,\r\n  body .pms-recover-password-form,\r\n  body form[id*=\"pms_recover_password\"],\r\n  body form[class*=\"recover\"],\r\n  body .entry-content form {\r\n    margin: 18px 12px !important;\r\n    padding: 18px !important;\r\n    border-radius: 20px !important;\r\n  }\r\n\r\n  body .entry-content h1,\r\n  body .entry-content h2,\r\n  body .entry-content h3 {\r\n    font-size: 26px !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n\r\n\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 *{\r\n  visibility:hidden !important;\r\n}\r\n\r\nbody.tc2Hide #tc2Overlay,\r\nbody.tc2Hide #tc2Overlay *,\r\nbody.tc2Hide #blissMemberChatOverlay,\r\nbody.tc2Hide #blissMemberChatOverlay *{\r\n  visibility:visible !important;\r\n}\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 !important;\r\n  top:18px !important;\r\n  left:18px !important;\r\n  right:auto !important;\r\n  bottom:auto !important;\r\n\r\n  width:50px !important;\r\n  height:50px !important;\r\n\r\n  z-index:2147483647 !important;\r\n\r\n  visibility:visible !important;\r\n  opacity:1 !important;\r\n\r\n  pointer-events:auto !important;\r\n  touch-action:manipulation !important;\r\n\r\n  border:none;\r\n  border-radius:50%;\r\n  background:rgba(8,13,28,.65);\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\r\n\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\r\n\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:80px!important;\r\n  height:80px!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\r\n  #astroWheel{\r\n    width:min(82vw,340px) !important;\r\n    height:min(82vw,340px) !important;\r\n    margin:30px auto 24px !important;\r\n    transform:none !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:68px !important;\r\n    height:68px !important;\r\n  }\r\n\r\n  .astro-symbol{\r\n    font-size:1.45rem !important;\r\n  }\r\n\r\n  .astro-name{\r\n    font-size:.5rem !important;\r\n  }\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\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.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\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\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\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\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\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\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\r\n\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\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\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\r\n\/* =========================================================\r\n   BLISS EXPLORE MEDELL\u00cdN\r\n   VISUAL DESIGN OVERRIDE V1\r\n\r\n   Level 2: Cyan \/ Emerald\r\n   Level 3: Gold \/ Violet\r\n   Locked: Dark \/ Muted\r\n   ========================================================= *\/\r\n\r\n\/* =========================\r\n   MAIN EXPLORE AREA\r\n   ========================= *\/\r\n\r\n#tc2ExplorePage {\r\n  --explore-cyan: #00f5ff;\r\n  --explore-blue: #148cff;\r\n  --explore-green: #26ffb2;\r\n  --explore-gold: #ffd76a;\r\n  --explore-violet: #b77cff;\r\n  --explore-red: #ff5277;\r\n\r\n  --explore-text: #f4fbff;\r\n  --explore-muted: rgba(226, 243, 255, 0.7);\r\n  --explore-panel: rgba(5, 13, 25, 0.82);\r\n  --explore-border: rgba(108, 224, 255, 0.25);\r\n\r\n  position: relative;\r\n  overflow-x: hidden;\r\n  color: var(--explore-text);\r\n}\r\n\r\n#tc2ExplorePage::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  inset: 0;\r\n  pointer-events: none;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 15% 10%,\r\n      rgba(0, 245, 255, 0.13),\r\n      transparent 30%\r\n    ),\r\n    radial-gradient(\r\n      circle at 88% 22%,\r\n      rgba(38, 255, 178, 0.1),\r\n      transparent 28%\r\n    ),\r\n    radial-gradient(\r\n      circle at 50% 100%,\r\n      rgba(183, 124, 255, 0.1),\r\n      transparent 35%\r\n    );\r\n\r\n  z-index: 0;\r\n}\r\n\r\n#tc2ExplorePage .tc2-shell,\r\n#tc2ExplorePage .tc2-glass,\r\n#tc2GuideGrid {\r\n  position: relative;\r\n  z-index: 1;\r\n}\r\n\r\n\/* Remove restrictive sizing from the old guide grid *\/\r\n\r\n#tc2GuideGrid {\r\n  width: 100%;\r\n  max-width: 1600px;\r\n  margin: 0 auto;\r\n  padding: 10px 0 40px;\r\n}\r\n\r\n\/* Main generated application *\/\r\n\r\n#tc2GuideGrid .bx3-app {\r\n  width: 100%;\r\n  color: var(--explore-text);\r\n  font-family:\r\n    Orbitron,\r\n    Inter,\r\n    system-ui,\r\n    -apple-system,\r\n    BlinkMacSystemFont,\r\n    \"Segoe UI\",\r\n    sans-serif;\r\n}\r\n\r\n\r\n\/* =========================\r\n   ROUTE SCREEN\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeStage {\r\n  position: relative;\r\n  width: 100%;\r\n  padding: clamp(18px, 3vw, 38px);\r\n  border: 1px solid var(--explore-border);\r\n  border-radius: 32px;\r\n  overflow: hidden;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(8, 21, 38, 0.93),\r\n      rgba(2, 8, 18, 0.9)\r\n    );\r\n\r\n  box-shadow:\r\n    0 24px 70px rgba(0, 0, 0, 0.45),\r\n    0 0 35px rgba(0, 245, 255, 0.08),\r\n    inset 0 0 35px rgba(0, 245, 255, 0.03);\r\n\r\n  backdrop-filter: blur(18px);\r\n  -webkit-backdrop-filter: blur(18px);\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeStage::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  inset: 0;\r\n  pointer-events: none;\r\n\r\n  background:\r\n    linear-gradient(\r\n      120deg,\r\n      transparent 0%,\r\n      rgba(0, 245, 255, 0.04) 40%,\r\n      transparent 70%\r\n    );\r\n}\r\n\r\n\r\n\/* =========================\r\n   ROUTE HEADER\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeHead {\r\n  position: relative;\r\n  max-width: 850px;\r\n  margin: 0 auto 30px;\r\n  text-align: center;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeKicker {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  min-height: 30px;\r\n  margin-bottom: 12px;\r\n  padding: 6px 14px;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.35);\r\n  border-radius: 999px;\r\n\r\n  background: rgba(0, 245, 255, 0.07);\r\n  color: #86faff;\r\n\r\n  font-size: 11px;\r\n  font-weight: 900;\r\n  letter-spacing: 2px;\r\n  text-transform: uppercase;\r\n\r\n  box-shadow:\r\n    0 0 18px rgba(0, 245, 255, 0.13),\r\n    inset 0 0 12px rgba(0, 245, 255, 0.05);\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeTitle {\r\n  margin: 0;\r\n  color: #ffffff;\r\n\r\n  font-size: clamp(28px, 5vw, 54px);\r\n  font-weight: 950;\r\n  line-height: 1.05;\r\n  letter-spacing: -1.4px;\r\n\r\n  text-shadow:\r\n    0 0 18px rgba(0, 245, 255, 0.18),\r\n    0 3px 18px rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCopy {\r\n  max-width: 760px;\r\n  margin: 16px auto 0;\r\n\r\n  color: var(--explore-muted);\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: clamp(14px, 1.8vw, 17px);\r\n  line-height: 1.75;\r\n}\r\n\r\n\r\n\/* =========================\r\n   ROUTE GRID\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeGrid {\r\n  position: relative;\r\n  display: grid;\r\n  grid-template-columns:\r\n    repeat(\r\n      auto-fit,\r\n      minmax(min(100%, 245px), 1fr)\r\n    );\r\n\r\n  gap: 18px;\r\n  width: 100%;\r\n}\r\n\r\n\r\n\/* =========================\r\n   LEVEL 2 ROUTE CARDS\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeCard {\r\n  position: relative;\r\n  min-height: 230px;\r\n  padding: 25px 22px 22px;\r\n  overflow: hidden;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.26);\r\n  border-radius: 25px;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 85% 10%,\r\n      rgba(0, 245, 255, 0.13),\r\n      transparent 34%\r\n    ),\r\n    linear-gradient(\r\n      150deg,\r\n      rgba(11, 33, 48, 0.94),\r\n      rgba(5, 13, 25, 0.96)\r\n    );\r\n\r\n  color: #ffffff;\r\n  text-align: left;\r\n  cursor: pointer;\r\n\r\n  box-shadow:\r\n    0 15px 35px rgba(0, 0, 0, 0.33),\r\n    0 0 0 rgba(0, 245, 255, 0);\r\n\r\n  transition:\r\n    transform 0.28s ease,\r\n    border-color 0.28s ease,\r\n    box-shadow 0.28s ease,\r\n    background 0.28s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  top: 0;\r\n  left: 18px;\r\n  right: 18px;\r\n  height: 2px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      90deg,\r\n      transparent,\r\n      var(--explore-cyan),\r\n      var(--explore-green),\r\n      transparent\r\n    );\r\n\r\n  opacity: 0.65;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard::after {\r\n  content: \"\";\r\n  position: absolute;\r\n  width: 150px;\r\n  height: 150px;\r\n  right: -85px;\r\n  bottom: -85px;\r\n  border-radius: 50%;\r\n\r\n  background: rgba(0, 245, 255, 0.08);\r\n  filter: blur(2px);\r\n\r\n  transition:\r\n    transform 0.35s ease,\r\n    opacity 0.35s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard:hover {\r\n  transform: translateY(-7px) scale(1.015);\r\n  border-color: rgba(0, 245, 255, 0.72);\r\n\r\n  box-shadow:\r\n    0 22px 45px rgba(0, 0, 0, 0.42),\r\n    0 0 28px rgba(0, 245, 255, 0.17),\r\n    inset 0 0 24px rgba(0, 245, 255, 0.04);\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard:hover::after {\r\n  transform: scale(1.35);\r\n  opacity: 1;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard:active {\r\n  transform: translateY(-2px) scale(0.99);\r\n}\r\n\r\n\r\n\/* Route icon *\/\r\n\r\n#tc2GuideGrid .bx5-routeIcon {\r\n  position: relative;\r\n  z-index: 2;\r\n\r\n  display: grid;\r\n  place-items: center;\r\n\r\n  width: 62px;\r\n  height: 62px;\r\n  margin-bottom: 20px;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.3);\r\n  border-radius: 19px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(0, 245, 255, 0.15),\r\n      rgba(38, 255, 178, 0.06)\r\n    );\r\n\r\n  font-size: 31px;\r\n\r\n  box-shadow:\r\n    0 0 22px rgba(0, 245, 255, 0.12),\r\n    inset 0 0 16px rgba(255, 255, 255, 0.03);\r\n\r\n  transition:\r\n    transform 0.28s ease,\r\n    box-shadow 0.28s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard:hover .bx5-routeIcon {\r\n  transform: rotate(-4deg) scale(1.08);\r\n\r\n  box-shadow:\r\n    0 0 28px rgba(0, 245, 255, 0.25),\r\n    inset 0 0 16px rgba(255, 255, 255, 0.05);\r\n}\r\n\r\n\r\n\/* Membership level label *\/\r\n\r\n#tc2GuideGrid .bx5-routeLevel {\r\n  position: relative;\r\n  z-index: 2;\r\n\r\n  display: inline-flex;\r\n  align-items: center;\r\n\r\n  margin-bottom: 11px;\r\n  padding: 5px 10px;\r\n\r\n  border: 1px solid rgba(38, 255, 178, 0.28);\r\n  border-radius: 999px;\r\n\r\n  background: rgba(38, 255, 178, 0.07);\r\n  color: #7dffd1;\r\n\r\n  font-size: 9px;\r\n  font-weight: 900;\r\n  letter-spacing: 1.2px;\r\n  line-height: 1;\r\n  text-transform: uppercase;\r\n}\r\n\r\n\r\n\/* Card title *\/\r\n\r\n#tc2GuideGrid .bx5-routeCardTitle {\r\n  position: relative;\r\n  z-index: 2;\r\n\r\n  margin: 0;\r\n  color: #ffffff;\r\n\r\n  font-size: clamp(18px, 2vw, 23px);\r\n  font-weight: 900;\r\n  line-height: 1.2;\r\n}\r\n\r\n\r\n\/* Card description *\/\r\n\r\n#tc2GuideGrid .bx5-routeMeta {\r\n  position: relative;\r\n  z-index: 2;\r\n\r\n  margin-top: 11px;\r\n  color: rgba(228, 245, 255, 0.68);\r\n\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 13px;\r\n  line-height: 1.6;\r\n}\r\n\r\n\r\n\/* =========================\r\n   LEVEL 3 ROOT CARDS\r\n   Discover \/ Entertainment \/\r\n   Medical Tourism\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"discover\"],\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"entertainment\"],\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"medical-tourism\"] {\r\n  border-color: rgba(255, 215, 106, 0.42);\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 85% 10%,\r\n      rgba(255, 215, 106, 0.18),\r\n      transparent 34%\r\n    ),\r\n    radial-gradient(\r\n      circle at 10% 100%,\r\n      rgba(183, 124, 255, 0.12),\r\n      transparent 42%\r\n    ),\r\n    linear-gradient(\r\n      150deg,\r\n      rgba(37, 28, 47, 0.96),\r\n      rgba(10, 8, 20, 0.97)\r\n    );\r\n}\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"discover\"]::before,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"entertainment\"]::before,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"medical-tourism\"]::before {\r\n  background:\r\n    linear-gradient(\r\n      90deg,\r\n      transparent,\r\n      var(--explore-gold),\r\n      var(--explore-violet),\r\n      transparent\r\n    );\r\n}\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"discover\"]\r\n.bx5-routeIcon,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"entertainment\"]\r\n.bx5-routeIcon,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"medical-tourism\"]\r\n.bx5-routeIcon {\r\n  border-color: rgba(255, 215, 106, 0.42);\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(255, 215, 106, 0.18),\r\n      rgba(183, 124, 255, 0.1)\r\n    );\r\n\r\n  box-shadow:\r\n    0 0 24px rgba(255, 215, 106, 0.15),\r\n    inset 0 0 18px rgba(183, 124, 255, 0.05);\r\n}\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"discover\"]\r\n.bx5-routeLevel,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"entertainment\"]\r\n.bx5-routeLevel,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"medical-tourism\"]\r\n.bx5-routeLevel {\r\n  border-color: rgba(255, 215, 106, 0.38);\r\n  background: rgba(255, 215, 106, 0.08);\r\n  color: var(--explore-gold);\r\n}\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"discover\"]:hover,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"entertainment\"]:hover,\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard[data-bx3-open=\"medical-tourism\"]:hover {\r\n  border-color: rgba(255, 215, 106, 0.86);\r\n\r\n  box-shadow:\r\n    0 22px 48px rgba(0, 0, 0, 0.44),\r\n    0 0 30px rgba(255, 215, 106, 0.18),\r\n    0 0 42px rgba(183, 124, 255, 0.09);\r\n}\r\n\r\n\r\n\/* =========================\r\n   LOCKED LEVEL 3 CARDS\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeCard.is-locked {\r\n  border-color: rgba(255, 255, 255, 0.13);\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(21, 24, 31, 0.9),\r\n      rgba(6, 8, 13, 0.96)\r\n    );\r\n\r\n  filter: saturate(0.58);\r\n  opacity: 0.78;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard.is-locked::after {\r\n  content: \"\ud83d\udd12\";\r\n  top: 18px;\r\n  right: 18px;\r\n  bottom: auto;\r\n\r\n  display: grid;\r\n  place-items: center;\r\n\r\n  width: 39px;\r\n  height: 39px;\r\n\r\n  border: 1px solid rgba(255, 215, 106, 0.25);\r\n  border-radius: 50%;\r\n\r\n  background: rgba(0, 0, 0, 0.52);\r\n  font-size: 16px;\r\n\r\n  filter: none;\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeCard.is-locked:hover {\r\n  transform: translateY(-3px);\r\n  border-color: rgba(255, 215, 106, 0.35);\r\n\r\n  box-shadow:\r\n    0 18px 38px rgba(0, 0, 0, 0.38),\r\n    0 0 22px rgba(255, 215, 106, 0.08);\r\n}\r\n\r\n#tc2GuideGrid\r\n.bx5-routeCard.is-locked\r\n.bx5-routeLevel {\r\n  border-color: rgba(255, 215, 106, 0.3);\r\n  background: rgba(255, 215, 106, 0.06);\r\n  color: #ffe59c;\r\n}\r\n\r\n\r\n\/* =========================\r\n   ROUTE FOOTER\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx5-routeFooter {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 14px;\r\n\r\n  margin-top: 26px;\r\n  padding-top: 19px;\r\n\r\n  border-top: 1px solid rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n#tc2GuideGrid .bx5-routeHint {\r\n  color: rgba(219, 240, 255, 0.48);\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 12px;\r\n}\r\n\r\n\r\n\/* =========================\r\n   LEAF \/ HOST SCREEN\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-screen {\r\n  width: 100%;\r\n  padding: clamp(18px, 3vw, 36px);\r\n\r\n  border: 1px solid var(--explore-border);\r\n  border-radius: 30px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(8, 20, 37, 0.95),\r\n      rgba(3, 9, 18, 0.94)\r\n    );\r\n\r\n  box-shadow:\r\n    0 24px 65px rgba(0, 0, 0, 0.44),\r\n    0 0 32px rgba(0, 245, 255, 0.07);\r\n\r\n  backdrop-filter: blur(18px);\r\n  -webkit-backdrop-filter: blur(18px);\r\n}\r\n\r\n#tc2GuideGrid .bx3-topline {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  justify-content: space-between;\r\n  gap: 25px;\r\n  margin-bottom: 27px;\r\n}\r\n\r\n#tc2GuideGrid .bx3-eyebrow {\r\n  display: inline-flex;\r\n  margin-bottom: 10px;\r\n  padding: 6px 11px;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.3);\r\n  border-radius: 999px;\r\n\r\n  background: rgba(0, 245, 255, 0.07);\r\n  color: #83f9ff;\r\n\r\n  font-size: 10px;\r\n  font-weight: 900;\r\n  letter-spacing: 1.3px;\r\n  text-transform: uppercase;\r\n}\r\n\r\n#tc2GuideGrid .bx3-sectionTitle {\r\n  margin: 0;\r\n  color: #ffffff;\r\n\r\n  font-size: clamp(27px, 4vw, 44px);\r\n  font-weight: 950;\r\n  line-height: 1.1;\r\n}\r\n\r\n#tc2GuideGrid .bx3-lead {\r\n  max-width: 760px;\r\n  margin: 13px 0 0;\r\n\r\n  color: var(--explore-muted);\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 15px;\r\n  line-height: 1.7;\r\n}\r\n\r\n\r\n\/* =========================\r\n   BREADCRUMBS\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-route {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 7px;\r\n  margin-top: 16px;\r\n}\r\n\r\n#tc2GuideGrid .bx3-route span {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  padding: 5px 9px;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.17);\r\n  border-radius: 999px;\r\n\r\n  background: rgba(255, 255, 255, 0.035);\r\n  color: rgba(221, 246, 255, 0.7);\r\n\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 10px;\r\n}\r\n\r\n#tc2GuideGrid .bx3-route span:not(:last-child)::after {\r\n  content: \"\u203a\";\r\n  margin-left: 7px;\r\n  color: var(--explore-cyan);\r\n}\r\n\r\n\r\n\/* =========================\r\n   HOST GRID\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-hostGrid {\r\n  display: grid;\r\n  grid-template-columns:\r\n    repeat(\r\n      auto-fit,\r\n      minmax(min(100%, 280px), 1fr)\r\n    );\r\n\r\n  gap: 20px;\r\n  width: 100%;\r\n}\r\n\r\n\r\n\/* =========================\r\n   HOST CARDS\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-host {\r\n  position: relative;\r\n  overflow: hidden;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.2);\r\n  border-radius: 25px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      150deg,\r\n      rgba(12, 30, 45, 0.95),\r\n      rgba(5, 12, 23, 0.97)\r\n    );\r\n\r\n  box-shadow:\r\n    0 17px 38px rgba(0, 0, 0, 0.36);\r\n\r\n  transition:\r\n    transform 0.28s ease,\r\n    border-color 0.28s ease,\r\n    box-shadow 0.28s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx3-host:hover {\r\n  transform: translateY(-6px);\r\n  border-color: rgba(0, 245, 255, 0.58);\r\n\r\n  box-shadow:\r\n    0 23px 45px rgba(0, 0, 0, 0.42),\r\n    0 0 24px rgba(0, 245, 255, 0.12);\r\n}\r\n\r\n#tc2GuideGrid .bx3-hostImage {\r\n  width: 100%;\r\n  height: 280px;\r\n\r\n  background-color: #07101a;\r\n  background-position: center;\r\n  background-repeat: no-repeat;\r\n  background-size: contain;\r\n\r\n  transition: transform 0.4s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx3-host:hover .bx3-hostImage {\r\n  transform: scale(1.035);\r\n}\r\n\r\n#tc2GuideGrid .bx3-hostBody {\r\n  position: relative;\r\n  padding: 21px;\r\n}\r\n\r\n#tc2GuideGrid .bx3-hostType {\r\n  color: var(--explore-green);\r\n\r\n  font-size: 10px;\r\n  font-weight: 900;\r\n  letter-spacing: 1.3px;\r\n  text-transform: uppercase;\r\n}\r\n\r\n#tc2GuideGrid .bx3-hostTitle {\r\n  margin: 9px 0 0;\r\n  color: #ffffff;\r\n\r\n  font-size: 21px;\r\n  font-weight: 900;\r\n  line-height: 1.25;\r\n}\r\n\r\n#tc2GuideGrid .bx3-hostCopy {\r\n  margin: 12px 0 0;\r\n  color: rgba(226, 243, 255, 0.68);\r\n\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 13px;\r\n  line-height: 1.65;\r\n}\r\n\r\n\r\n\/* =========================\r\n   ACTION BUTTONS\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 9px;\r\n  margin-top: 18px;\r\n}\r\n\r\n#tc2GuideGrid .bx3-action,\r\n#tc2GuideGrid .bx3-back {\r\n  min-height: 40px;\r\n  padding: 9px 14px;\r\n\r\n  border: 1px solid rgba(0, 245, 255, 0.3);\r\n  border-radius: 12px;\r\n\r\n  background: rgba(0, 245, 255, 0.06);\r\n  color: #dffcff;\r\n\r\n  font-family: Orbitron, system-ui, sans-serif;\r\n  font-size: 10px;\r\n  font-weight: 900;\r\n  letter-spacing: 0.4px;\r\n\r\n  cursor: pointer;\r\n\r\n  box-shadow:\r\n    0 0 15px rgba(0, 245, 255, 0.07);\r\n\r\n  transition:\r\n    transform 0.2s ease,\r\n    background 0.2s ease,\r\n    border-color 0.2s ease,\r\n    box-shadow 0.2s ease;\r\n}\r\n\r\n#tc2GuideGrid .bx3-action:hover,\r\n#tc2GuideGrid .bx3-back:hover {\r\n  transform: translateY(-2px);\r\n  border-color: rgba(0, 245, 255, 0.72);\r\n  background: rgba(0, 245, 255, 0.13);\r\n\r\n  box-shadow:\r\n    0 0 20px rgba(0, 245, 255, 0.16);\r\n}\r\n\r\n#tc2GuideGrid .bx3-action.primary {\r\n  border-color: rgba(38, 255, 178, 0.55);\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      rgba(0, 245, 255, 0.2),\r\n      rgba(38, 255, 178, 0.2)\r\n    );\r\n\r\n  color: #ffffff;\r\n\r\n  box-shadow:\r\n    0 0 18px rgba(38, 255, 178, 0.1);\r\n}\r\n\r\n#tc2GuideGrid .bx3-action.primary:hover {\r\n  border-color: var(--explore-green);\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      rgba(0, 245, 255, 0.3),\r\n      rgba(38, 255, 178, 0.3)\r\n    );\r\n\r\n  box-shadow:\r\n    0 0 24px rgba(38, 255, 178, 0.2);\r\n}\r\n\r\n\r\n\/* =========================\r\n   EMPTY CONTROL PANEL RESULT\r\n   ========================= *\/\r\n\r\n#tc2GuideGrid .bx3-empty {\r\n  grid-column: 1 \/ -1;\r\n  padding: 32px;\r\n\r\n  border: 1px dashed rgba(0, 245, 255, 0.3);\r\n  border-radius: 23px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(0, 245, 255, 0.045),\r\n      rgba(255, 255, 255, 0.018)\r\n    );\r\n\r\n  color: rgba(224, 244, 255, 0.72);\r\n\r\n  font-family: Inter, system-ui, sans-serif;\r\n  font-size: 14px;\r\n  line-height: 1.75;\r\n  text-align: center;\r\n}\r\n\r\n#tc2GuideGrid .bx3-empty strong {\r\n  color: var(--explore-cyan);\r\n}\r\n\r\n\r\n\/* =========================\r\n   MEMBERSHIP NOTICE\r\n   ========================= *\/\r\n\r\n#bxExploreNoticeV3 {\r\n  position: fixed;\r\n  left: 50%;\r\n  bottom: 28px;\r\n  z-index: 999999;\r\n\r\n  width: min(92vw, 430px);\r\n  padding: 17px 19px;\r\n\r\n  border: 1px solid rgba(255, 215, 106, 0.5);\r\n  border-radius: 17px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      rgba(25, 18, 37, 0.97),\r\n      rgba(6, 8, 16, 0.98)\r\n    );\r\n\r\n  color: #ffffff;\r\n\r\n  font-family: Orbitron, system-ui, sans-serif;\r\n\r\n  box-shadow:\r\n    0 20px 55px rgba(0, 0, 0, 0.6),\r\n    0 0 30px rgba(255, 215, 106, 0.14);\r\n\r\n  opacity: 0;\r\n  pointer-events: none;\r\n  transform: translate(-50%, 25px);\r\n\r\n  transition:\r\n    opacity 0.28s ease,\r\n    transform 0.28s ease;\r\n}\r\n\r\n#bxExploreNoticeV3.show {\r\n  opacity: 1;\r\n  transform: translate(-50%, 0);\r\n}\r\n\r\n\r\n\/* =========================\r\n   TABLET\r\n   ========================= *\/\r\n\r\n@media (max-width: 900px) {\r\n  #tc2GuideGrid .bx5-routeGrid,\r\n  #tc2GuideGrid .bx3-hostGrid {\r\n    grid-template-columns: repeat(2, minmax(0, 1fr));\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-topline {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-back {\r\n    align-self: flex-start;\r\n  }\r\n}\r\n\r\n\r\n\/* =========================\r\n   MOBILE\r\n   ========================= *\/\r\n\r\n@media (max-width: 620px) {\r\n  #tc2ExplorePage .tc2-shell {\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n  }\r\n\r\n  #tc2GuideGrid {\r\n    padding-bottom: 25px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeStage,\r\n  #tc2GuideGrid .bx3-screen {\r\n    padding: 17px;\r\n    border-radius: 23px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeGrid,\r\n  #tc2GuideGrid .bx3-hostGrid {\r\n    grid-template-columns: 1fr;\r\n    gap: 14px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeHead {\r\n    margin-bottom: 22px;\r\n    text-align: left;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeKicker {\r\n    font-size: 9px;\r\n    letter-spacing: 1.4px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeTitle {\r\n    font-size: 31px;\r\n    letter-spacing: -0.6px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeCopy {\r\n    margin-top: 12px;\r\n    font-size: 14px;\r\n    line-height: 1.6;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeCard {\r\n    min-height: 0;\r\n    padding: 19px;\r\n    border-radius: 20px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeIcon {\r\n    width: 52px;\r\n    height: 52px;\r\n    margin-bottom: 15px;\r\n    border-radius: 16px;\r\n    font-size: 27px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeCardTitle {\r\n    font-size: 19px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeMeta {\r\n    font-size: 12px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeFooter {\r\n    align-items: flex-start;\r\n    flex-direction: column;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-sectionTitle {\r\n    font-size: 28px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-hostImage {\r\n    height: 190px;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-action,\r\n  #tc2GuideGrid .bx3-back {\r\n    width: 100%;\r\n    min-height: 44px;\r\n  }\r\n}\r\n\r\n\r\n\/* =========================\r\n   REDUCED MOTION\r\n   ========================= *\/\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n  #tc2GuideGrid *,\r\n  #bxExploreNoticeV3 {\r\n    scroll-behavior: auto !important;\r\n    transition: none !important;\r\n    animation: none !important;\r\n  }\r\n}\r\n\r\n\/* EXPLORE MEDELL\u00cdN \u2014 BIGGER DESKTOP CARD *\/\r\n\r\n@media (min-width: 901px){\r\n\r\n  #tc2GuideGrid{\r\n    width:calc(100% - 40px) !important;\r\n    max-width:1600px !important;\r\n    margin:0 auto !important;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeStage,\r\n  #tc2GuideGrid .bx3-screen{\r\n    width:100% !important;\r\n    max-width:none !important;\r\n    padding:clamp(24px,3vw,42px) !important;\r\n  }\r\n\r\n  #tc2GuideGrid .bx5-routeGrid{\r\n    grid-template-columns:\r\n      repeat(4,minmax(0,1fr)) !important;\r\n  }\r\n\r\n  #tc2GuideGrid .bx3-hostGrid{\r\n    grid-template-columns:\r\n      repeat(3,minmax(0,1fr)) !important;\r\n  }\r\n}\r\n\/* EXPLORE MEDELL\u00cdN \u2014 MAKE THE MAIN CARD USE FULL WIDTH *\/\r\n\r\n#tc2ExplorePage #tc2GuideGrid{\r\n  display:grid !important;\r\n  grid-template-columns:1fr !important;\r\n  width:100% !important;\r\n  max-width:none !important;\r\n}\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\">Bliss Travel<\/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\r\n  <a\r\n    class=\"tc2-menuLink\"\r\n    href=\"https:\/\/godsgalaxygame.com\/GGG\/evolution-tours\/?privacy=1\">\r\n    Privacy Policy\r\n  <\/a>\r\n\r\n  <a\r\n    class=\"tc2-menuLink\"\r\n    href=\"https:\/\/godsgalaxygame.com\/GGG\/evolution-tours\/?terms=1\">\r\n    Terms of Use\r\n  <\/a>\r\n\r\n  <a\r\n    class=\"tc2-menuLink\"\r\n    href=\"https:\/\/godsgalaxygame.com\/GGG\/evolution-tours\/?operations=1\">\r\n    Operations Disclosure\r\n  <\/a>\r\n\r\n<\/div>\r\n        \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\">\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\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 any of the 12 zodiac signs to explore personalized travel recommendations, including accommodations, restaurants, entertainment, VIP experiences, and more.<\/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 Bliss Travel 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>The Current 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 Travel through the zodiac. Explore every sign, every style, and maybe discover we\u2019re more alike than we think.\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    <!-- 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            Build the Medell\u00edn experience through stays, transportation, culture, nature, sustainability, premium discovery, entertainment and medical tourism.\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<!-- TRAVEL INTELLIGENCE -->\r\n<section id=\"tc2BrainPage\" class=\"tc2-page\" aria-hidden=\"true\"><\/section>\r\n\r\n\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\">The Current 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 &#038; 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\">\r\n    No Service Selected\r\n  <\/div>\r\n\r\n  <div id=\"tc2ServiceAttachChip\" class=\"tc2-chip\">\r\n    Saves under Local Services\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"tc2-formGrid\">\r\n  <div class=\"tc2-field\">\r\n    <label class=\"tc2-label\">\r\n      Location \/ Pickup \/ Meeting Point\r\n    <\/label>\r\n\r\n    <input\r\n      id=\"tc2ServiceLocation\"\r\n      class=\"tc2-input\"\r\n      type=\"text\"\r\n      placeholder=\"Hotel, airport, restaurant, neighborhood...\"\r\n    >\r\n  <\/div>\r\n<\/div>\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 The Current 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<!-- SEND THE CURRENT JOURNEY CONFIRMATION POPUP -->\r\n<div id=\"tc2JourneyConfirmModal\" class=\"tc2-modal\" aria-hidden=\"true\">\r\n  <div class=\"tc2-modalCard tc2-glass\">\r\n\r\n    <h3\r\n      class=\"tc2-sectionTitle\"\r\n      style=\"font-size:clamp(1.7rem,5vw,2.4rem)\">\r\n      Confirm Your Journey\r\n    <\/h3>\r\n\r\n    <p class=\"tc2-sectionCopy\">\r\n      Review your trip information before sending your complete Journey\r\n      to Bliss Concierge.\r\n    <\/p>\r\n\r\n    <div class=\"tc2-formGrid two\">\r\n\r\n      <div class=\"tc2-field\">\r\n        <label class=\"tc2-label\" for=\"tc2JourneyArrivalDate\">\r\n          Arrival Date\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"tc2JourneyArrivalDate\"\r\n          class=\"tc2-input\"\r\n          type=\"date\">\r\n      <\/div>\r\n\r\n      <div class=\"tc2-field\">\r\n        <label class=\"tc2-label\" for=\"tc2JourneyDepartureDate\">\r\n          Departure Date\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"tc2JourneyDepartureDate\"\r\n          class=\"tc2-input\"\r\n          type=\"date\">\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"tc2-field\">\r\n      <label class=\"tc2-label\" for=\"tc2JourneyTravelers\">\r\n        Number of Travelers\r\n      <\/label>\r\n\r\n      <input\r\n        id=\"tc2JourneyTravelers\"\r\n        class=\"tc2-input\"\r\n        type=\"number\"\r\n        min=\"1\"\r\n        value=\"1\">\r\n    <\/div>\r\n\r\n    <div class=\"tc2-field\">\r\n      <label class=\"tc2-label\" for=\"tc2JourneyGeneralMessage\">\r\n        Additional Message\r\n      <\/label>\r\n\r\n      <textarea\r\n        id=\"tc2JourneyGeneralMessage\"\r\n        class=\"tc2-textarea\"\r\n        placeholder=\"Add specific details about the trip or any of the reservations...\"><\/textarea>\r\n    <\/div>\r\n\r\n    <p\r\n      id=\"tc2JourneyConfirmSummary\"\r\n      class=\"tc2-sectionCopy\">\r\n    <\/p>\r\n\r\n    <div class=\"tc2-btnRow\">\r\n\r\n      <button\r\n        id=\"tc2ConfirmJourneySend\"\r\n        class=\"tc2-btn tc2-btn-gold\"\r\n        type=\"button\">\r\n        Confirm &#038; Send The Current Journey\r\n      <\/button>\r\n\r\n      <button\r\n        id=\"tc2CancelJourneySend\"\r\n        class=\"tc2-btn tc2-btn-outline\"\r\n        type=\"button\">\r\n        Go Back and Review\r\n      <\/button>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/div>\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  id=\"bx3VideoPopup\"\r\n  aria-hidden=\"true\"\r\n  style=\"\r\n    display:none;\r\n    position:fixed;\r\n    inset:0;\r\n    z-index:2147483647;\r\n    align-items:center;\r\n    justify-content:center;\r\n    padding:20px;\r\n    background:rgba(0,0,0,.92);\r\n    backdrop-filter:blur(12px);\r\n  \"\r\n>\r\n  <div\r\n    role=\"dialog\"\r\n    aria-modal=\"true\"\r\n    aria-label=\"Host video\"\r\n    style=\"\r\n      position:relative;\r\n      width:min(920px,96vw);\r\n      border:1px solid rgba(83,243,255,.42);\r\n      border-radius:26px;\r\n      padding:12px;\r\n      background:#050914;\r\n      box-shadow:\r\n        0 30px 100px rgba(0,0,0,.8),\r\n        0 0 38px rgba(83,243,255,.22);\r\n    \"\r\n  >\r\n    <button\r\n      id=\"bx3VideoClose\"\r\n      type=\"button\"\r\n      aria-label=\"Close video\"\r\n      style=\"\r\n        position:absolute;\r\n        top:-14px;\r\n        right:-14px;\r\n        z-index:3;\r\n        width:44px;\r\n        height:44px;\r\n        border:1px solid rgba(255,255,255,.25);\r\n        border-radius:50%;\r\n        color:#fff;\r\n        background:#090d18;\r\n        font-size:25px;\r\n        font-weight:900;\r\n        cursor:pointer;\r\n        box-shadow:0 0 20px rgba(83,243,255,.28);\r\n      \"\r\n    >\r\n      \u00d7\r\n    <\/button>\r\n\r\n    <div\r\n      id=\"bx3VideoFrameWrap\"\r\n      style=\"\r\n        width:100%;\r\n        aspect-ratio:16 \/ 9;\r\n        overflow:hidden;\r\n        border-radius:18px;\r\n        background:#000;\r\n      \"\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  {\r\n    key: \"Private Driver\",\r\n    type: \"Mobility\",\r\n    copy: \"Airport pickup, city routes, full day, weekend and VIP custom driver.\"\r\n  },\r\n  {\r\n    key: \"Concierge\",\r\n    type: \"Support\",\r\n    copy: \"Help coordinating reservations, plans, local details and special requests.\"\r\n  },\r\n  {\r\n    key: \"Translator\",\r\n    type: \"Language\",\r\n    copy: \"Spanish and English support for appointments, tours, meetings or local services.\"\r\n  },\r\n  {\r\n    key: \"Reservations\",\r\n    type: \"Dining and Access\",\r\n    copy: \"Restaurants, rooftops, attractions, private experiences and nightlife.\"\r\n  },\r\n  {\r\n    key: \"Security Support\",\r\n    type: \"Safety\",\r\n    copy: \"Discreet local support for movement, events or higher-touch travel.\"\r\n  },\r\n  {\r\n    key: \"Nightlife Help\",\r\n    type: \"After Dark\",\r\n    copy: \"Night routes, table help, drivers, safety planning and local guidance.\"\r\n  },\r\n  {\r\n    key: \"Local Guide\",\r\n    type: \"Experience\",\r\n    copy: \"Cultural, food, nature, hidden gem or neighborhood guide.\"\r\n  },\r\n  {\r\n    key: \"VIP Custom Support\",\r\n    type: \"Private Request\",\r\n    copy: \"A custom service request for high-touch member needs.\"\r\n  }\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    key:'confirmed',\r\n    title:'Confirmed Plans',\r\n    icon:'\u2705',\r\n    desc:'Reservations, services and experiences confirmed by Bliss Concierge.'\r\n  },\r\n  {\r\n    key:'completed',\r\n    title:'Completed Memories',\r\n    icon:'\u2728',\r\n    desc:'Activities and services already completed during the trip.'\r\n  },\r\n  {\r\n    key:'restaurants',\r\n    title:'Dining Memories',\r\n    icon:'\ud83c\udf7d\ufe0f',\r\n    desc:'Confirmed and completed restaurants, dinners, caf\u00e9s and food experiences.'\r\n  },\r\n  {\r\n    key:'experiences',\r\n    title:'Experience Memories',\r\n    icon:'\ud83c\udf1f',\r\n    desc:'Confirmed and completed tours, activities and destination experiences.'\r\n  },\r\n  {\r\n    key:'guides',\r\n    title:'My Travel Team',\r\n    icon:'\ud83e\udded',\r\n    desc:'Guides, hosts, translators, concierge providers and Personal Evolution professionals.'\r\n  },\r\n  {\r\n    key:'media',\r\n    title:'Journey Gallery',\r\n    icon:'\ud83d\udcf8',\r\n    desc:'Photos, videos and provider images connected to confirmed and completed Journey items.'\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    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\r\n  const url =\r\n    new URL(window.location.href);\r\n\r\n  return (\r\n    url.searchParams.get(\"travelclub\") === \"1\"\r\n  );\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      return;\r\n    }\r\n\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  const target = els.pages[name];\r\n\r\n  if(!target){\r\n    console.error(\r\n      \"[Bliss Travel] Page not found:\",\r\n      name\r\n    );\r\n    return;\r\n  }\r\n\r\n  target.classList.add(\"active\");\r\n  target.style.removeProperty(\"display\");\r\n  target.setAttribute(\"aria-hidden\",\"false\");\r\n\r\n  state.currentPage = name;\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   * Keep Explore's current internal route.\r\n   *\r\n   * renderOptions() calls renderCurrent(), so it does not\r\n   * erase state.path. This preserves internal Back:\r\n   *\r\n   * Hosts \u2192 Suboptions \u2192 Options \u2192 Guides.\r\n   *\/\r\n if(name === \"explore\"){\r\n  if(window.tc2ExploreV6){\r\n    if(typeof window.tc2ExploreV6.renderOptions === \"function\"){\r\n      window.tc2ExploreV6.renderOptions();\r\n    }\r\n  }\r\n}\r\n\r\n  \/*\r\n   * Refresh Journey when it opens.\r\n   *\/\r\n  if(name === \"journey\"){\r\n\r\n  if(window.tc2JourneyV7){\r\n\r\n    if(typeof window.tc2JourneyV7.render === \"function\"){\r\n      window.tc2JourneyV7.render();\r\n    }\r\n\r\n  }\r\n\r\n}\r\n\r\n  \/*\r\n   * Refresh Local Services when it opens.\r\n   *\/\r\n  if(name === \"services\"){\r\n  if(window.tc2JourneyV7){\r\n    if(typeof window.tc2JourneyV7.renderServices === \"function\"){\r\n      window.tc2JourneyV7.renderServices();\r\n    }\r\n  }\r\n}\r\n\r\n  updateHero();\r\n}\r\n\r\nwindow.tc2ShowPage = showPage;  \r\nfunction 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  const ok =\r\n    document.getElementById(\"tc2ModalOk\");\r\n\r\n  if(ok){\r\n    ok.onclick = function(event){\r\n      event.preventDefault();\r\n\r\n      const modal =\r\n        document.getElementById(\"tc2Modal\");\r\n\r\n      if(modal){\r\n        modal.classList.remove(\"open\");\r\n        modal.setAttribute(\r\n          \"aria-hidden\",\r\n          \"true\"\r\n        );\r\n      }\r\n    };\r\n  }\r\n}\r\n\r\n  function closeModal(){\r\n    els.modal.classList.remove('open');\r\n  }\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 Bliss Travel 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      if(\r\n  Array.isArray(saved)\r\n){\r\n\r\n  if(saved.length){\r\n    state.travelPlan = saved;\r\n  }else{\r\n    state.travelPlan = PLAN_BASE.slice();\r\n  }\r\n\r\n}else{\r\n\r\n  state.travelPlan = PLAN_BASE.slice();\r\n\r\n}\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-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    \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 =\r\n  `${opt.key} selected. Complete the request details below.`;\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 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 || 'MedaYork \u00b7 Medell\u00edn',\r\n      time:date ? (time ? `${date} \u00b7 ${time}` : date) : 'Date Pending',\r\n      status:'Pending',\r\n      image:DEFAULT_IMAGE,\r\n      description:\r\n  [shortNotes, notes]\r\n    .filter(Boolean)\r\n    .join(' \u00b7 ') || 'Local Service Request',\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 The Current Journey.`);\r\n  }\r\n\r\n  function sendServiceWhatsApp(){\r\n  try {\r\n    const selectedCard =\r\n      document.querySelector(\r\n        '.tc2-localServiceCard.is-selected'\r\n      );\r\n\r\n    const serviceName =\r\n      selectedCard?.getAttribute('data-local-service') ||\r\n      state.selectedService ||\r\n      'General Local Service Request';\r\n\r\n    const location =\r\n      (els.serviceLocation?.value || '').trim() ||\r\n      'MedaYork \u00b7 Medell\u00edn';\r\n\r\n    const date =\r\n      els.serviceDate?.value || 'Date Pending';\r\n\r\n    const time =\r\n      els.serviceTime?.value || '';\r\n\r\n    const guests =\r\n      els.serviceGuests?.value || '2';\r\n\r\n    const shortNotes =\r\n      (els.serviceShortNotes?.value || '').trim();\r\n\r\n    const notes =\r\n      (els.serviceNotes?.value || '').trim();\r\n\r\n    const dateTime =\r\n      time && date !== 'Date Pending'\r\n        ? `${date} \u00b7 ${time}`\r\n        : date;\r\n\r\n    const lines = [\r\n      'Bliss Travel Local Service Request',\r\n      '',\r\n      `Service: ${serviceName}`,\r\n      `Location: ${location}`,\r\n      `Date\/Time: ${dateTime}`,\r\n      `Guests: ${guests}`,\r\n      shortNotes\r\n        ? `Quick Notes: ${shortNotes}`\r\n        : '',\r\n      notes\r\n        ? `Notes: ${notes}`\r\n        : ''\r\n    ].filter(Boolean);\r\n\r\n    const text =\r\n      encodeURIComponent(lines.join('\\n'));\r\n\r\n    window.location.href =\r\n      `https:\/\/wa.me\/573147629693?text=${text}`;\r\n\r\n  } catch(error) {\r\n    console.error(\r\n      'WhatsApp button error:',\r\n      error\r\n    );\r\n\r\n    window.location.href =\r\n      'https:\/\/wa.me\/573147629693';\r\n  }\r\n}\r\n  function renderStory(selectedView){\r\n\r\n  if(!els.storyGrid){\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  const safeItems =\r\n    Array.isArray(journeyItems)\r\n      ? journeyItems\r\n      : [];\r\n\r\n  function journeyStatuses(item){\r\n\r\n  return [\r\n    item.status,\r\n    item.reservationStatus,\r\n    item.storyStatus,\r\n    item.bookingStatus,\r\n    item.conciergeStatus,\r\n    item.progressStatus\r\n  ]\r\n  .filter(Boolean)\r\n  .map(function(value){\r\n    return String(value)\r\n      .trim()\r\n      .toLowerCase();\r\n  });\r\n\r\n}\r\n\r\nfunction isCompleted(item){\r\n\r\n  const statuses =\r\n    journeyStatuses(item);\r\n\r\n  return statuses.some(function(status){\r\n    return (\r\n      status === 'completed' ||\r\n      status === 'complete' ||\r\n      status === 'finished'\r\n    );\r\n  });\r\n\r\n}\r\n\r\nfunction isConfirmed(item){\r\n\r\n  const statuses =\r\n    journeyStatuses(item);\r\n\r\n  \/*\r\n   * Completed takes priority over Confirmed.\r\n   *\/\r\n  if(isCompleted(item)){\r\n    return false;\r\n  }\r\n\r\n  return statuses.some(function(status){\r\n    return (\r\n      status === 'confirmed' ||\r\n      status === 'approved' ||\r\n      status === 'booked' ||\r\n      status === 'reserved'\r\n    );\r\n  });\r\n\r\n}\r\n  function isStoryItem(item){\r\n    return isConfirmed(item) || isCompleted(item);\r\n  }\r\n\r\n  function textOf(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    ]\r\n    .filter(Boolean)\r\n    .join(' ')\r\n    .toLowerCase();\r\n  }\r\n\r\n  function categoryItems(view){\r\n\r\n    const storyItems =\r\n      safeItems.filter(isStoryItem);\r\n\r\n    if(view === 'confirmed'){\r\n      return storyItems.filter(isConfirmed);\r\n    }\r\n\r\n    if(view === 'completed'){\r\n      return storyItems.filter(isCompleted);\r\n    }\r\n\r\n    if(view === 'restaurants'){\r\n      return storyItems.filter(function(item){\r\n        return \/restaurant|dining|dinner|food|cafe|coffee|rooftop|bar\\b\/.test(\r\n          textOf(item)\r\n        );\r\n      });\r\n    }\r\n\r\n    if(view === 'experiences'){\r\n      return storyItems.filter(function(item){\r\n        return !\/restaurant|dining|driver|transport|concierge|translator|guide|host|security\/.test(\r\n          textOf(item)\r\n        );\r\n      });\r\n    }\r\n\r\n    if(view === 'guides'){\r\n      return storyItems.filter(function(item){\r\n        return \/guide|host|translator|concierge|personal evolution|local service\/.test(\r\n          textOf(item)\r\n        );\r\n      });\r\n    }\r\n\r\n    if(view === 'media'){\r\n      return storyItems.filter(function(item){\r\n        return Boolean(\r\n          item.image ||\r\n          (\r\n            Array.isArray(item.images) &&\r\n            item.images.length\r\n          ) ||\r\n          item.video ||\r\n          item.videoUrl\r\n        );\r\n      });\r\n    }\r\n\r\n    return storyItems;\r\n  }\r\n\r\n  function imageOf(item){\r\n\r\n    if(item.image){\r\n      return item.image;\r\n    }\r\n\r\n    if(\r\n      Array.isArray(item.images) &&\r\n      item.images.length\r\n    ){\r\n      return item.images[0];\r\n    }\r\n\r\n    return DEFAULT_IMAGE;\r\n  }\r\n\r\n  function itemCard(item){\r\n\r\n    const status =\r\n      isCompleted(item)\r\n        ? 'Completed'\r\n        : 'Confirmed';\r\n\r\n    const details = [\r\n      item.location,\r\n      item.date ||\r\n        item.reservationDate ||\r\n        item.serviceDate,\r\n      item.time ||\r\n        item.schedule\r\n    ]\r\n    .filter(Boolean)\r\n    .join(' \u00b7 ');\r\n\r\n    return `\r\n      <div class=\"tc2-storyCard\">\r\n\r\n        <div\r\n          class=\"tc2-cardMedia\"\r\n          style=\"background-image:url('${escapeHtml(\r\n            imageOf(item)\r\n          )}')\">\r\n        <\/div>\r\n\r\n        <div class=\"tc2-cardBody\">\r\n\r\n          <div class=\"tc2-cardType\">\r\n            ${escapeHtml(status)}\r\n          <\/div>\r\n\r\n          <div class=\"tc2-cardTitle\">\r\n            ${escapeHtml(\r\n              item.title ||\r\n              item.name ||\r\n              item.service ||\r\n              'Travel Experience'\r\n            )}\r\n          <\/div>\r\n\r\n          ${\r\n            details\r\n              ? `\r\n                <div class=\"tc2-cardDesc\">\r\n                  ${escapeHtml(details)}\r\n                <\/div>\r\n              `\r\n              : ''\r\n          }\r\n\r\n          ${\r\n            item.description\r\n              ? `\r\n                <div class=\"tc2-cardDesc\">\r\n                  ${escapeHtml(item.description)}\r\n                <\/div>\r\n              `\r\n              : ''\r\n          }\r\n\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  \/*\r\n   * When a Story category has been selected,\r\n   * show the matching Journey items.\r\n   *\/\r\n  if(selectedView){\r\n\r\n    const matchingItems =\r\n      categoryItems(selectedView);\r\n\r\n    const selectedCategory =\r\n      STORY_BASE.find(function(category){\r\n        return category.key === selectedView;\r\n      });\r\n\r\n    els.storyGrid.innerHTML = `\r\n      <div style=\"grid-column:1\/-1;margin-bottom:4px;\">\r\n\r\n        <button\r\n          id=\"tc2StoryBackToCategories\"\r\n          class=\"tc2-btn tc2-btn-cyan\"\r\n          type=\"button\">\r\n          \u2190 Back to My Story\r\n        <\/button>\r\n\r\n        <h3\r\n          class=\"tc2-sectionTitle\"\r\n          style=\"margin-top:20px;font-size:clamp(1.5rem,4vw,2.2rem);\">\r\n          ${\r\n            selectedCategory\r\n              ? escapeHtml(selectedCategory.title)\r\n              : 'My Travel Story'\r\n          }\r\n        <\/h3>\r\n\r\n      <\/div>\r\n\r\n      ${\r\n        matchingItems.length\r\n          ? matchingItems.map(itemCard).join('')\r\n          : `\r\n            <div\r\n              class=\"tc2-storyCard\"\r\n              style=\"grid-column:1\/-1\">\r\n\r\n              <div class=\"tc2-cardBody\">\r\n\r\n                <div class=\"tc2-cardTitle\">\r\n                  Nothing here yet\r\n                <\/div>\r\n\r\n                <div class=\"tc2-cardDesc\">\r\n                  Confirmed or completed The Current Journey items\r\n                  will appear in this section automatically.\r\n                <\/div>\r\n\r\n              <\/div>\r\n\r\n            <\/div>\r\n          `\r\n      }\r\n    `;\r\n\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Main My Story category buttons.\r\n   *\/\r\n  els.storyGrid.innerHTML = '';\r\n\r\n  STORY_BASE.forEach(function(story){\r\n\r\n    const count =\r\n      categoryItems(story.key).length;\r\n\r\n    const card =\r\n      document.createElement('button');\r\n\r\n    card.type = 'button';\r\n    card.className = 'tc2-storyCard';\r\n    card.setAttribute(\r\n      'data-story-view',\r\n      story.key\r\n    );\r\n\r\n    card.innerHTML = `\r\n      <div\r\n        class=\"tc2-cardMedia\"\r\n        style=\"\r\n          display:grid;\r\n          place-items:center;\r\n          background-image:none;\r\n          font-size:54px;\r\n        \">\r\n        ${story.icon}\r\n      <\/div>\r\n\r\n      <div class=\"tc2-cardBody\">\r\n\r\n        <div class=\"tc2-cardType\">\r\n          ${count}\r\n          ${\r\n            count === 1\r\n              ? 'Item'\r\n              : 'Items'\r\n          }\r\n        <\/div>\r\n\r\n        <div class=\"tc2-cardTitle\">\r\n          ${escapeHtml(story.title)}\r\n        <\/div>\r\n\r\n        <div class=\"tc2-cardDesc\">\r\n          ${escapeHtml(story.desc)}\r\n        <\/div>\r\n\r\n        <div class=\"tc2-subList\">\r\n\r\n          <div class=\"tc2-subItem\">\r\n            Open\r\n          <\/div>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    els.storyGrid.appendChild(card);\r\n\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      'Bliss Travel 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('Bliss Travel 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 Bliss Travel 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   * Bliss Travel 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 =\r\n  document.getElementById(\"tc2MainAstro\");\r\n\r\nif(astroBtn){\r\n  astroBtn.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      event.preventDefault();\r\n      event.stopImmediatePropagation();\r\n\r\n      showPage(\"astro\");\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    true\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', ()=>{\r\n  showPage('story');\r\n  renderStory();\r\n});\r\n\r\nels.floatExplore.addEventListener('click', ()=> showPage('explore'));\r\nels.floatJourney.addEventListener('click', ()=> showPage('journey'));\r\nels.floatServices.addEventListener('click', ()=> showPage('services'));\r\n\r\nels.floatStory.addEventListener('click', ()=>{\r\n  showPage('story');\r\n  renderStory();\r\n});\r\n\r\n\/*\r\n * MY TRAVEL STORY CATEGORY CLICKS\r\n *\/\r\nels.storyGrid.addEventListener(\r\n  'click',\r\n  function(event){\r\n\r\n    const storyButton =\r\n      event.target.closest(\r\n        '[data-story-view]'\r\n      );\r\n\r\n    if(storyButton){\r\n\r\n      renderStory(\r\n        storyButton.getAttribute(\r\n          'data-story-view'\r\n        )\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const backButton =\r\n      event.target.closest(\r\n        '#tc2StoryBackToCategories'\r\n      );\r\n\r\n    if(backButton){\r\n      renderStory();\r\n    }\r\n\r\n  }\r\n);\r\n\r\nels.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 \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\nwindow.addEventListener(\r\n    'blissJourneyAccountUpdated',\r\n    function(){\r\n      renderStory();\r\n    }\r\n  );\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\r\n\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?.data?.message\r\n    ? response.data.message\r\n    : \"Bliss Travel 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] 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] 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.renderOptions === \"function\"\r\n){\r\n  window.tc2ExploreV6.renderOptions();\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] 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.renderOptions === \"function\"\r\n){\r\n  window.tc2ExploreV6.renderOptions();\r\n}\r\n        })\r\n        .catch(function () {});\r\n    }\r\n  );\r\n})();\r\n\r\n\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\",\"Mystery\",\"Gastronomic\",\"Luxury\"]},\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:[\"Futurist\",\"Memorable\",\"Elegant\",\"Luxury\"]},\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 The Current 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 The Journey.\");\r\n  }\r\n\r\n  function astroReserve(hostId){\r\n\r\n  var host = astroFindHost(hostId);\r\n\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\nvar owned = pms.owned || {};\r\nvar loggedIn = !!pms.loggedIn;\r\n\r\n\/*\r\n * Check Family Journey access.\r\n *\/\r\nvar familyAccess = null;\r\nvar familyTraveler = null;\r\nvar familyActive = false;\r\n\r\ntry{\r\n\r\n  familyAccess = JSON.parse(\r\n    sessionStorage.getItem(\r\n      \"BLISS_FAMILY_ACCESS_V1\"\r\n    ) || \"null\"\r\n  );\r\n\r\n  familyTraveler = JSON.parse(\r\n    sessionStorage.getItem(\r\n      \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\"\r\n    ) || \"null\"\r\n  );\r\n\r\n  familyActive = Boolean(\r\n    familyAccess &&\r\n    familyAccess.active === true &&\r\n    familyAccess.tripCode &&\r\n    familyTraveler &&\r\n    familyTraveler.id\r\n  );\r\n\r\n}catch(error){\r\n\r\n  familyActive = false;\r\n\r\n}\r\n\r\n\/*\r\n * User may continue if:\r\n *\r\n * 1. Normal WordPress member\r\n * OR\r\n * 2. Authorized Family Journey traveler\r\n *\/\r\nif(!loggedIn && !familyActive){\r\n\r\n  window.location.href =\r\n    (pms.urls && pms.urls.login)\r\n      ? pms.urls.login\r\n      : \"\/GGG\/login\/\";\r\n\r\n  return;\r\n}\r\n\r\n  \/*\r\n   * Level 2 required.\r\n   *\/\r\n  var hasLevel2 =\r\n    owned[2] === true ||\r\n    owned[\"2\"] === true ||\r\n    Number(owned[2] || owned[\"2\"]) === 1 ||\r\n    (\r\n      Array.isArray(owned) &&\r\n      (\r\n        owned.indexOf(2) !== -1 ||\r\n        owned.indexOf(\"2\") !== -1\r\n      )\r\n    );\r\n\r\n  if(!familyActive && !hasLevel2){\r\n\r\n    window.location.href =\r\n      host.buyLevel2Url ||\r\n      \"\/GGG\/responsable-reservations\/\";\r\n\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Make sure The Current Journey\r\n   * connection is ready.\r\n   *\/\r\n  if(\r\n    !window.tc2JourneyV7 ||\r\n    typeof window.tc2JourneyV7.addItem !== \"function\"\r\n  ){\r\n    alert(\r\n      \"The Current Journey is still loading. Please try again.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Build the Astro recommendation\r\n   * as an official Journey item.\r\n   *\/\r\n  var item = {\r\n\r\n    journeyId:\r\n      \"astro-host|\" + String(host.id || \"\"),\r\n\r\n    hostId:\r\n      host.id || \"\",\r\n\r\n    source:\r\n      \"astro-travel\",\r\n\r\n    type:\r\n      \"Astro Travel \u00b7 \" +\r\n      (\r\n        host.category ||\r\n        host.type ||\r\n        \"Recommendation\"\r\n      ),\r\n\r\n    title:\r\n      host.name ||\r\n      host.title ||\r\n      \"Astro Travel Recommendation\",\r\n\r\n    name:\r\n      host.name ||\r\n      host.title ||\r\n      \"Astro Travel Recommendation\",\r\n\r\n    location:\r\n      host.location ||\r\n      \"Medell\u00edn, Colombia\",\r\n\r\n    time:\r\n      \"Astro Recommendation\",\r\n\r\n    status:\r\n      \"Saved\",\r\n\r\n    image:\r\n      host.image || \"\",\r\n\r\n    description:\r\n      host.description ||\r\n      host.desc ||\r\n      \"\",\r\n\r\n    websiteUrl:\r\n      host.websiteUrl ||\r\n      host.url ||\r\n      \"\",\r\n\r\n    \/*\r\n     * We preserve these in the data\r\n     * even though we are NOT navigating\r\n     * to them anymore.\r\n     *\/\r\n    reserveUrl:\r\n      host.reserveUrl || \"\",\r\n\r\n    checkoutUrl:\r\n      host.checkoutUrl || \"\",\r\n\r\n    sign:\r\n      host.sign || \"\",\r\n\r\n    style:\r\n      host.style ||\r\n      host.suboption ||\r\n      \"\",\r\n\r\n    category:\r\n      host.category ||\r\n      host.option ||\r\n      \"\"\r\n  };\r\n\r\n  \/*\r\n   * Save into the official\r\n   * Current Journey system.\r\n   *\/\r\n  var result =\r\n    window.tc2JourneyV7.addItem(item);\r\n\r\n  \/*\r\n   * Refresh Journey.\r\n   *\/\r\n  if(\r\n    typeof window.tc2JourneyV7.render ===\r\n    \"function\"\r\n  ){\r\n    window.tc2JourneyV7.render();\r\n  }\r\n\r\n  \/*\r\n   * Open The Current Journey.\r\n   *\/\r\n  if(typeof showTC2Page === \"function\"){\r\n\r\n    showTC2Page(\r\n      \"tc2JourneyPage\"\r\n    );\r\n\r\n    \/*\r\n     * Open the main Journey dashboard.\r\n     *\/\r\n    if(\r\n      typeof setJourneyView ===\r\n      \"function\"\r\n    ){\r\n      setJourneyView(\r\n        \"dashboard\"\r\n      );\r\n    }\r\n\r\n  }else{\r\n\r\n    \/*\r\n     * Fallback:\r\n     * trigger the existing Current Journey\r\n     * navigation button.\r\n     *\/\r\n    var journeyButton =\r\n      document.getElementById(\r\n        \"tc2MainJourney\"\r\n      ) ||\r\n      document.getElementById(\r\n        \"tc2FloatJourney\"\r\n      );\r\n\r\n    if(journeyButton){\r\n      journeyButton.click();\r\n    }\r\n  }\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 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.getBoundingClientRect().width;\r\n\r\nif (!size) {\r\n  size = window.innerWidth <= 720\r\n    ? Math.min(window.innerWidth * 0.82, 340)\r\n    : 680;\r\n}\r\n\r\nvar center = size \/ 2;\r\n\r\nvar radius;\r\n\r\nif (window.innerWidth <= 720) {\r\n  var buttonSize = 68;\r\n  radius = (size \/ 2) - (buttonSize \/ 2) - 6;\r\n} else {\r\n  radius = 300;\r\n}\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\r\n  if(!e.card || !e.page || !e.wheel){\r\n    setTimeout(connect,300);\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Prepare the Astro interface.\r\n   * The base Travel Club handler controls the click.\r\n   *\/\r\n  renderSigns();\r\n}\r\n\r\n  if(document.readyState === \"loading\"){\r\n  document.addEventListener(\r\n    \"DOMContentLoaded\",\r\n    connect\r\n  );\r\n}else{\r\n  connect();\r\n}\r\n})();\r\n\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(\r\n  \"first-time-visitor\",\r\n  \"First Time Visitor\",\r\n  2,\r\n  \"\ud83d\ude80\",\r\n  \"Medell\u00edn Visitor Intelligence\",\r\n  \"Live city information, transportation guidance, arrival preparation and personalized recommendations.\",\r\n  [\r\n\r\n    group(\r\n      \"live-medellin\",\r\n      \"Live Medell\u00edn\",\r\n      2,\r\n      \"\ud83c\udf24\ufe0f\",\r\n      \"Current City Intelligence\",\r\n      \"Weather, environmental conditions and practical information for Medell\u00edn today.\",\r\n      [\r\n        leaf(\r\n          \"weather-today\",\r\n          \"Weather Today\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Live Medell\u00edn\",\r\n          \"Weather Today\",\r\n          [],\r\n          \"Current temperature, weather conditions, rain probability and today's forecast.\",\r\n          \"\ud83c\udf26\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"air-quality-co2\",\r\n          \"Air Quality & CO\u2082\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Live Medell\u00edn\",\r\n          \"Air Quality & CO\u2082\",\r\n          [],\r\n          \"Current air-quality and environmental information for Medell\u00edn.\",\r\n          \"\ud83c\udf3f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"rain-uv\",\r\n          \"Rain & UV\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Live Medell\u00edn\",\r\n          \"Rain & UV\",\r\n          [],\r\n          \"Rain probability, UV conditions and practical outdoor guidance.\",\r\n          \"\u2600\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"city-conditions\",\r\n          \"City Conditions\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Live Medell\u00edn\",\r\n          \"City Conditions\",\r\n          [],\r\n          \"Local time, altitude, sunrise, sunset and today's city guidance.\",\r\n          \"\ud83c\udfd9\ufe0f\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"getting-around\",\r\n      \"Getting Around\",\r\n      2,\r\n      \"\ud83d\ude87\",\r\n      \"Medell\u00edn Mobility\",\r\n      \"Understand Medell\u00edn transportation before choosing how to move around.\",\r\n      [\r\n        leaf(\r\n          \"medellin-metro\",\r\n          \"Medell\u00edn Metro\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Getting Around\",\r\n          \"Medell\u00edn Metro\",\r\n          [],\r\n          \"Metro, Metrocable, Metropl\u00fas, fares, schedules and first-time rider guidance.\",\r\n          \"\ud83d\ude87\"\r\n        ),\r\n\r\n        leaf(\r\n          \"airport-transportation\",\r\n          \"Airport Transportation\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Getting Around\",\r\n          \"Airport Transportation\",\r\n          [],\r\n          \"Transportation guidance for Jos\u00e9 Mar\u00eda C\u00f3rdova and Olaya Herrera airports.\",\r\n          \"\u2708\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"taxis-ride-apps\",\r\n          \"Taxis & Ride Apps\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Getting Around\",\r\n          \"Taxis & Ride Apps\",\r\n          [],\r\n          \"Practical guidance for taxis, ride applications and private transportation.\",\r\n          \"\ud83d\ude95\"\r\n        ),\r\n\r\n        leaf(\r\n          \"walking-accessibility\",\r\n          \"Walking & Accessibility\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Getting Around\",\r\n          \"Walking & Accessibility\",\r\n          [],\r\n          \"Walking conditions, hills, sidewalks and mobility considerations.\",\r\n          \"\ud83d\udeb6\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"before-you-arrive\",\r\n      \"Before You Arrive\",\r\n      2,\r\n      \"\ud83e\uddf3\",\r\n      \"Trip Preparation\",\r\n      \"Prepare the essential details before arriving in Medell\u00edn.\",\r\n      [\r\n        leaf(\r\n          \"arrival-checklist\",\r\n          \"Arrival Checklist\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Before You Arrive\",\r\n          \"Arrival Checklist\",\r\n          [],\r\n          \"Documents, airport preparation and essential arrival information.\",\r\n          \"\u2705\"\r\n        ),\r\n\r\n        leaf(\r\n          \"money-payments\",\r\n          \"Money & Payments\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Before You Arrive\",\r\n          \"Money & Payments\",\r\n          [],\r\n          \"Currency, cards, cash, exchange and everyday payment guidance.\",\r\n          \"\ud83d\udcb3\"\r\n        ),\r\n\r\n        leaf(\r\n          \"phone-internet\",\r\n          \"Phone & Internet\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Before You Arrive\",\r\n          \"Phone & Internet\",\r\n          [],\r\n          \"Roaming, SIM cards, eSIM options and connectivity guidance.\",\r\n          \"\ud83d\udcf1\"\r\n        ),\r\n\r\n        leaf(\r\n          \"what-to-pack\",\r\n          \"What to Pack\",\r\n          2,\r\n          \"First Time Visitor\",\r\n          \"Before You Arrive\",\r\n          \"What to Pack\",\r\n          [],\r\n          \"Weather-aware packing guidance and essential items for Medell\u00edn.\",\r\n          \"\ud83c\udf92\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    leaf(\r\n  \"smart-recommendations\",\r\n  \"My Smart Recommendations\",\r\n  2,\r\n  \"First Time Visitor\",\r\n  \"My Smart Recommendations\",\r\n  \"Featured\",\r\n  [],\r\n  \"Open your Travel Intelligence profile and discover the Bliss hosts and experiences that match you best.\",\r\n  \"\ud83e\udde0\"\r\n)\r\n  ]\r\n),\r\n        \r\n\r\n        {\r\n  id:\"accommodations\",\r\n  label:\"Accommodations\",\r\n  level:2,\r\n  icon:\"\ud83c\udfe8\",\r\n  type:\"Places to Stay\",\r\n  copy:\"Explore all available accommodations in Medell\u00edn. Use the filters to narrow the properties by stay type and duration.\",\r\n  directInventory:true,\r\n  connection:{\r\n    guide:\"Accommodations\",\r\n    option:\"\",\r\n    suboption:\"\"\r\n  },\r\n  legacyConnections:[]\r\n},\r\n\r\n        {\r\n  id:\"transportation\",\r\n  label:\"Transportation\",\r\n  level:2,\r\n  icon:\"\ud83d\ude98\",\r\n  type:\"Mobility & Arrival\",\r\n  copy:\"Explore all available transportation services. Use the filters to narrow the results by transportation type and travel purpose.\",\r\n  directInventory:true,\r\n  connection:{\r\n    guide:\"Transportation\",\r\n    option:\"\",\r\n    suboption:\"\"\r\n  },\r\n  legacyConnections:[]\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(\r\n  \"sustainability\",\r\n  \"Sustainability\",\r\n  2,\r\n  \"\u267b\ufe0f\",\r\n  \"Responsible Travel\",\r\n  \"Report environmental opportunities, support projects and discover sustainable experiences.\",\r\n  [\r\n\r\n    group(\r\n      \"recycling\",\r\n      \"Recycling\",\r\n      2,\r\n      \"\u267b\ufe0f\",\r\n      \"Recycling Action\",\r\n      \"Report recycling opportunities, support cleanups and discover recycling experiences.\",\r\n      [\r\n        leaf(\r\n          \"recycling-report\",\r\n          \"Pin a Recycling Opportunity\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Recycling\",\r\n          \"Report Opportunity\",\r\n          [],\r\n          \"Send the location and details of a recycling or cleanup opportunity.\",\r\n          \"\ud83d\udccd\"\r\n        ),\r\n\r\n        leaf(\r\n          \"recycling-sponsor\",\r\n          \"Sponsor a Cleanup\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Recycling\",\r\n          \"Sponsor Cleanup\",\r\n          [],\r\n          \"Contribute toward a verified recycling cleanup.\",\r\n          \"\ud83d\udc9a\"\r\n        ),\r\n\r\n        leaf(\r\n          \"recycling-cleanups\",\r\n          \"Join a Cleanup\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Recycling\",\r\n          \"Cleanup Opportunities\",\r\n          [\r\n            L(\r\n              \"Maximize Conservation\",\r\n              \"Recycling Opportunities\"\r\n            )\r\n          ],\r\n          \"Discover approved recycling cleanup opportunities.\",\r\n          \"\ud83e\udde4\"\r\n        ),\r\n\r\n        leaf(\r\n          \"recycling-tours\",\r\n          \"Recycling Tours\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Recycling\",\r\n          \"Recycling Tours\",\r\n          [\r\n            L(\r\n              \"Maximize Conservation\",\r\n              \"Recycling Opportunities\"\r\n            )\r\n          ],\r\n          \"Visit recycling projects and learn how materials are reused.\",\r\n          \"\ud83d\ude8c\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"rivers-canals\",\r\n      \"Rivers & Canals\",\r\n      2,\r\n      \"\ud83c\udf0a\",\r\n      \"Water Conservation\",\r\n      \"Report waterway issues, support cleanups and explore conservation projects.\",\r\n      [\r\n        leaf(\r\n          \"water-report\",\r\n          \"Pin a Waterway Issue\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Rivers & Canals\",\r\n          \"Report Waterway Issue\",\r\n          [],\r\n          \"Send the location and details of pollution, trash or a blocked waterway.\",\r\n          \"\ud83d\udccd\"\r\n        ),\r\n\r\n        leaf(\r\n          \"water-sponsor\",\r\n          \"Sponsor a Waterway Cleanup\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Rivers & Canals\",\r\n          \"Sponsor Cleanup\",\r\n          [],\r\n          \"Support a verified river or canal cleanup.\",\r\n          \"\ud83d\udca7\"\r\n        ),\r\n\r\n        leaf(\r\n          \"water-cleanups\",\r\n          \"Join a Waterway Cleanup\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Rivers & Canals\",\r\n          \"Cleanup Opportunities\",\r\n          [\r\n            L(\r\n              \"Maximize Conservation\",\r\n              \"Canal Cleanups\"\r\n            )\r\n          ],\r\n          \"Discover approved river and canal cleanup opportunities.\",\r\n          \"\ud83e\udde4\"\r\n        ),\r\n\r\n        leaf(\r\n          \"water-tours\",\r\n          \"Water Conservation Tours\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Rivers & Canals\",\r\n          \"Water Tours\",\r\n          [\r\n            L(\r\n              \"Nature Guide\",\r\n              \"River Experiences\"\r\n            )\r\n          ],\r\n          \"Explore waterways and learn about local water conservation.\",\r\n          \"\ud83d\udef6\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"sustainable-agriculture\",\r\n      \"Sustainable Agriculture\",\r\n      2,\r\n      \"\ud83c\udf31\",\r\n      \"Soil & Agriculture\",\r\n      \"Report land opportunities and discover farms, gardens and composting projects.\",\r\n      [\r\n        leaf(\r\n          \"land-report\",\r\n          \"Pin a Land Opportunity\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Sustainable Agriculture\",\r\n          \"Report Land Opportunity\",\r\n          [],\r\n          \"Send the location and details of a soil, land or community garden opportunity.\",\r\n          \"\ud83d\udccd\"\r\n        ),\r\n\r\n        leaf(\r\n          \"agriculture-support\",\r\n          \"Support a Farm or Garden\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Sustainable Agriculture\",\r\n          \"Support Project\",\r\n          [],\r\n          \"Support a verified farm, garden or soil restoration project.\",\r\n          \"\ud83d\udc9a\"\r\n        ),\r\n\r\n        leaf(\r\n          \"agriculture-projects\",\r\n          \"Join a Community Project\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Sustainable Agriculture\",\r\n          \"Community Projects\",\r\n          [\r\n            L(\r\n              \"Food Guide\",\r\n              \"Fruit Farms\"\r\n            )\r\n          ],\r\n          \"Discover gardening, planting and agricultural projects.\",\r\n          \"\ud83e\udeb4\"\r\n        ),\r\n\r\n        leaf(\r\n          \"agriculture-tours\",\r\n          \"Farm & Composting Tours\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Sustainable Agriculture\",\r\n          \"Farm Tours\",\r\n          [\r\n            L(\r\n              \"Food Guide\",\r\n              \"Farm & Tasting Tours\"\r\n            )\r\n          ],\r\n          \"Visit farms, gardens and composting projects.\",\r\n          \"\ud83d\ude9c\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"clean-energy\",\r\n      \"Energy & Conservation\",\r\n      2,\r\n      \"\u26a1\",\r\n      \"Clean Energy\",\r\n      \"Support conservation projects and learn how sustainable energy is created.\",\r\n      [\r\n        leaf(\r\n          \"energy-projects\",\r\n          \"Support a Conservation Project\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Energy & Conservation\",\r\n          \"Conservation Projects\",\r\n          [],\r\n          \"Support a verified energy or conservation initiative.\",\r\n          \"\ud83d\udc9a\"\r\n        ),\r\n\r\n        leaf(\r\n          \"energy-tours\",\r\n          \"Clean Energy Tours\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Energy & Conservation\",\r\n          \"Energy Tours\",\r\n          [\r\n            L(\r\n              \"Maximize Conservation\",\r\n              \"Learn to Make Energy\"\r\n            )\r\n          ],\r\n          \"Discover renewable energy and conservation projects.\",\r\n          \"\u2600\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"energy-learn\",\r\n          \"Learn How Energy Is Made\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Energy & Conservation\",\r\n          \"Energy Education\",\r\n          [\r\n            L(\r\n              \"Maximize Conservation\",\r\n              \"Learn to Make Energy\"\r\n            )\r\n          ],\r\n          \"Learn about solar, hydroelectric and waste-to-energy systems.\",\r\n          \"\ud83d\udca1\"\r\n        ),\r\n\r\n        leaf(\r\n          \"energy-tips\",\r\n          \"Energy-Saving Tips\",\r\n          2,\r\n          \"Sustainability\",\r\n          \"Energy & Conservation\",\r\n          \"Energy Tips\",\r\n          [],\r\n          \"Explore practical ways to conserve energy while traveling.\",\r\n          \"\ud83d\udd0b\"\r\n        )\r\n      ]\r\n    )\r\n\r\n  ]\r\n),\r\n\r\n        group(\r\n  \"legacy\",\r\n  \"Legacy\",\r\n  2,\r\n  \"\ud83d\udcab\",\r\n  \"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\r\n  \"Turn what you discover, exchange, create or build into something that continues beyond the trip.\",\r\n  [\r\n\r\n    group(\r\n      \"legacy-imagine\",\r\n      \"Imagine\",\r\n      2,\r\n      \"\ud83d\udca1\",\r\n      \"Develop an Idea\",\r\n      \"Begin with an idea, then choose how you want it to move forward.\",\r\n      [\r\n        leaf(\r\n          \"legacy-imagine-imagine\",\r\n          \"Develop a New Idea\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Imagine\",\r\n          \"Imagine\",\r\n          [],\r\n          \"What do you want to imagine or develop?\",\r\n          \"\ud83d\udca1\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-imagine-exchange\",\r\n          \"Find Collaborators\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Imagine\",\r\n          \"Exchange\",\r\n          [],\r\n          \"Who would you like to connect with to exchange ideas, feedback or support?\",\r\n          \"\ud83e\udd1d\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-imagine-record\",\r\n          \"Create the Idea\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Imagine\",\r\n          \"Record\",\r\n          [],\r\n          \"Would you like to turn your idea into music, film, media or a recorded story?\",\r\n          \"\ud83c\udfac\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-imagine-franchise\",\r\n          \"Grow the Idea\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Imagine\",\r\n          \"Franchise\",\r\n          [],\r\n          \"Could this idea become a lasting business, city project or Gods Galaxy Game opportunity?\",\r\n          \"\ud83d\ude80\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"legacy-exchange\",\r\n      \"Exchange\",\r\n      2,\r\n      \"\ud83d\udd04\",\r\n      \"Share & Connect\",\r\n      \"Exchange ideas, culture, skills, opportunities or vacation-property access.\",\r\n      [\r\n        leaf(\r\n          \"legacy-exchange-imagine\",\r\n          \"Exchange Ideas\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Exchange\",\r\n          \"Imagine\",\r\n          [],\r\n          \"What ideas, knowledge or inspiration would you like to exchange?\",\r\n          \"\ud83d\udcad\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-exchange-exchange\",\r\n          \"Cultural, Skills or Business Exchange\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Exchange\",\r\n          \"Exchange\",\r\n          [],\r\n          \"What would you like to share, learn or collaborate on?\",\r\n          \"\ud83c\udf10\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-exchange-record\",\r\n          \"Document the Exchange\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Exchange\",\r\n          \"Record\",\r\n          [],\r\n          \"Would you like to record an interview, podcast, collaboration or cultural story?\",\r\n          \"\ud83c\udf99\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-exchange-franchise\",\r\n          \"Vacation Property Exchange\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Exchange\",\r\n          \"Franchise\",\r\n          [],\r\n          \"Explore vacation-property exchange and fractional-use opportunities through Bliss Fractional Club.\",\r\n          \"\ud83c\udfe1\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"legacy-record\",\r\n      \"Record\",\r\n      2,\r\n      \"\ud83c\udfa5\",\r\n      \"Create & Preserve\",\r\n      \"Develop, collaborate on, produce and grow a creative legacy.\",\r\n      [\r\n        leaf(\r\n          \"legacy-record-imagine\",\r\n          \"Develop the Creative Concept\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Record\",\r\n          \"Imagine\",\r\n          [],\r\n          \"What music, film, story, photo or media concept would you like to develop?\",\r\n          \"\ud83d\udcdd\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-record-exchange\",\r\n          \"Connect With Local Creators\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Record\",\r\n          \"Exchange\",\r\n          [],\r\n          \"Which musicians, producers, filmmakers, photographers or collaborators do you need?\",\r\n          \"\ud83c\udfad\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-record-record\",\r\n          \"Produce Your Legacy\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Record\",\r\n          \"Record\",\r\n          [],\r\n          \"What would you like to produce: music, a mini movie, your story, or a photo\/podcast project?\",\r\n          \"\ud83c\udf9e\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-record-franchise\",\r\n          \"Grow Your Creation\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Record\",\r\n          \"Franchise\",\r\n          [],\r\n          \"Would you like to distribute, license, promote or expand your creation?\",\r\n          \"\ud83d\udce1\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"legacy-franchise\",\r\n      \"Franchise\",\r\n      2,\r\n      \"\ud83c\udf0d\",\r\n      \"Put Your City on the Map\",\r\n      \"Bring Gods Galaxy Game to your city or create a lasting city legacy.\",\r\n      [\r\n        leaf(\r\n          \"legacy-franchise-imagine\",\r\n          \"Imagine GGG in Your City\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Franchise\",\r\n          \"Imagine\",\r\n          [],\r\n          \"Can you imagine Gods Galaxy Game in your city? Tell us why your city belongs on the map.\",\r\n          \"\ud83d\uddfa\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-franchise-exchange\",\r\n          \"Connect Your City\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Franchise\",\r\n          \"Exchange\",\r\n          [],\r\n          \"Which local businesses, tourism leaders, venues, investors or officials could connect with the GGG network?\",\r\n          \"\ud83d\udd17\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-franchise-record\",\r\n          \"Sponsor or Build a Stadium\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Franchise\",\r\n          \"Record\",\r\n          [],\r\n          \"Would you like to sponsor, name or help build a community field, mini stadium or larger sports venue?\",\r\n          \"\ud83c\udfdf\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"legacy-franchise-franchise\",\r\n          \"Launch Gods Galaxy Game\",\r\n          2,\r\n          \"Legacy\",\r\n          \"Franchise\",\r\n          \"Franchise\",\r\n          [],\r\n          \"Would you like to franchise GGG, become a City Ambassador, sponsor a city launch or build the city experience?\",\r\n          \"\ud83c\udf1f\"\r\n        )\r\n      ]\r\n    )\r\n  ]\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(\r\n  \"entertainment\",\r\n  \"Entertainment\",\r\n  3,\r\n  \"\ud83c\udfad\",\r\n  \"Events & Experiences\",\r\n  \"Discover concerts, fashion, comedy and sports through premium Medell\u00edn experiences.\",\r\n  [\r\n\r\n    group(\r\n      \"entertainment-concerts\",\r\n      \"Concerts\",\r\n      3,\r\n      \"\ud83c\udfa4\",\r\n      \"Live Music Access\",\r\n      \"Choose how you would like to experience a live concert.\",\r\n      [\r\n\r\n        leaf(\r\n          \"concert-backstage-experience\",\r\n          \"Backstage Experience\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Concerts\",\r\n          \"Backstage Experience\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Concerts\",\r\n    \"Backstage Experience\"\r\n  )\r\n],\r\n          \"Go behind the scenes and discover artist, crew and production areas when access is available.\",\r\n          \"\ud83c\udf9f\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"concert-private-suite\",\r\n          \"Private Concert Suite\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Concerts\",\r\n          \"Private Concert Suite\",\r\n         [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Concerts\",\r\n    \"Private Concert Suite\"\r\n  )\r\n],\r\n          \"Enjoy the concert from a private box, lounge or premium suite when available.\",\r\n          \"\ud83e\udd42\"\r\n        ),\r\n\r\n        leaf(\r\n          \"concert-vip-experience\",\r\n          \"VIP Concert Experience\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Concerts\",\r\n          \"VIP Concert Experience\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Concerts\",\r\n    \"VIP Concert Experience\"\r\n  )\r\n],\r\n          \"Explore premium seating, priority entry, hospitality and special concert access.\",\r\n          \"\u2b50\"\r\n        ),\r\n\r\n        leaf(\r\n          \"concert-on-stage-viewing\",\r\n          \"On-Stage Viewing Experience\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Concerts\",\r\n          \"On-Stage Viewing Experience\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Concerts\",\r\n    \"On-Stage Viewing Experience\"\r\n  )\r\n],\r\n          \"Watch the concert from a special viewing area on or beside the stage, when available.\",\r\n          \"\ud83c\udfb8\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"entertainment-fashion\",\r\n      \"Fashion\",\r\n      3,\r\n      \"\ud83d\udc57\",\r\n      \"Style & Design\",\r\n      \"Experience Medell\u00edn through runway events, shopping, digital fashion and local design districts.\",\r\n      [\r\n\r\n        leaf(\r\n          \"fashion-live-shows\",\r\n          \"Live Fashion Shows\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Fashion\",\r\n          \"Live Fashion Shows\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Fashion\",\r\n    \"Live Fashion Shows\"\r\n  )\r\n],\r\n          \"Attend runway shows, designer events, launches and live fashion productions.\",\r\n          \"\u2728\"\r\n        ),\r\n\r\n        leaf(\r\n          \"fashion-shopping-malls\",\r\n          \"Fashion & Shopping Malls\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Fashion\",\r\n          \"Fashion & Shopping Malls\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Fashion\",\r\n    \"Fashion & Shopping Malls\"\r\n  )\r\n],\r\n          \"Explore major malls, boutiques, designer stores and shopping destinations.\",\r\n          \"\ud83d\udecd\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"fashion-digital-experience\",\r\n          \"Digital Fashion Experience\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Fashion\",\r\n          \"Digital Fashion Experience\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Fashion\",\r\n    \"Digital Fashion Experience\"\r\n  )\r\n],\r\n          \"Discover online designers, fashion creators, virtual style and digital shopping.\",\r\n          \"\ud83d\udcf1\"\r\n        ),\r\n\r\n        leaf(\r\n          \"fashion-downtown-district\",\r\n          \"Downtown Fashion District\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Fashion\",\r\n          \"Downtown Fashion District\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Fashion\",\r\n    \"Downtown Fashion District\"\r\n  )\r\n],\r\n          \"Explore local designers, manufacturers, outlets, workshops and street fashion downtown.\",\r\n          \"\ud83c\udfd9\ufe0f\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"entertainment-comedy\",\r\n      \"Comedy\",\r\n      3,\r\n      \"\ud83d\ude02\",\r\n      \"Humor & Performance\",\r\n      \"Enjoy live comedy, stand-up, humorous city experiences or private entertainment.\",\r\n      [\r\n\r\n        leaf(\r\n          \"comedy-live-shows\",\r\n          \"Live Comedy Shows\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Comedy\",\r\n          \"Live Comedy Shows\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Comedy\",\r\n    \"Live Comedy Shows\"\r\n  )\r\n],\r\n          \"Attend live comedy performances, theaters and entertainment events.\",\r\n          \"\ud83c\udfad\"\r\n        ),\r\n\r\n        leaf(\r\n          \"comedy-stand-up\",\r\n          \"Stand-Up Comedy\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Comedy\",\r\n          \"Stand-Up Comedy\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Comedy\",\r\n    \"Stand-Up Comedy\"\r\n  )\r\n],\r\n          \"Discover stand-up comedians, comedy clubs and open-mic performances.\",\r\n          \"\ud83c\udf99\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"comedy-city-experience\",\r\n          \"Comedy City Experience\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Comedy\",\r\n          \"Comedy City Experience\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Comedy\",\r\n    \"Comedy City Experience\"\r\n  )\r\n],\r\n          \"Explore the city through humor, storytelling or an experience led by a comedic host.\",\r\n          \"\ud83d\ude04\"\r\n        ),\r\n\r\n        leaf(\r\n          \"comedy-book-comedian\",\r\n          \"Book a Comedian\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Comedy\",\r\n          \"Book a Comedian\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Comedy\",\r\n    \"Book a Comedian\"\r\n  )\r\n],\r\n          \"Request a comedian or comedy host for a private event, party, company or group.\",\r\n          \"\ud83d\udcc5\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"entertainment-sports\",\r\n      \"Sports\",\r\n      3,\r\n      \"\u26bd\",\r\n      \"Play, Watch & Explore\",\r\n      \"Train, attend a game, play with locals or explore Medell\u00edn sports venues.\",\r\n      [\r\n\r\n        leaf(\r\n          \"sports-lessons-training\",\r\n          \"Sports Lessons & Training\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Sports\",\r\n          \"Sports Lessons & Training\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Sports\",\r\n    \"Sports Lessons & Training\"\r\n  )\r\n],\r\n          \"Learn or improve a sport with coaches, trainers and local athletes.\",\r\n          \"\ud83c\udfcb\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"sports-live-game\",\r\n          \"Attend a Live Game\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Sports\",\r\n          \"Attend a Live Game\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Sports\",\r\n    \"Attend a Live Game\"\r\n  )\r\n],\r\n          \"Watch football, basketball, baseball or another live sporting event.\",\r\n          \"\ud83c\udfdf\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"sports-play-locals\",\r\n          \"Play With Locals\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Sports\",\r\n          \"Play With Locals\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Sports\",\r\n    \"Play With Locals\"\r\n  )\r\n],\r\n          \"Join a local match, recreational game, tournament or sports community.\",\r\n          \"\ud83e\udd1d\"\r\n        ),\r\n\r\n        leaf(\r\n          \"sports-stadium-tours\",\r\n          \"Stadium & Sports Tours\",\r\n          3,\r\n          \"Entertainment\",\r\n          \"Sports\",\r\n          \"Stadium & Sports Tours\",\r\n          [\r\n  L(\r\n    \"Entertainment\",\r\n    \"Sports\",\r\n    \"Stadium & Sports Tours\"\r\n  )\r\n],\r\n          \"Visit stadiums, training centers, sports museums, clubs and iconic venues.\",\r\n          \"\ud83c\udfc6\"\r\n        )\r\n      ]\r\n    )\r\n  ]\r\n),\r\n\r\n        group(\r\n  \"medical-tourism\",\r\n  \"Medical Tourism\",\r\n  3,\r\n  \"\ud83e\ude7a\",\r\n  \"Health, Treatment & Recovery\",\r\n  \"Explore specialized healthcare, treatment and recovery services available in Medell\u00edn.\",\r\n  [\r\n\r\n    group(\r\n      \"medical-vision-care\",\r\n      \"Vision Care\",\r\n      3,\r\n      \"\ud83d\udc41\ufe0f\",\r\n      \"Eye Health & Vision\",\r\n      \"Explore eye examinations, vision correction, prescription services and follow-up care.\",\r\n      [\r\n\r\n        leaf(\r\n          \"vision-exams-diagnostics\",\r\n          \"Eye Exams & Diagnostics\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Vision Care\",\r\n          \"Eye Exams & Diagnostics\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Vision Care\",\r\n              \"Eye Exams & Diagnostics\"\r\n            )\r\n          ],\r\n          \"Connect with providers offering eye examinations, screenings and diagnostic evaluations.\",\r\n          \"\ud83d\udd0d\"\r\n        ),\r\n\r\n        leaf(\r\n          \"vision-correction-surgery\",\r\n          \"Vision Correction Surgery\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Vision Care\",\r\n          \"Vision Correction Surgery\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Vision Care\",\r\n              \"Vision Correction Surgery\"\r\n            )\r\n          ],\r\n          \"Explore consultations and providers for surgical vision-correction procedures.\",\r\n          \"\ud83c\udfe5\"\r\n        ),\r\n\r\n        leaf(\r\n          \"vision-eyewear-prescriptions\",\r\n          \"Eyewear & Prescriptions\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Vision Care\",\r\n          \"Eyewear & Prescriptions\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Vision Care\",\r\n              \"Eyewear & Prescriptions\"\r\n            )\r\n          ],\r\n          \"Find prescription glasses, contact lenses and personalized vision solutions.\",\r\n          \"\ud83d\udc53\"\r\n        ),\r\n\r\n        leaf(\r\n          \"vision-recovery-follow-up\",\r\n          \"Recovery & Follow-Up\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Vision Care\",\r\n          \"Recovery & Follow-Up\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Vision Care\",\r\n              \"Recovery & Follow-Up\"\r\n            )\r\n          ],\r\n          \"Arrange post-treatment monitoring, recovery support and follow-up appointments.\",\r\n          \"\ud83d\udccb\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"medical-dental-care\",\r\n      \"Dental Care\",\r\n      3,\r\n      \"\ud83e\uddb7\",\r\n      \"Oral Health & Dentistry\",\r\n      \"Explore preventive, surgical, cosmetic and emergency dental services.\",\r\n      [\r\n\r\n        leaf(\r\n          \"dental-preventive-care\",\r\n          \"Cleaning & Preventive Care\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Dental Care\",\r\n          \"Cleaning & Preventive Care\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Dental Care\",\r\n              \"Cleaning & Preventive Care\"\r\n            )\r\n          ],\r\n          \"Find dental examinations, professional cleanings and preventive oral care.\",\r\n          \"\ud83e\udea5\"\r\n        ),\r\n\r\n        leaf(\r\n          \"dental-surgery-implants\",\r\n          \"Oral Surgery & Dental Implants\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Dental Care\",\r\n          \"Oral Surgery & Dental Implants\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Dental Care\",\r\n              \"Oral Surgery & Dental Implants\"\r\n            )\r\n          ],\r\n          \"Explore oral surgery, dental implant and restorative treatment providers.\",\r\n          \"\ud83c\udfe5\"\r\n        ),\r\n\r\n        leaf(\r\n          \"dental-cosmetic-smile\",\r\n          \"Cosmetic Dentistry & Smile Design\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Dental Care\",\r\n          \"Cosmetic Dentistry & Smile Design\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Dental Care\",\r\n              \"Cosmetic Dentistry & Smile Design\"\r\n            )\r\n          ],\r\n          \"Discover cosmetic dentistry, veneers, whitening and personalized smile design.\",\r\n          \"\ud83d\ude01\"\r\n        ),\r\n\r\n        leaf(\r\n          \"dental-emergency-care\",\r\n          \"Emergency Dental Care\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Dental Care\",\r\n          \"Emergency Dental Care\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Dental Care\",\r\n              \"Emergency Dental Care\"\r\n            )\r\n          ],\r\n          \"Locate providers for urgent dental evaluations and time-sensitive treatment.\",\r\n          \"\ud83d\udea8\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"medical-aesthetic-care\",\r\n      \"Aesthetic Care\",\r\n      3,\r\n      \"\u2728\",\r\n      \"Aesthetic Medicine & Procedures\",\r\n      \"Explore consultations, surgical procedures, evaluations and recovery care.\",\r\n      [\r\n\r\n        leaf(\r\n          \"aesthetic-pre-surgery-evaluation\",\r\n          \"Pre-Surgery Evaluation\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Aesthetic Care\",\r\n          \"Pre-Surgery Evaluation\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Aesthetic Care\",\r\n              \"Pre-Surgery Evaluation\"\r\n            )\r\n          ],\r\n          \"Complete medical evaluations, testing and preparation before a planned cosmetic procedure.\",\r\n          \"\ud83d\udccb\"\r\n        ),\r\n\r\n        leaf(\r\n          \"aesthetic-cosmetic-surgery\",\r\n          \"Cosmetic Surgery\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Aesthetic Care\",\r\n          \"Cosmetic Surgery\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Aesthetic Care\",\r\n              \"Cosmetic Surgery\"\r\n            )\r\n          ],\r\n          \"Explore consultations and qualified providers offering cosmetic surgical procedures.\",\r\n          \"\ud83c\udfe5\"\r\n        ),\r\n\r\n        leaf(\r\n          \"aesthetic-first-consultation\",\r\n          \"First Consultation\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Aesthetic Care\",\r\n          \"First Consultation\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Aesthetic Care\",\r\n              \"First Consultation\"\r\n            )\r\n          ],\r\n          \"Meet with a qualified provider to discuss your goals, explore possible procedures and understand which options may be appropriate for you.\",\r\n          \"\ud83d\udc69\u200d\u2695\ufe0f\"\r\n        ),\r\n\r\n        leaf(\r\n          \"aesthetic-recovery-aftercare\",\r\n          \"Recovery & Aftercare\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Aesthetic Care\",\r\n          \"Recovery & Aftercare\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Aesthetic Care\",\r\n              \"Recovery & Aftercare\"\r\n            )\r\n          ],\r\n          \"Arrange post-procedure assistance, recovery accommodations and follow-up care.\",\r\n          \"\ud83c\udf3f\"\r\n        )\r\n      ]\r\n    ),\r\n\r\n    group(\r\n      \"medical-regenerative-medicine\",\r\n      \"Regenerative Medicine\",\r\n      3,\r\n      \"\ud83e\uddec\",\r\n      \"Personalized Recovery & Wellness\",\r\n      \"Explore assessments, regenerative therapies, recovery support and continuing care.\",\r\n      [\r\n\r\n        leaf(\r\n          \"regenerative-health-assessment\",\r\n          \"Health Assessment & Diagnostics\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Regenerative Medicine\",\r\n          \"Health Assessment & Diagnostics\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Regenerative Medicine\",\r\n              \"Health Assessment & Diagnostics\"\r\n            )\r\n          ],\r\n          \"Explore personalized health evaluations, diagnostic services and treatment consultations.\",\r\n          \"\ud83e\ude7a\"\r\n        ),\r\n\r\n        leaf(\r\n          \"regenerative-therapies\",\r\n          \"Regenerative Therapies\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Regenerative Medicine\",\r\n          \"Regenerative Therapies\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Regenerative Medicine\",\r\n              \"Regenerative Therapies\"\r\n            )\r\n          ],\r\n          \"Connect with providers offering regenerative and restorative treatment options.\",\r\n          \"\ud83e\uddec\"\r\n        ),\r\n\r\n        leaf(\r\n          \"regenerative-recovery-wellness\",\r\n          \"Recovery & Wellness Support\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Regenerative Medicine\",\r\n          \"Recovery & Wellness Support\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Regenerative Medicine\",\r\n              \"Recovery & Wellness Support\"\r\n            )\r\n          ],\r\n          \"Explore supportive services designed to assist recovery, mobility and overall wellness.\",\r\n          \"\ud83c\udf31\"\r\n        ),\r\n\r\n        leaf(\r\n          \"regenerative-follow-up-care\",\r\n          \"Follow-Up Care\",\r\n          3,\r\n          \"Medical Tourism\",\r\n          \"Regenerative Medicine\",\r\n          \"Follow-Up Care\",\r\n          [\r\n            L(\r\n              \"Medical Tourism\",\r\n              \"Regenerative Medicine\",\r\n              \"Follow-Up Care\"\r\n            )\r\n          ],\r\n          \"Arrange continued monitoring, progress evaluations and post-treatment appointments.\",\r\n          \"\ud83d\udcc5\"\r\n            )\r\n      ]\r\n    )\r\n  ]\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  \r\nconst owns = level => {\r\n\r\n  level = Number(level) || 1;\r\n\r\n  if(level <= 1){\r\n    return true;\r\n  }\r\n\r\n  if(window.BlissFamilyAccess){\r\n\r\n  if(\r\n    window.BlissFamilyAccess.active === true\r\n  ){\r\n\r\n    if(\r\n      Array.isArray(\r\n        window.BlissFamilyAccess.ownedLevels\r\n      )\r\n    ){\r\n\r\n      return window.BlissFamilyAccess\r\n        .ownedLevels\r\n        .map(Number)\r\n        .includes(level);\r\n    }\r\n  }\r\n}\r\n\r\n\r\nif(!state.loggedIn){\r\n  return false;\r\n}\r\n\r\nif(!state.owned){\r\n  return false;\r\n}\r\n\r\nif(state.owned[level]){\r\n  return true;\r\n}\r\n\r\nif(state.owned[String(level)]){\r\n  return true;\r\n}\r\n\r\nreturn false;\r\n};\r\n\r\n const EXPLORE_ROOT_NAMES = [\r\n  \"First Time Visitor\",\r\n  \"Accommodations\",\r\n  \"Transportation\",\r\n  \"Nature\",\r\n  \"Cultural\",\r\n  \"Sustainability\",\r\n  \"Legacy\",\r\n  \"Discover\",\r\n  \"Entertainment\",\r\n  \"Medical Tourism\"\r\n];\r\n\r\nconst allRoots = function () {\r\n  return [\r\n    ...(STRUCTURE.levels[2] || []),\r\n    ...(STRUCTURE.levels[3] || [])\r\n  ].filter(function (item) {\r\n    return EXPLORE_ROOT_NAMES.indexOf(item.label) !== -1;\r\n  });\r\n};\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\r\n  const all =\r\n    Array.isArray(window.travelClubInventory)\r\n      ? window.travelClubInventory\r\n      : [];\r\n\r\n  const connections =\r\n    nodeConnections(node);\r\n\r\n  \/*\r\n   * The Control Panel uses the visible leaf name.\r\n   * Some Travel Club leaves use a shorter internal\r\n   * suboption name, so also accept node.label.\r\n   *\/\r\n  const visibleLabelConnection =\r\n    node && node.connection\r\n      ? {\r\n          ...node.connection,\r\n          suboption:\r\n            node.label ||\r\n            node.connection.suboption ||\r\n            \"\"\r\n        }\r\n      : null;\r\n\r\n  return all\r\n    .filter(function(host){\r\n\r\n      if(\r\n        !host ||\r\n        host.active === false ||\r\n        host.active === 0 ||\r\n        host.active === \"0\"\r\n      ){\r\n        return false;\r\n      }\r\n\r\n      const status =\r\n        norm(host.status || \"active\");\r\n\r\n      if(\r\n        status === \"hidden\" ||\r\n        status === \"inactive\"\r\n      ){\r\n        return false;\r\n      }\r\n\r\n      const section =\r\n        norm(\r\n          host.section ||\r\n          host.mainSection ||\r\n          host.source ||\r\n          \"\"\r\n        );\r\n\r\n      if(\r\n        section &&\r\n        section !== \"explore\" &&\r\n        section !== \"explore medellin\"\r\n      ){\r\n        return false;\r\n      }\r\n\r\n      const internalMatch =\r\n        connections.some(function(connection){\r\n          return hostMatchesConnection(\r\n            host,\r\n            connection\r\n          );\r\n        });\r\n\r\n      const visibleLabelMatch =\r\n        visibleLabelConnection\r\n          ? hostMatchesConnection(\r\n              host,\r\n              visibleLabelConnection\r\n            )\r\n          : false;\r\n\r\n      return (\r\n        internalMatch ||\r\n        visibleLabelMatch\r\n      );\r\n\r\n    })\r\n    .sort(function(a,b){\r\n\r\n      return (\r\n        Number(Boolean(b.featured)) -\r\n        Number(Boolean(a.featured))\r\n      ) || (\r\n        Number(a.order || 10) -\r\n        Number(b.order || 10)\r\n      );\r\n\r\n    });\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\/* =====================================================\r\n   EXPLORE MEDELL\u00cdN\r\n   OFFICIAL MEMBERSHIP SYNC\r\n===================================================== *\/\r\n\r\nwindow.addEventListener(\r\n  \"blissMembershipLoaded\",\r\n  function(event){\r\n\r\n    const detail =\r\n      event && event.detail\r\n        ? event.detail\r\n        : null;\r\n\r\n    if(!detail){\r\n      return;\r\n    }\r\n\r\n    state.loggedIn =\r\n      Boolean(detail.loggedIn);\r\n\r\n    state.owned =\r\n      detail.owned || {1:true};\r\n\r\n    state.ready = true;\r\n\r\n    renderCurrent();\r\n  }\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\r\n  const locked =\r\n    !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\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  : (\r\n      Number(node.level || 2) === 3\r\n        ? \"Level 3 \u2014 Locations & Experiences\"\r\n        : \"Level 2 \u2014 Travel Essentials\"\r\n    )\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\n\r\nfunction routeGridHTML(title,copy,nodes,showBack){\r\n  return `\r\n    <section class=\"bx5-routeStage\">\r\n\r\n      ${\r\n        title || copy\r\n          ? `\r\n            <div class=\"bx5-routeHead\">\r\n\r\n              ${\r\n                title\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                  : \"\"\r\n              }\r\n\r\n              ${\r\n                copy\r\n                  ? `\r\n                    <p class=\"bx5-routeCopy\">\r\n                      ${esc(copy)}\r\n                    <\/p>\r\n                  `\r\n                  : \"\"\r\n              }\r\n\r\n            <\/div>\r\n          `\r\n          : \"\"\r\n      }\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      \"\",\r\n      \"\",\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\nconst video =\r\n  host.videoUrl ||\r\n  host.youtubeUrl ||\r\n  host.video ||\r\n  \"\";\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 The Current Journey<\/button>\r\n            ${\r\n  host.reserveUrl || host.checkoutUrl\r\n    ? `\r\n      <button\r\n        class=\"bx3-action primary\"\r\n        data-bx3-reserve-host=\"${esc(id)}\"\r\n        type=\"button\">\r\n        Reserve With Bliss\r\n      <\/button>\r\n    `\r\n    : \"\"\r\n}\r\n${\r\n  video\r\n    ? `\r\n      <button\r\n        class=\"bx3-action\"\r\n        data-bx3-video=\"${esc(id)}\"\r\n        type=\"button\">\r\n        \u25b6 Watch Video\r\n      <\/button>\r\n    `\r\n    : \"\"\r\n}\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\nconst LEGACY_FRACTIONAL_URL =\r\n  \"https:\/\/godsgalaxygame.com\/GGG\/astro\/?fractional=1\";\r\n\r\nconst LEGACY_CONCIERGE_WHATSAPP =\r\n  \"+13219452434\";\r\n\r\nfunction isLegacyMatrixNode(node){\r\n\r\n  return Boolean(\r\n    node &&\r\n    \/^legacy-(imagine|exchange|record|franchise)-(imagine|exchange|record|franchise)$\/.test(\r\n      node.id\r\n    )\r\n  );\r\n}\r\n\r\nfunction renderLegacyRequest(node){\r\n\r\n  const g = grid();\r\n\r\n  if(!g || !node){\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * VACATION PROPERTY EXCHANGE\r\n   *\r\n   * This one does not save a form.\r\n   * It opens Bliss Fractional Club directly.\r\n   *\/\r\n  if(node.id === \"legacy-exchange-franchise\"){\r\n\r\n    g.innerHTML = shell(`\r\n      <section class=\"bx3-screen\">\r\n\r\n        <div class=\"bx3-topline\">\r\n\r\n          <div>\r\n\r\n            <div class=\"bx3-eyebrow\">\r\n              Legacy \u00b7 Vacation Property Exchange\r\n            <\/div>\r\n\r\n            <h2 class=\"bx3-sectionTitle\">\r\n              \ud83c\udfe1 Vacation Property Exchange\r\n            <\/h2>\r\n\r\n            <p class=\"bx3-lead\">\r\n              ${esc(node.copy || \"\")}\r\n            <\/p>\r\n\r\n            ${breadcrumbHTML(node)}\r\n\r\n            <div class=\"bx3-actions\">\r\n\r\n              <button\r\n                class=\"bx3-action primary\"\r\n                data-legacy-fractional\r\n                type=\"button\">\r\n\r\n                Open Bliss Fractional Club\r\n\r\n              <\/button>\r\n\r\n            <\/div>\r\n\r\n          <\/div>\r\n\r\n          <button\r\n            class=\"bx3-back\"\r\n            data-bx3-back\r\n            type=\"button\">\r\n\r\n            \u2190 Back\r\n\r\n          <\/button>\r\n\r\n        <\/div>\r\n\r\n      <\/section>\r\n    `);\r\n\r\n    return;\r\n  }\r\n\r\n  const parts =\r\n    node.id\r\n      .replace(\"legacy-\",\"\")\r\n      .split(\"-\");\r\n\r\n  const from =\r\n    (parts[0] || \"\")\r\n      .replace(\/^.\/,character =>\r\n        character.toUpperCase()\r\n      );\r\n\r\n  const to =\r\n    (parts[1] || \"\")\r\n      .replace(\/^.\/,character =>\r\n        character.toUpperCase()\r\n      );\r\n\r\n  g.innerHTML = shell(`\r\n    <section class=\"bx3-screen\">\r\n\r\n      <div class=\"bx3-topline\">\r\n\r\n        <div>\r\n\r\n          <div class=\"bx3-eyebrow\">\r\n            Legacy Matrix \u00b7\r\n            ${esc(from)} \u2192 ${esc(to)}\r\n          <\/div>\r\n\r\n          <h2 class=\"bx3-sectionTitle\">\r\n            ${node.icon || \"\ud83d\udcab\"}\r\n            ${esc(node.label)}\r\n          <\/h2>\r\n\r\n          <p class=\"bx3-lead\">\r\n            ${esc(node.copy || \"\")}\r\n          <\/p>\r\n\r\n          ${breadcrumbHTML(node)}\r\n\r\n        <\/div>\r\n\r\n        <button\r\n          class=\"bx3-back\"\r\n          data-bx3-back\r\n          type=\"button\">\r\n\r\n          \u2190 Back\r\n\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n      <div\r\n        style=\"\r\n          width:min(100%,720px);\r\n          margin:26px auto 0;\r\n          padding:clamp(20px,4vw,36px);\r\n          border:1px solid rgba(83,243,255,.28);\r\n          border-radius:26px;\r\n          background:\r\n            linear-gradient(\r\n              145deg,\r\n              #07101d,\r\n              #050912\r\n            );\r\n          box-shadow:\r\n            0 25px 80px rgba(0,0,0,.5);\r\n        \">\r\n\r\n        <label\r\n          style=\"\r\n            display:block;\r\n            margin-bottom:8px;\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          Tell us about your vision\r\n\r\n        <\/label>\r\n\r\n        <textarea\r\n          id=\"bxLegacyDetails\"\r\n          rows=\"7\"\r\n          placeholder=\"Describe what you want to create, exchange, record or bring to your city.\"\r\n          style=\"\r\n            width:100%;\r\n            box-sizing:border-box;\r\n            padding:14px;\r\n            border:1px solid rgba(255,255,255,.15);\r\n            border-radius:14px;\r\n            color:#fff;\r\n            background:rgba(0,0,0,.34);\r\n            font:inherit;\r\n            resize:vertical;\r\n          \"><\/textarea>\r\n\r\n        <label\r\n          style=\"\r\n            display:block;\r\n            margin:20px 0 8px;\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          City and country\r\n\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"bxLegacyCity\"\r\n          type=\"text\"\r\n          placeholder=\"Example: Orlando, United States\"\r\n          style=\"\r\n            width:100%;\r\n            box-sizing:border-box;\r\n            padding:14px;\r\n            border:1px solid rgba(255,255,255,.15);\r\n            border-radius:14px;\r\n            color:#fff;\r\n            background:rgba(0,0,0,.34);\r\n            font:inherit;\r\n          \">\r\n\r\n        <label\r\n          style=\"\r\n            display:block;\r\n            margin:20px 0 8px;\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          Preferred contact\r\n\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"bxLegacyContactMethod\"\r\n          style=\"\r\n            width:100%;\r\n            box-sizing:border-box;\r\n            padding:14px;\r\n            border:1px solid rgba(255,255,255,.15);\r\n            border-radius:14px;\r\n            color:#fff;\r\n            background:#07101d;\r\n            font:inherit;\r\n          \">\r\n\r\n          <option value=\"WhatsApp\">\r\n            WhatsApp\r\n          <\/option>\r\n\r\n          <option value=\"Email\">\r\n            Email\r\n          <\/option>\r\n\r\n          <option value=\"WhatsApp or Email\">\r\n            WhatsApp or Email\r\n          <\/option>\r\n\r\n        <\/select>\r\n\r\n        <button\r\n          class=\"bx3-action primary\"\r\n          data-legacy-submit=\"${esc(node.id)}\"\r\n          type=\"button\"\r\n          style=\"\r\n            width:100%;\r\n            margin-top:22px;\r\n          \">\r\n\r\n          Save Legacy Request to The Current Journey\r\n\r\n        <\/button>\r\n\r\n        <p\r\n          style=\"\r\n            margin:14px 0 0;\r\n            color:rgba(255,255,255,.65);\r\n            font-size:12px;\r\n            line-height:1.6;\r\n          \">\r\n\r\n          No payment is collected here.\r\n          After you send your full The Current Journey request,\r\n          a Bliss concierge can contact you through\r\n          WhatsApp or email.\r\n\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/section>\r\n  `);\r\n}\r\n\r\nasync function saveLegacyRequest(node){\r\n\r\n  const detailsNode =\r\n    document.getElementById(\r\n      \"bxLegacyDetails\"\r\n    );\r\n\r\n  const cityNode =\r\n    document.getElementById(\r\n      \"bxLegacyCity\"\r\n    );\r\n\r\n  const contactNode =\r\n    document.getElementById(\r\n      \"bxLegacyContactMethod\"\r\n    );\r\n\r\n  const details =\r\n    detailsNode\r\n      ? detailsNode.value\r\n      : \"\";\r\n\r\n  const city =\r\n    cityNode\r\n      ? cityNode.value\r\n      : \"\";\r\n\r\n  const contact =\r\n    contactNode\r\n      ? contactNode.value\r\n      : \"WhatsApp or Email\";\r\n\r\n  if(!details.trim()){\r\n\r\n    showNotice(\r\n      \"Details Required\",\r\n      \"Please describe your Legacy idea or request.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(!city.trim()){\r\n\r\n    showNotice(\r\n      \"City Required\",\r\n      \"Please enter the city and country connected to this request.\"\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\r\n    showNotice(\r\n      \"Journey Not Ready\",\r\n      \"Please sign in and wait for The Current Journey to finish loading.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(\r\n  typeof window.BlissJourneyAccount.canSync ===\r\n    \"function\"\r\n){\r\n\r\n  if(\r\n    !window.BlissJourneyAccount.canSync()\r\n  ){\r\n\r\n    showNotice(\r\n      \"Sign In Required\",\r\n      \"Please sign in with an active Bliss Travel account before saving this Legacy request.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n}\r\n\r\n  const parts =\r\n    node.id\r\n      .replace(\"legacy-\",\"\")\r\n      .split(\"-\");\r\n\r\n  const matrixPath =\r\n    parts\r\n      .map(value =>\r\n        value.replace(\r\n          \/^.\/,\r\n          character =>\r\n            character.toUpperCase()\r\n        )\r\n      )\r\n      .join(\" \u2192 \");\r\n\r\n  const id =\r\n    \"LEG-\" +\r\n    Date.now()\r\n      .toString(36)\r\n      .toUpperCase() +\r\n    \"-\" +\r\n    Math.random()\r\n      .toString(36)\r\n      .slice(2,6)\r\n      .toUpperCase();\r\n\r\n  const item = {\r\n\r\n    journeyId:\r\n      \"legacy|\" + id,\r\n\r\n    id:id,\r\n\r\n    source:\r\n      \"explore-medellin-legacy\",\r\n\r\n    requestSource:\r\n      \"legacy-matrix\",\r\n\r\n    type:\r\n      \"Legacy Request\",\r\n\r\n    category:\r\n      \"Legacy \u00b7 \" + matrixPath,\r\n\r\n    matrixPath:\r\n      matrixPath,\r\n\r\n    title:\r\n      node.label,\r\n\r\n    name:\r\n      node.label,\r\n\r\n    description:\r\n      details.trim(),\r\n\r\n    location:\r\n      city.trim(),\r\n\r\n    preferredContact:\r\n      contact,\r\n\r\n    conciergeWhatsApp:\r\n      LEGACY_CONCIERGE_WHATSAPP,\r\n\r\n    status:\r\n      \"Requested\",\r\n\r\n    reservationStatus:\r\n      \"Awaiting Concierge\",\r\n\r\n    requestedAt:\r\n      new Date().toISOString(),\r\n\r\n    customerSubmitted:\r\n      \"1\",\r\n\r\n    adminNotes:\r\n      \"Legacy request awaiting full The Current Journey submission and concierge follow-up.\",\r\n\r\n    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\r\n  try{\r\n\r\n    const result =\r\n      await window.BlissJourneyAccount\r\n        .addItem(item);\r\n\r\n    if(\r\n      result &&\r\n      result.duplicate\r\n    ){\r\n\r\n      throw new Error(\r\n        \"This Legacy request is already in The Current Journey.\"\r\n      );\r\n    }\r\n\r\n    if(\r\n      typeof window.BlissJourneyAccount.load ===\r\n        \"function\"\r\n    ){\r\n\r\n      await window.BlissJourneyAccount\r\n        .load(true);\r\n    }\r\n\r\n    if(\r\n      window.tc2JourneyV7 &&\r\n      typeof window.tc2JourneyV7.render ===\r\n        \"function\"\r\n    ){\r\n\r\n      window.tc2JourneyV7.render();\r\n    }\r\n\r\n    showNotice(\r\n      \"Saved to The Current Journey\",\r\n      \"Your \" +\r\n      matrixPath +\r\n      \" request is ready to send to the Bliss concierge.\"\r\n    );\r\n\r\n    if(detailsNode){\r\n      detailsNode.value = \"\";\r\n    }\r\n\r\n  }catch(error){\r\n\r\n    showNotice(\r\n      \"Could Not Save\",\r\n      error && error.message\r\n        ? error.message\r\n        : \"The Legacy request could not be saved.\"\r\n    );\r\n  }\r\n}\r\n\r\n  function renderLeaf(node){\r\n    const g=grid();\r\n    if(!g||!node) return;\r\nif(isLegacyMatrixNode(node)){\r\n  renderLegacyRequest(node);\r\n  return;\r\n}\r\nconst sustainabilityReportIds = [\r\n  \"recycling-report\",\r\n  \"water-report\",\r\n  \"land-report\"\r\n];\r\n\r\nif(\r\n  sustainabilityReportIds.includes(node.id)\r\n){\r\n\r\n  const config =\r\n    SUSTAINABILITY_REPORT_TYPES[node.id];\r\n\r\n  sustainabilityReportState = {\r\n    nodeId:node.id,\r\n    latitude:\"\",\r\n    longitude:\"\"\r\n  };\r\n\r\n  \r\n\r\n  g.innerHTML = shell(`\r\n    <section class=\"bx3-screen\">\r\n\r\n      <div class=\"bx3-topline\">\r\n\r\n        <div>\r\n          <div class=\"bx3-eyebrow\">\r\n            Bliss Sustainability\r\n          <\/div>\r\n\r\n          <h2 class=\"bx3-sectionTitle\">\r\n            ${node.icon || \"\ud83d\udccd\"}\r\n            ${esc(config ? config.title : node.label)}\r\n          <\/h2>\r\n\r\n          <p class=\"bx3-lead\">\r\n            ${\r\n              esc(\r\n                config\r\n                  ? config.prompt\r\n                  : \"Send the location and details.\"\r\n              )\r\n            }\r\n          <\/p>\r\n\r\n          ${breadcrumbHTML(node)}\r\n        <\/div>\r\n\r\n        <button\r\n          class=\"bx3-back\"\r\n          data-bx3-back\r\n          type=\"button\">\r\n          \u2190 Back\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n      <div\r\n        style=\"\r\n          width:min(100%,700px);\r\n          margin:28px auto 0;\r\n          padding:clamp(20px,4vw,38px);\r\n          border:1px solid rgba(112,247,162,.38);\r\n          border-radius:28px;\r\n          color:#fff;\r\n          background:\r\n            radial-gradient(\r\n              circle at top left,\r\n              rgba(112,247,162,.14),\r\n              transparent 38%\r\n            ),\r\n            linear-gradient(\r\n              145deg,\r\n              #071a16,\r\n              #07101d 58%,\r\n              #03070d\r\n            );\r\n          box-shadow:\r\n            0 30px 90px rgba(0,0,0,.55),\r\n            0 0 35px rgba(112,247,162,.15);\r\n        \">\r\n\r\n        <div\r\n          id=\"bxSustainabilityLocationStatus\"\r\n          style=\"\r\n            padding:14px 16px;\r\n            border:1px solid rgba(83,243,255,.20);\r\n            border-radius:15px;\r\n            color:#bdefff;\r\n            background:rgba(0,0,0,.24);\r\n            font-size:13px;\r\n          \">\r\n          Location has not been added.\r\n        <\/div>\r\n\r\n        <button\r\n          id=\"bxSustainabilityLocationButton\"\r\n          type=\"button\"\r\n          style=\"\r\n            width:100%;\r\n            margin-top:12px;\r\n            padding:14px 18px;\r\n            border:0;\r\n            border-radius:15px;\r\n            color:#02110a;\r\n            background:#70f7a2;\r\n            font-weight:900;\r\n            cursor:pointer;\r\n          \">\r\n          \ud83d\udccd Use My Current Location\r\n        <\/button>\r\n\r\n        <label\r\n          style=\"\r\n            display:block;\r\n            margin-top:22px;\r\n            margin-bottom:8px;\r\n            font-size:12px;\r\n            font-weight:900;\r\n            letter-spacing:.08em;\r\n            text-transform:uppercase;\r\n          \">\r\n          Description\r\n        <\/label>\r\n\r\n        <textarea\r\n          id=\"bxSustainabilityDescription\"\r\n          rows=\"6\"\r\n          placeholder=\"Describe what you saw and where it is located.\"\r\n          style=\"\r\n            width:100%;\r\n            box-sizing:border-box;\r\n            padding:14px;\r\n            border:1px solid rgba(255,255,255,.15);\r\n            border-radius:14px;\r\n            outline:none;\r\n            color:#fff;\r\n            background:rgba(0,0,0,.34);\r\n            font:inherit;\r\n            resize:vertical;\r\n          \"><\/textarea>\r\n\r\n        <label\r\n          style=\"\r\n            display:block;\r\n            margin-top:22px;\r\n            margin-bottom:8px;\r\n            font-size:12px;\r\n            font-weight:900;\r\n            letter-spacing:.08em;\r\n            text-transform:uppercase;\r\n          \">\r\n          Nearby landmark or address\r\n        <\/label>\r\n\r\n        <input\r\n          id=\"bxSustainabilityLandmark\"\r\n          type=\"text\"\r\n          placeholder=\"Example: Near the park entrance\"\r\n          style=\"\r\n            width:100%;\r\n            box-sizing:border-box;\r\n            padding:14px;\r\n            border:1px solid rgba(255,255,255,.15);\r\n            border-radius:14px;\r\n            outline:none;\r\n            color:#fff;\r\n            background:rgba(0,0,0,.34);\r\n            font:inherit;\r\n          \">\r\n\r\n        <div\r\n  style=\"\r\n    margin-top:22px;\r\n    padding:16px;\r\n    border:1px solid rgba(244,210,122,.24);\r\n    border-radius:16px;\r\n    background:rgba(244,210,122,.07);\r\n  \">\r\n\r\n  <div\r\n    style=\"\r\n      color:#f4d27a;\r\n      font-size:12px;\r\n      font-weight:900;\r\n      letter-spacing:.08em;\r\n      text-transform:uppercase;\r\n    \">\r\n    Community Contribution\r\n  <\/div>\r\n\r\n  <p\r\n    style=\"\r\n      margin:8px 0 12px;\r\n      color:rgba(235,246,255,.76);\r\n      font-size:13px;\r\n      line-height:1.55;\r\n    \">\r\n    Contributions help pay the people and\r\n    materials needed to complete approved\r\n    Sustainability work.\r\n  <\/p>\r\n\r\n  <select\r\n    id=\"bxSustainabilityContribution\"\r\n    style=\"\r\n      width:100%;\r\n      box-sizing:border-box;\r\n      padding:14px;\r\n      border:1px solid rgba(255,255,255,.15);\r\n      border-radius:14px;\r\n      outline:none;\r\n      color:#fff;\r\n      background:#07101d;\r\n      font:inherit;\r\n    \">\r\n    <option value=\"\">Choose an amount<\/option>\r\n    <option value=\"5\">$5<\/option>\r\n    <option value=\"10\">$10<\/option>\r\n    <option value=\"25\">$25<\/option>\r\n    <option value=\"50\">$50<\/option>\r\n  <\/select>\r\n\r\n<\/div>\r\n\r\n        <p\r\n          style=\"\r\n            margin-top:15px;\r\n            color:rgba(235,246,255,.72);\r\n            font-size:12px;\r\n            line-height:1.6;\r\n          \">\r\n          Reports are reviewed before a cleanup or\r\n          Sustainability project is approved.\r\n        <\/p>\r\n\r\n        <button\r\n          id=\"bxSustainabilitySubmit\"\r\n          type=\"button\"\r\n          style=\"\r\n            width:100%;\r\n            margin-top:14px;\r\n            padding:15px 18px;\r\n            border:0;\r\n            border-radius:15px;\r\n            color:#001116;\r\n            background:\r\n              linear-gradient(\r\n                135deg,\r\n                #53f3ff,\r\n                #70f7a2\r\n              );\r\n            font-weight:900;\r\n            cursor:pointer;\r\n          \">\r\n          Submit Opportunity\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n    <\/section>\r\n  `);\r\n\r\n  const locationButton =\r\n    document.getElementById(\r\n      \"bxSustainabilityLocationButton\"\r\n    );\r\n\r\n  if(locationButton){\r\n    locationButton.addEventListener(\r\n      \"click\",\r\n      requestSustainabilityLocation\r\n    );\r\n  }\r\n\r\n  const submitButton =\r\n    document.getElementById(\r\n      \"bxSustainabilitySubmit\"\r\n    );\r\n\r\n  if(submitButton){\r\n    submitButton.addEventListener(\r\n      \"click\",\r\n      sendSustainabilityReport\r\n    );\r\n  }\r\n\r\n  return;\r\n}\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 The Current 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\nfunction youtubeEmbedURL(url){\r\n\r\n  const value =\r\n    String(url || \"\").trim();\r\n\r\n  if(!value){\r\n    return \"\";\r\n  }\r\n\r\n  let match = value.match(\r\n    \/(?:youtube\\.com\\\/watch\\?(?:.*&)?v=|youtu\\.be\\\/)([A-Za-z0-9_-]{6,})\/i\r\n  );\r\n\r\n  if(!match){\r\n    match = value.match(\r\n      \/youtube\\.com\\\/(?:embed|shorts)\\\/([A-Za-z0-9_-]{6,})\/i\r\n    );\r\n  }\r\n\r\n  if(!match){\r\n    return \"\";\r\n  }\r\n\r\n  return (\r\n    \"https:\/\/www.youtube.com\/embed\/\" +\r\n    match[1] +\r\n    \"?autoplay=1&rel=0&playsinline=1\"\r\n  );\r\n}\r\n\r\nfunction closeExploreVideo(){\r\n\r\n  const popup =\r\n    document.getElementById(\r\n      \"bx3VideoPopup\"\r\n    );\r\n\r\n  const frameWrap =\r\n    document.getElementById(\r\n      \"bx3VideoFrameWrap\"\r\n    );\r\n\r\n  if(popup){\r\n    popup.style.display = \"none\";\r\n    popup.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n  }\r\n\r\n  \/*\r\n   * Removing the iframe also stops the video.\r\n   *\/\r\n  if(frameWrap){\r\n    frameWrap.innerHTML = \"\";\r\n  }\r\n\r\n  document.documentElement.style.overflow = \"\";\r\n  document.body.style.overflow = \"\";\r\n}\r\n\r\nfunction openExploreVideo(host){\r\n\r\n  if(!host){\r\n    showNotice(\r\n      \"Video Not Available\",\r\n      \"The selected host could not be found.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const originalURL =\r\n    host.videoUrl ||\r\n    host.youtubeUrl ||\r\n    host.video ||\r\n    \"\";\r\n\r\n  const embedURL =\r\n    youtubeEmbedURL(originalURL);\r\n\r\n  if(!embedURL){\r\n    showNotice(\r\n      \"Video Not Available\",\r\n      \"Add a valid YouTube URL for this host in the Control Panel.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const popup =\r\n    document.getElementById(\r\n      \"bx3VideoPopup\"\r\n    );\r\n\r\n  const frameWrap =\r\n    document.getElementById(\r\n      \"bx3VideoFrameWrap\"\r\n    );\r\n\r\n  if(\r\n    !popup ||\r\n    !frameWrap\r\n  ){\r\n    return;\r\n  }\r\n\r\n  frameWrap.innerHTML = `\r\n    <iframe\r\n      src=\"${esc(embedURL)}\"\r\n      title=\"${esc(\r\n        host.name ||\r\n        host.title ||\r\n        \"Host video\"\r\n      )}\"\r\n      allow=\"\r\n        accelerometer;\r\n        autoplay;\r\n        clipboard-write;\r\n        encrypted-media;\r\n        gyroscope;\r\n        picture-in-picture;\r\n        web-share\r\n      \"\r\n      allowfullscreen\r\n      style=\"\r\n        display:block;\r\n        width:100%;\r\n        height:100%;\r\n        border:0;\r\n      \"\r\n    ><\/iframe>\r\n  `;\r\n\r\n  popup.style.display = \"flex\";\r\n\r\n  popup.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\r\n\r\n  document.documentElement.style.overflow =\r\n    \"hidden\";\r\n\r\n  document.body.style.overflow =\r\n    \"hidden\";\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\nfunction exploreJourneyCategory(base,node){\r\n\r\n  const guide = norm(\r\n    node && node.connection\r\n      ? node.connection.guide\r\n      : \"\"\r\n  );\r\n\r\n  const option = norm(\r\n    node && node.connection\r\n      ? node.connection.option\r\n      : \"\"\r\n  );\r\n\r\n  const hostCategory = norm(\r\n    base.category ||\r\n    base.type ||\r\n    base.section ||\r\n    \"\"\r\n  );\r\n\r\n  const combined =\r\n    guide + \" \" +\r\n    option + \" \" +\r\n    hostCategory + \" \" +\r\n    norm(base.name || base.title || \"\");\r\n\r\n  if(\r\n    \/accommodation|hotel|stay|suite|resort|hostel|villa|apartment|penthouse|mansion|glamping\/.test(combined)\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\/.test(combined)\r\n  ){\r\n    return \"restaurants\";\r\n  }\r\n\r\n  if(\r\n    \/transportation|driver|airport|pickup|transport|car|vehicle|helicopter|yacht|boat|transfer|shuttle\/.test(combined)\r\n  ){\r\n    return \"transportation\";\r\n  }\r\n\r\n  if(\r\n    \/local service|concierge|translator|security|photographer|assistant\/.test(combined)\r\n  ){\r\n    return \"services\";\r\n  }\r\n\r\n  return \"experiences\";\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:exploreJourneyCategory(base,node),\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\nfunction reserveExploreHost(host){\r\n\r\n  if(!host){\r\n    showNotice(\r\n      \"Host Not Found\",\r\n      \"The selected host could not be found.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const reserveURL =\r\n    host.reserveUrl ||\r\n    host.checkoutUrl ||\r\n    \"\";\r\n\r\n  if(!reserveURL){\r\n    showNotice(\r\n      \"Reservation Not Available\",\r\n      \"This host does not have a Reserve With Bliss URL yet.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  window.open(\r\n    reserveURL,\r\n    \"_blank\",\r\n    \"noopener\"\r\n  );\r\n}\r\n\r\n\r\n  function saveJourney(base,node){\r\n\r\n  const item =\r\n    journeyItem(\r\n      base,\r\n      \"Saved\",\r\n      node\r\n    );\r\n\r\n  \/*\r\n   * Use the official public The Current Journey connection.\r\n   *\/\r\n  if(\r\n    !window.tc2JourneyV7 ||\r\n    typeof window.tc2JourneyV7.addItem !== \"function\"\r\n  ){\r\n    showNotice(\r\n      \"Journey Not Ready\",\r\n      \"The The Current Journey connection has not finished loading.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  try{\r\n\r\n    window.tc2JourneyV7.addItem(item);\r\n\r\n    \/*\r\n     * Refresh the Journey interface.\r\n     *\/\r\n    if(\r\n      typeof window.tc2JourneyV7.render === \"function\"\r\n    ){\r\n      window.tc2JourneyV7.render();\r\n    }\r\n\r\n    showNotice(\r\n      \"Added to The Current Journey\",\r\n      (\r\n        base.name ||\r\n        base.title ||\r\n        (\r\n          node &&\r\n          node.label\r\n        ) ||\r\n        \"Selection\"\r\n      ) +\r\n      \" was added to The Current Journey.\"\r\n    );\r\n\r\n   \r\n  }catch(error){\r\n\r\n    console.error(\r\n      \"[Explore Medell\u00edn \u2192 The Current Journey]\",\r\n      error\r\n    );\r\n\r\n    showNotice(\r\n      \"Could Not Add to Journey\",\r\n      error && error.message\r\n        ? error.message\r\n        : \"The selection could not be added.\"\r\n    );\r\n  }\r\n}\r\n\r\n\/* =====================================================\r\n   SUSTAINABILITY LOCATION REPORT\r\n===================================================== *\/\r\n\r\nconst SUSTAINABILITY_DONATION_URL = \"\";\r\n\r\nconst SUSTAINABILITY_REPORT_EMAIL =\r\n  \"godsgalaxygame@gmail.com\";\r\n\r\nconst SUSTAINABILITY_REPORT_TYPES = {\r\n  \"recycling-report\": {\r\n    title: \"Pin a Recycling Opportunity\",\r\n    category: \"Recycling\",\r\n    prompt:\r\n      \"Describe the recycling or cleanup opportunity.\"\r\n  },\r\n\r\n  \"water-report\": {\r\n    title: \"Pin a Waterway Issue\",\r\n    category: \"Rivers & Canals\",\r\n    prompt:\r\n      \"Describe the pollution, trash, blockage or waterway issue.\"\r\n  },\r\n\r\n  \"land-report\": {\r\n    title: \"Pin a Land Opportunity\",\r\n    category: \"Sustainable Agriculture\",\r\n    prompt:\r\n      \"Describe the land, soil, garden or agricultural opportunity.\"\r\n  }\r\n};\r\n\r\nlet sustainabilityReportState = {\r\n  nodeId: \"\",\r\n  latitude: \"\",\r\n  longitude: \"\"\r\n};\r\n\r\n\r\nfunction requestSustainabilityLocation(){\r\n\r\n  const status = document.getElementById(\r\n    \"bxSustainabilityLocationStatus\"\r\n  );\r\n\r\n  const button = document.getElementById(\r\n    \"bxSustainabilityLocationButton\"\r\n  );\r\n\r\n  if(!status){\r\n    return;\r\n  }\r\n\r\n  sustainabilityReportState.latitude = \"\";\r\n  sustainabilityReportState.longitude = \"\";\r\n\r\n  if(!window.isSecureContext){\r\n\r\n    status.textContent =\r\n      \"Location requires a secure HTTPS connection.\";\r\n\r\n    return;\r\n  }\r\n\r\n  if(!navigator.geolocation){\r\n\r\n    status.textContent =\r\n      \"Location services are not supported by this browser.\";\r\n\r\n    return;\r\n  }\r\n\r\n  status.textContent =\r\n    \"Finding your current location\u2026\";\r\n\r\n  if(button){\r\n    button.disabled = true;\r\n    button.textContent = \"Finding Location\u2026\";\r\n  }\r\n\r\n  navigator.geolocation.getCurrentPosition(\r\n\r\n    function(position){\r\n\r\n      const latitude =\r\n        Number(position.coords.latitude);\r\n\r\n      const longitude =\r\n        Number(position.coords.longitude);\r\n\r\n      if(\r\n        !Number.isFinite(latitude) ||\r\n        !Number.isFinite(longitude)\r\n      ){\r\n        status.textContent =\r\n          \"The browser returned an invalid location.\";\r\n\r\n        resetLocationButton(false);\r\n        return;\r\n      }\r\n\r\n      sustainabilityReportState.latitude =\r\n        latitude.toFixed(6);\r\n\r\n      sustainabilityReportState.longitude =\r\n        longitude.toFixed(6);\r\n\r\n      status.innerHTML =\r\n        \"<strong>Location added successfully.<\/strong>\" +\r\n        \"<br>Latitude: \" +\r\n        esc(sustainabilityReportState.latitude) +\r\n        \"<br>Longitude: \" +\r\n        esc(sustainabilityReportState.longitude) +\r\n        \"<br>Accuracy: approximately \" +\r\n        Math.round(position.coords.accuracy || 0) +\r\n        \" meters\";\r\n\r\n      resetLocationButton(true);\r\n    },\r\n\r\n    function(error){\r\n\r\n      sustainabilityReportState.latitude = \"\";\r\n      sustainabilityReportState.longitude = \"\";\r\n\r\n      let message =\r\n        \"Your location could not be determined.\";\r\n\r\n      if(error.code === 1){\r\n\r\n        message =\r\n          \"Location permission was blocked. Allow location access in your browser and try again.\";\r\n\r\n      }else if(error.code === 2){\r\n\r\n        message =\r\n          \"Your computer could not determine its location. Turn on Windows Location Services, then try again.\";\r\n\r\n      }else if(error.code === 3){\r\n\r\n        message =\r\n          \"The location request took too long. Please try again or enter a nearby landmark.\";\r\n\r\n      }\r\n\r\n      status.textContent = message;\r\n\r\n      resetLocationButton(false);\r\n    },\r\n\r\n    {\r\n      enableHighAccuracy:false,\r\n      timeout:30000,\r\n      maximumAge:300000\r\n    }\r\n  );\r\n\r\n  function resetLocationButton(success){\r\n\r\n    if(!button){\r\n      return;\r\n    }\r\n\r\n    button.disabled = false;\r\n\r\n    button.textContent =\r\n      success\r\n        ? \"\u2713 Location Added \u2014 Update Location\"\r\n        : \"\ud83d\udccd Try Current Location Again\";\r\n  }\r\n}\r\n\r\nfunction sendSustainabilityReport(){\r\n\r\n  const config =\r\n    SUSTAINABILITY_REPORT_TYPES[\r\n      sustainabilityReportState.nodeId\r\n    ];\r\n\r\n  if(!config){\r\n    return;\r\n  }\r\n\r\n  const descriptionNode =\r\n    document.getElementById(\r\n      \"bxSustainabilityDescription\"\r\n    );\r\n\r\n  const landmarkNode =\r\n    document.getElementById(\r\n      \"bxSustainabilityLandmark\"\r\n    );\r\n\r\n  const contributionNode =\r\n    document.getElementById(\r\n      \"bxSustainabilityContribution\"\r\n    );\r\n\r\n  const submitButton =\r\n    document.getElementById(\r\n      \"bxSustainabilitySubmit\"\r\n    );\r\n\r\n  const description =\r\n    descriptionNode\r\n      ? descriptionNode.value.trim()\r\n      : \"\";\r\n\r\n  const landmark =\r\n    landmarkNode\r\n      ? landmarkNode.value.trim()\r\n      : \"\";\r\n\r\n  const contributionAmount =\r\n    contributionNode\r\n      ? Number(contributionNode.value)\r\n      : 0;\r\n\r\n  if(!description){\r\n\r\n    showNotice(\r\n      \"Description Required\",\r\n      \"Please describe the opportunity or issue.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(\r\n    !sustainabilityReportState.latitude &&\r\n    !landmark\r\n  ){\r\n\r\n    showNotice(\r\n      \"Location Required\",\r\n      \"Use your current location or enter a nearby landmark.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  if(\r\n    !Number.isFinite(contributionAmount) ||\r\n    contributionAmount < 5\r\n  ){\r\n\r\n    showNotice(\r\n      \"Contribution Required\",\r\n      \"Choose a community contribution amount to continue.\"\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\r\n    showNotice(\r\n      \"Journey Not Ready\",\r\n      \"Please sign in and wait for The Current Journey to finish loading.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n if(\r\n  typeof window.BlissJourneyAccount.canSync ===\r\n    \"function\"\r\n){\r\n\r\n  if(\r\n    !window.BlissJourneyAccount.canSync()\r\n  ){\r\n\r\n    showNotice(\r\n      \"Sign In Required\",\r\n      \"Please sign in with an active Bliss Travel account before submitting an opportunity.\"\r\n    );\r\n\r\n    return;\r\n  }\r\n}\r\n\r\n  const latitude =\r\n    sustainabilityReportState.latitude;\r\n\r\n  const longitude =\r\n    sustainabilityReportState.longitude;\r\n\r\n  const opportunityId =\r\n    \"SUS-\" +\r\n    Date.now().toString(36).toUpperCase() +\r\n    \"-\" +\r\n    Math.random()\r\n      .toString(36)\r\n      .slice(2,6)\r\n      .toUpperCase();\r\n\r\n let mapUrl = \"\";\r\n\r\nif(latitude){\r\n\r\n  if(longitude){\r\n\r\n    mapUrl =\r\n      \"https:\/\/www.google.com\/maps?q=\" +\r\n      encodeURIComponent(\r\n        latitude + \",\" + longitude\r\n      );\r\n\r\n  }\r\n\r\n}\r\n\r\n let locationText = landmark;\r\n\r\nif(!locationText){\r\n\r\n  if(latitude){\r\n\r\n    if(longitude){\r\n\r\n      locationText =\r\n        latitude + \", \" + longitude;\r\n\r\n    }else{\r\n\r\n      locationText =\r\n        \"Medell\u00edn, Colombia\";\r\n\r\n    }\r\n\r\n  }else{\r\n\r\n    locationText =\r\n      \"Medell\u00edn, Colombia\";\r\n\r\n  }\r\n\r\n}\r\n\r\n  const item = {\r\n\r\n    journeyId:\r\n      \"sustainability|\" + opportunityId,\r\n\r\n    id:opportunityId,\r\n    opportunityId:opportunityId,\r\n\r\n    source:\r\n      \"explore-medellin-sustainability\",\r\n\r\n    type:\r\n      \"Sustainability Opportunity\",\r\n\r\n    category:\r\n      \"Sustainability \u00b7 \" + config.category,\r\n\r\n    title:config.title,\r\n    name:config.title,\r\n    description:description,\r\n    location:locationText,\r\n\r\n    latitude:latitude,\r\n    longitude:longitude,\r\n    mapUrl:mapUrl,\r\n\r\n    time:new Date().toLocaleString(),\r\n\r\n    status:\"Requested\",\r\n\r\n    fundingStatus:\r\n      \"Awaiting Payment\",\r\n\r\n    contributionAmount:\r\n      contributionAmount,\r\n\r\n    fundingReceived:0,\r\n    fundingGoal:0,\r\n\r\n    assignedTo:\"\",\r\n\r\n    adminNotes:\r\n      \"New Sustainability opportunity awaiting review and contribution payment.\",\r\n\r\n    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\r\n  if(submitButton){\r\n\r\n    submitButton.disabled = true;\r\n\r\n    submitButton.textContent =\r\n      \"Saving Opportunity\u2026\";\r\n  }\r\n\r\n  window.BlissJourneyAccount\r\n    .addItem(item)\r\n\r\n    .then(function(result){\r\n\r\n      if(\r\n        window.tc2JourneyV7 &#038;&#038;\r\n        typeof window.tc2JourneyV7.render ===\r\n          \"function\"\r\n      ){\r\n        window.tc2JourneyV7.render();\r\n      }\r\n\r\n      if(\r\n        result &#038;&#038;\r\n        result.duplicate\r\n      ){\r\n        throw new Error(\r\n          \"This opportunity is already in The Current Journey.\"\r\n        );\r\n      }\r\n\r\n      if(SUSTAINABILITY_DONATION_URL){\r\n\r\n        const paymentUrl =\r\n          SUSTAINABILITY_DONATION_URL +\r\n          (\r\n            SUSTAINABILITY_DONATION_URL.includes(\"?\")\r\n              ? \"&#038;\"\r\n              : \"?\"\r\n          ) +\r\n          \"opportunity=\" +\r\n          encodeURIComponent(opportunityId) +\r\n          \"&#038;amount=\" +\r\n          encodeURIComponent(\r\n            contributionAmount\r\n          );\r\n\r\n        window.open(\r\n          paymentUrl,\r\n          \"_blank\",\r\n          \"noopener\"\r\n        );\r\n      }\r\n\r\n      showNotice(\r\n        \"Opportunity Submitted\",\r\n        opportunityId +\r\n        \" was added to The Current Journey. Your $\" +\r\n        contributionAmount +\r\n        \" contribution is awaiting payment.\"\r\n      );\r\n\r\n      if(descriptionNode){\r\n        descriptionNode.value = \"\";\r\n      }\r\n\r\n      if(landmarkNode){\r\n        landmarkNode.value = \"\";\r\n      }\r\n\r\n      if(contributionNode){\r\n        contributionNode.value = \"\";\r\n      }\r\n\r\n      sustainabilityReportState.latitude = \"\";\r\n      sustainabilityReportState.longitude = \"\";\r\n\r\n      const locationStatus =\r\n        document.getElementById(\r\n          \"bxSustainabilityLocationStatus\"\r\n        );\r\n\r\n      if(locationStatus){\r\n\r\n        locationStatus.textContent =\r\n          \"Location has not been added.\";\r\n      }\r\n\r\n    })\r\n\r\n    .catch(function(error){\r\n\r\n      console.error(\r\n        \"[Sustainability Opportunity]\",\r\n        error\r\n      );\r\n\r\n      showNotice(\r\n        \"Opportunity Not Saved\",\r\n        error &#038;&#038; error.message\r\n          ? error.message\r\n          : \"The opportunity could not be saved to The Current Journey.\"\r\n      );\r\n\r\n    })\r\n\r\n    .finally(function(){\r\n\r\n      if(submitButton){\r\n\r\n        submitButton.disabled = false;\r\n\r\n        submitButton.textContent =\r\n          \"Submit Opportunity\";\r\n      }\r\n\r\n    });\r\n}\r\n  window.addEventListener(\"click\",function(event){\r\n    const target=\r\n  event.target&#038;&#038;event.target.closest\r\n    ? event.target.closest(\r\n  \"[data-bx3-open],\" +\r\n  \"[data-bx3-back],\" +\r\n  \"[data-bx3-save-route],\" +\r\n  \"[data-bx3-save-host],\" +\r\n  \"[data-bx3-reserve-host],\" +\r\n\"[data-bx3-video],\" +\r\n  \"[data-bx3-site],\" +\r\n  \"[data-legacy-submit],\" +\r\n  \"[data-legacy-fractional]\"\r\n)\r\n    : null;\r\n    if(!target) return;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    if(event.stopImmediatePropagation) event.stopImmediatePropagation();\r\n\r\nif(\r\n  target.hasAttribute(\r\n    \"data-legacy-fractional\"\r\n  )\r\n){\r\n\r\n  window.location.href =\r\n    LEGACY_FRACTIONAL_URL;\r\n\r\n  return;\r\n}\r\n\r\nif(target.dataset.legacySubmit){\r\n\r\n  const legacyNode =\r\n    currentNode();\r\n\r\n  if(\r\n    legacyNode &#038;&#038;\r\n    legacyNode.id ===\r\n      target.dataset.legacySubmit\r\n  ){\r\n\r\n    saveLegacyRequest(\r\n      legacyNode\r\n    );\r\n  }\r\n\r\n  return;\r\n}\r\n\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\nif(node.id === \"smart-recommendations\"){\r\n  if(\r\n    window.BlissTravelRecommendations &#038;&#038;\r\n    typeof window.BlissTravelRecommendations.open ===\r\n      \"function\"\r\n  ){\r\n    window.BlissTravelRecommendations.open();\r\n  }else{\r\n    showNotice(\r\n      \"Travel Intelligence Loading\",\r\n      \"Your recommendation system is still loading. Please try again.\"\r\n    );\r\n  }\r\n\r\n  return;\r\n}\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\")&#038;&#038;node){\r\n\r\n  saveJourney(\r\n    {\r\n      title:node.label,\r\n      description:node.copy||\"\"\r\n    },\r\n    node\r\n  );\r\n\r\n  return;\r\n}\r\n\r\nif(target.dataset.bx3SaveHost){\r\n\r\n  const host=\r\n    hostById(\r\n      target.dataset.bx3SaveHost\r\n    );\r\n\r\n  if(host&#038;&#038;node){\r\n    saveJourney(\r\n      host,\r\n      node\r\n    );\r\n  }\r\n\r\n  return;\r\n}\r\n\r\nif(target.dataset.bx3ReserveHost){\r\n\r\n  const host =\r\n    hostById(\r\n      target.dataset.bx3ReserveHost\r\n    );\r\n\r\n  reserveExploreHost(host);\r\n\r\n  return;\r\n}\r\n\r\nif(target.dataset.bx3Video){\r\n\r\n  const host =\r\n    hostById(\r\n      target.dataset.bx3Video\r\n    );\r\n\r\n  openExploreVideo(host);\r\n\r\n  return;\r\n}\r\n\r\n\r\n    if(target.dataset.bx3Site){\r\n      const host=hostById(target.dataset.bx3Site);\r\n      const url=host&#038;&#038;(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\r\n  \/*\r\n   * Opens Explore from its main guide screen.\r\n   * Use this only when a complete reset is intentional.\r\n   *\/\r\n  renderGuides: function(){\r\n    renderRoots();\r\n  },\r\n\r\n  \/*\r\n   * Refreshes whatever internal Explore screen is active\r\n   * without erasing state.path.\r\n   *\/\r\n  renderOptions: function(){\r\n    renderCurrent();\r\n  },\r\n\r\n  \/*\r\n   * Internal Explore Back:\r\n   *\r\n   * Hosts \u2192 Suboptions\r\n   * Suboptions \u2192 Options\r\n   * Options \u2192 Guides\r\n   *\/\r\n  goBack: function(){\r\n\r\n    if(state.path.length){\r\n      state.path.pop();\r\n      renderCurrent();\r\n      return true;\r\n    }\r\n\r\n    return false;\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\ndocument.addEventListener(\r\n  \"click\",\r\n  function(event){\r\n\r\n    const closeButton =\r\n      event.target.closest(\r\n        \"#bx3VideoClose\"\r\n      );\r\n\r\n    const popup =\r\n      document.getElementById(\r\n        \"bx3VideoPopup\"\r\n      );\r\n\r\n    if(closeButton){\r\n      closeExploreVideo();\r\n      return;\r\n    }\r\n\r\n    if(\r\n      popup &&\r\n      event.target === popup\r\n    ){\r\n      closeExploreVideo();\r\n    }\r\n  }\r\n);\r\n\r\ndocument.addEventListener(\r\n  \"keydown\",\r\n  function(event){\r\n\r\n    if(event.key === \"Escape\"){\r\n      closeExploreVideo();\r\n    }\r\n  }\r\n);\r\n})();\r\n\r\n\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\r\n  const pageMap = {\r\n    tc2HomePage:\"home\",\r\n    tc2AstroPage:\"astro\",\r\n    tc2BrainPage:\"brain\",\r\n    tc2ExplorePage:\"explore\",\r\n    tc2JourneyPage:\"journey\",\r\n    tc2ServicesPage:\"services\",\r\n    tc2StoryPage:\"story\"\r\n  };\r\n\r\n  const pageName = pageMap[pageId];\r\n\r\n  if(!pageName){\r\n    console.error(\r\n      \"[Bliss Travel] Unknown page ID:\",\r\n      pageId\r\n    );\r\n    return;\r\n  }\r\n\r\n  if(typeof window.tc2ShowPage === \"function\"){\r\n    window.tc2ShowPage(pageName);\r\n  }\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  function addHosts(items){\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(\r\n        host.id ||\r\n        host.hostId ||\r\n        fallbackID\r\n      );\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  \/*\r\n   * MAIN SOURCE\r\n   *\r\n   * This is the shared inventory already used by\r\n   * Astro Travel and Explore Medell\u00edn.\r\n   *\/\r\n  addHosts(window.travelClubInventory);\r\n\r\n  \/*\r\n   * LEGACY FALLBACK SOURCES\r\n   *\r\n   * Keep reading the old localStorage keys so older\r\n   * saved providers still appear without creating duplicates.\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    addHosts(items);\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 (\r\n      Number(a.order || 10) -\r\n      Number(b.order || 10)\r\n    );\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 The Current 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 The Current 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\",\"accommodations\",groups.accommodations.length > 0],\r\n  [\"Restaurant\",\"restaurants\",groups.restaurants.length > 0],\r\n  [\"Transportation\",\"transportation\",groups.transportation.length > 0],\r\n  [\"Experience\",\"experiences\",groups.experiences.length > 0],\r\n  [\"Local Service\",\"services\",groups.services.length > 0],\r\n  [\"Reservation Request\",\"reservations\",groups.reservations.length > 0]\r\n];\r\n\r\n    const ready =\r\n  checks.filter(function(check){\r\n    return check[2];\r\n  }).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 =\r\n  checks.map(function(check){\r\n\r\n    return (\r\n      '<button ' +\r\n      'type=\"button\" ' +\r\n      'class=\"tc2-mj-check ' +\r\n      (check[2] ? \"is-ready\" : \"\") +\r\n      '\" ' +\r\n      'data-mj-view=\"' +\r\n      escapeHTML(check[1]) +\r\n      '\">' +\r\n      escapeHTML(check[0]) +\r\n      '<\/button>'\r\n    );\r\n\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.savedByTravelerName ? `\r\n  <div class=\"tc2-mj-itemMeta\">\r\n    Added by ${escapeHTML(item.savedByTravelerName)}\r\n  <\/div>\r\n` : \"\"}\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\r\n  class=\"tc2-btn tc2-btn-violet\"\r\n  data-journey-message=\"${escapeHTML(id)}\"\r\n  type=\"button\">\r\n  MESSAGE CONCIERGE\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=\"tc2MjChat\" class=\"tc2-btn tc2-btn-cyan\" type=\"button\">\r\n  Message Bliss\r\n<\/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 The Current 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\nwindow.tc2JourneyV7.render =\r\n  renderJourney;\r\n\r\nwindow.tc2JourneyV7.setView =\r\n  setJourneyView;\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  return;\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 The Current 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 The Current 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   addJourneyItem(item);\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 The Current 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\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  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    addJourneyItem(item);\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      \"Bliss Travel Level 2 Required\",\r\n      \"Reserve With Bliss is available with Bliss Travel 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 The Current 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 The Current 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(\r\n  item,\r\n  button\r\n){\r\n\r\n  if(!item){\r\n    return;\r\n  }\r\n\r\n\r\n  const id =\r\n    journeyItemID(item);\r\n\r\n\r\n  if(\r\n  typeof window.BlissOpenJourneyConfirmPopup ===\r\n  \"function\"\r\n){\r\n\r\n  window.BlissOpenJourneyConfirmPopup(\r\n    button,\r\n    [item],\r\n    id\r\n  );\r\n\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,\",\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 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\nsetJourneyView(\"dashboard\");\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\r\n  if(\r\n    window.BlissConnectedLocalServices &#038;&#038;\r\n    typeof window.BlissConnectedLocalServices.refresh === \"function\"\r\n  ){\r\n    window.BlissConnectedLocalServices.refresh();\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  tiLoadForm();\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\nconst journeyWebsiteButton = event.target.closest(\r\n  \"[data-journey-website]\"\r\n);\r\n\r\nif(journeyWebsiteButton){\r\n\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\r\n\/* ---------- JOURNEY RESERVATION ---------- *\/\r\nconst journeyReserveButton =\r\n  event.target.closest(\r\n    \"[data-journey-reserve]\"\r\n  );\r\n\r\nif(journeyReserveButton){\r\n\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    journeyReserveButton\r\n  );\r\n\r\n  return;\r\n}\r\n\r\n\r\n\/* ---------- JOURNEY MESSAGES ---------- *\/\r\nconst journeyMessageButton =\r\n  event.target.closest(\r\n    \"[data-journey-message]\"\r\n  );\r\n\r\nif(journeyMessageButton){\r\n\r\n  event.preventDefault();\r\n  event.stopPropagation();\r\n\r\n  const journeyId =\r\n    journeyMessageButton.getAttribute(\r\n      \"data-journey-message\"\r\n    );\r\n\r\n  if(\r\n    window.BlissMemberConciergeChat &#038;&#038;\r\n    typeof window.BlissMemberConciergeChat.openFor ===\r\n      \"function\"\r\n  ){\r\n\r\n    window.BlissMemberConciergeChat.openFor(\r\n      journeyId\r\n    );\r\n\r\n  }else{\r\n\r\n    alert(\r\n      \"Bliss Concierge messages are still loading. Please try again.\"\r\n    );\r\n\r\n  }\r\n\r\n  return;\r\n}\r\n\r\n},\r\ntrue\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\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\/password-reset\/?travelclub=1&#038;city=medayork\";\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(\/[&#038;<>\"']\/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 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 The Current 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    showTC2Page(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      showTC2Page(\"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    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       \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\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\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\r\n\r\n\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 &#038;&#038;\r\n      window.gggPmsData.urls &#038;&#038;\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 &#038;&#038;\r\n      window.gggPmsData.urls &#038;&#038;\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 &#038;&#038;\r\n      window.gggPmsData.urls &#038;&#038;\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:\"The Current 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\r\n  level =\r\n    Number(level) || 1;\r\n\r\n\r\n  \/*\r\n   * FAMILY JOURNEY\r\n   *\/\r\n  if(\r\n    window.BlissFamilyAccess &#038;&#038;\r\n    window.BlissFamilyAccess.active === true &#038;&#038;\r\n    Array.isArray(\r\n      window.BlissFamilyAccess.ownedLevels\r\n    )\r\n  ){\r\n\r\n    return window\r\n      .BlissFamilyAccess\r\n      .ownedLevels\r\n      .map(Number)\r\n      .includes(level);\r\n\r\n  }\r\n\r\n\r\n  \/*\r\n   * NORMAL TRAVEL CLUB\r\n   *\/\r\n  if(level <= 1){\r\n    return true;\r\n  }\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\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\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 Bliss Travel 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\nconst existingFamilyButton =\r\n  document.getElementById(\r\n    \"blissFamilyJourneyEntry\"\r\n  );\r\n\r\nlet familyActive = false;\r\n\r\ntry{\r\n\r\n  const familyMode =\r\n    sessionStorage.getItem(\r\n      \"BLISS_FAMILY_MODE_V1\"\r\n    ) === \"1\";\r\n\r\n  const tripCode =\r\n    sessionStorage.getItem(\r\n      \"BLISS_ACTIVE_FAMILY_TRIP_V1\"\r\n    ) || \"\";\r\n\r\n  const traveler =\r\n    JSON.parse(\r\n      sessionStorage.getItem(\r\n        \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\"\r\n      ) || \"null\"\r\n    );\r\n\r\n  const access =\r\n    JSON.parse(\r\n      sessionStorage.getItem(\r\n        \"BLISS_FAMILY_ACCESS_V1\"\r\n      ) || \"null\"\r\n    );\r\n\r\n  familyActive =\r\n    Boolean(\r\n      familyMode &&\r\n      tripCode &&\r\n      traveler &&\r\n      traveler.id &&\r\n      access &&\r\n      access.active === true\r\n    );\r\n\r\n}catch(error){\r\n\r\n  familyActive = false;\r\n\r\n}\r\n\r\n\r\nif(\r\n  overlay &&\r\n  !document.getElementById(\"blissTutorialEntry\")\r\n){\r\n\r\n  const tutorialButton =\r\n    document.createElement(\"button\");\r\n\r\n  tutorialButton.id =\r\n    \"blissTutorialEntry\";\r\n\r\n  tutorialButton.type =\r\n    \"button\";\r\n\r\n  tutorialButton.textContent =\r\n    \"\u25b6 Tutorial\";\r\n\r\n  tutorialButton.style.cssText = `\r\n    position:fixed;\r\n    top:126px;\r\n    right:18px;\r\n    z-index:2147483645;\r\n\r\n    min-height:42px;\r\n    padding:0 16px;\r\n\r\n    border:1px solid rgba(139,92,246,.38);\r\n    border-radius:999px;\r\n\r\n    background:rgba(5,17,34,.96);\r\n    color:#efe7ff;\r\n\r\n    font-weight:900;\r\n    font-size:10px;\r\n    text-transform:uppercase;\r\n\r\n    cursor:pointer;\r\n  `;\r\n\r\n\r\ntutorialButton.onclick = function(){\r\n\r\n  let menu =\r\n    document.getElementById(\"blissTutorialMenu\");\r\n\r\n  if(menu){\r\n    menu.style.display = \"flex\";\r\n    return;\r\n  }\r\n\r\n  const videos = [\r\n    [\"Welcome To Bliss Travel\",\"C_qk_pw9OGA\",\"_I-UxLexb8g\"],\r\n    [\"Create Account & Choose Your Level \",\"fZcIw3p3N0c\",\"_y6AJj1GInw\"],\r\n    [\"Upgrade Your Memebership\",\"uhTQW0ayHF4\",\"uwKcU8jDqkQ\"],\r\n    [\"Add to Your Current Journey\",\"LnbIhogC514\",\"kwq7QTAiV-g\"],\r\n    [\"Create a Family Journey\",\"OZxXJu_JqQg\",\"Hge_ZHdjFns\"],\r\n    [\"Explore Local Services\",\"3i_Hyr0V0rA\",\"m2Qf01hw-LM\"],\r\n    [\"Explore Travel Intelligence\",\"-ewfa99HcyE\",\"z5VE8ouTWeM\"],\r\n    [\"Reserve Your Journey & Message Concierge\",\"bvU0FLQBHP8\",\"8W98ovqC__Q\"]\r\n  ];\r\n\r\n  menu =\r\n    document.createElement(\"div\");\r\n\r\n  menu.id = \"blissTutorialMenu\";\r\n\r\n  menu.style.cssText = `\r\n    position:fixed;\r\n    inset:0;\r\n    z-index:2147483646;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    padding:20px;\r\n    background:rgba(0,0,0,.78);\r\n    backdrop-filter:blur(12px);\r\n  `;\r\n\r\n  menu.innerHTML = `\r\n    <div style=\"\r\n      width:min(94vw,760px);\r\n      max-height:90vh;\r\n      overflow:auto;\r\n      position:relative;\r\n      padding:28px;\r\n      border-radius:26px;\r\n      border:1px solid rgba(139,92,246,.35);\r\n      background:linear-gradient(180deg,#091126,#030712);\r\n      color:#fff;\r\n      box-shadow:0 30px 80px rgba(0,0,0,.6);\r\n    \">\r\n\r\n      <button\r\n        id=\"blissTutorialClose\"\r\n        type=\"button\"\r\n        style=\"\r\n          position:absolute;\r\n          top:14px;\r\n          right:14px;\r\n          width:38px;\r\n          height:38px;\r\n          border-radius:50%;\r\n          border:1px solid rgba(255,255,255,.12);\r\n          background:rgba(255,255,255,.06);\r\n          color:#fff;\r\n          cursor:pointer;\r\n        \"\r\n      >\u2715<\/button>\r\n\r\n      <div style=\"\r\n        color:#9eefff;\r\n        font-size:11px;\r\n        font-weight:900;\r\n        letter-spacing:.18em;\r\n      \">\r\n        BLISS TRAVEL\r\n      <\/div>\r\n\r\n      <h2 style=\"\r\n        margin:10px 45px 8px 0;\r\n        font-size:clamp(28px,5vw,44px);\r\n        line-height:1;\r\n      \">\r\n        Your Bliss Travel Guide\r\n      <\/h2>\r\n\r\n      <p style=\"\r\n        margin:0 0 22px;\r\n        color:rgba(255,255,255,.65);\r\n        line-height:1.6;\r\n      \">\r\n        Everything you need to explore Astro Travel,\r\n        unlock your levels, build your journey,\r\n        use local services, and reserve with Bliss.\r\n      <\/p>\r\n\r\n      <div id=\"blissTutorialVideos\"><\/div>\r\n\r\n    <\/div>\r\n  `;\r\n\r\n  overlay.appendChild(menu);\r\n\r\n  const list =\r\n    menu.querySelector(\"#blissTutorialVideos\");\r\n\r\n  list.innerHTML =\r\n    videos.map(function(video,index){\r\n      return `\r\n        <button\r\n          type=\"button\"\r\n          data-video-desktop=\"${video[1]}\"\r\ndata-video-mobile=\"${video[2] || video[1]}\"\r\n          style=\"\r\n            width:100%;\r\n            display:flex;\r\n            align-items:center;\r\n            gap:12px;\r\n            margin:8px 0;\r\n            padding:14px;\r\n            border-radius:15px;\r\n            border:1px solid rgba(255,255,255,.09);\r\n            background:rgba(255,255,255,.04);\r\n            color:#fff;\r\n            text-align:left;\r\n            cursor:pointer;\r\n          \"\r\n        >\r\n          <span style=\"color:#9eefff;font-weight:900;\">\r\n            ${String(index + 1).padStart(2,\"0\")}\r\n          <\/span>\r\n\r\n          <strong style=\"flex:1;\">\r\n            ${video[0]}\r\n          <\/strong>\r\n\r\n          <span>\u25b6<\/span>\r\n        <\/button>\r\n      `;\r\n    }).join(\"\");\r\n\r\n  menu.querySelector(\"#blissTutorialClose\")\r\n    .onclick = function(){\r\n      menu.style.display = \"none\";\r\n    };\r\n\r\n  list.onclick = function(event){\r\n\r\n  const button =\r\n    event.target.closest(\r\n      \"[data-video-desktop]\"\r\n    );\r\n\r\n  if(!button){\r\n    return;\r\n  }\r\n\r\n  const popup =\r\n    document.getElementById(\r\n      \"bx3VideoPopup\"\r\n    );\r\n\r\n  const frameWrap =\r\n    document.getElementById(\r\n      \"bx3VideoFrameWrap\"\r\n    );\r\n\r\n  if(!popup || !frameWrap){\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Detect an actual mobile\/touch device.\r\n   *\/\r\n  const isMobile =\r\n    \/Android|iPhone|iPad|iPod|Mobile\/i.test(\r\n      navigator.userAgent\r\n    ) ||\r\n    (\r\n      navigator.maxTouchPoints > 1 &&\r\n      window.innerWidth <= 1024\r\n    );\r\n\r\n  \/*\r\n   * Desktop = normal YouTube video.\r\n   * Mobile = YouTube Short.\r\n   *\/\r\n  const videoId =\r\n    isMobile\r\n      ? button.dataset.videoMobile\r\n      : button.dataset.videoDesktop;\r\n\r\n  menu.style.display = \"none\";\r\n\r\n  \/*\r\n   * IMPORTANT:\r\n   * Shorts need a vertical 9:16 player.\r\n   * Desktop videos need 16:9.\r\n   *\/\r\n  if(isMobile){\r\n\r\n    frameWrap.style.aspectRatio = \"9 \/ 16\";\r\n    frameWrap.style.width = \"min(88vw, 390px)\";\r\n    frameWrap.style.maxHeight = \"82vh\";\r\n    frameWrap.style.margin = \"0 auto\";\r\n\r\n    if(frameWrap.parentElement){\r\n      frameWrap.parentElement.style.width =\r\n        \"min(94vw, 430px)\";\r\n    }\r\n\r\n  }else{\r\n\r\n    frameWrap.style.aspectRatio = \"16 \/ 9\";\r\n    frameWrap.style.width = \"100%\";\r\n    frameWrap.style.maxHeight = \"none\";\r\n    frameWrap.style.margin = \"0\";\r\n\r\n    if(frameWrap.parentElement){\r\n      frameWrap.parentElement.style.width =\r\n        \"min(920px,96vw)\";\r\n    }\r\n\r\n  }\r\n\r\n  frameWrap.innerHTML = `\r\n    <iframe\r\n      src=\"https:\/\/www.youtube.com\/embed\/${videoId}?autoplay=1&#038;rel=0&#038;playsinline=1\"\r\n      title=\"Bliss Travel Tutorial\"\r\n      allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n      allowfullscreen\r\n      style=\"\r\n        display:block;\r\n        width:100%;\r\n        height:100%;\r\n        border:0;\r\n      \"\r\n    ><\/iframe>\r\n  `;\r\n\r\n  popup.style.display = \"flex\";\r\n\r\n  popup.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\r\n\r\n  document.documentElement.style.overflow =\r\n    \"hidden\";\r\n\r\n  document.body.style.overflow =\r\n    \"hidden\";\r\n};\r\n\r\n};\r\n\r\noverlay.appendChild(\r\n  tutorialButton\r\n);\r\n\r\n}\r\n\r\n\r\nif(\r\n  !familyActive &&\r\n  !existingFamilyButton &&\r\n  overlay\r\n){\r\n\r\n  const familyButton =\r\n    document.createElement(\"button\");\r\n\r\n  familyButton.id =\r\n    \"blissFamilyJourneyEntry\";\r\n\r\n  familyButton.type =\r\n    \"button\";\r\n\r\n  familyButton.textContent =\r\n    \"Family Journey\";\r\n\r\n  familyButton.style.cssText = `\r\n    position:fixed;\r\n    top:76px;\r\n    right:18px;\r\n    z-index:2147483645;\r\n    min-height:42px;\r\n    padding:0 16px;\r\n    border:1px solid rgba(83,243,255,.28);\r\n    border-radius:999px;\r\n    background:rgba(5,17,34,.96);\r\n    color:#dffaff;\r\n    font-weight:900;\r\n    font-size:10px;\r\n    text-transform:uppercase;\r\n    cursor:pointer;\r\n  `;\r\n\r\n  familyButton.onclick =\r\n    function(){\r\n\r\n      window.location.href =\r\n        \"https:\/\/godsgalaxygame.com\/GGG\/pisces\/?familyjourney=1\";\r\n\r\n    };\r\n\r\n  overlay.appendChild(\r\n    familyButton\r\n  );\r\n\r\n}\r\n\r\nif(\r\n  existingFamilyButton &&\r\n  familyActive\r\n){\r\n  existingFamilyButton.remove();\r\n}\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] 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\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\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    (\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership\r\n        .hasLevel === \"function\" &&\r\n      window.BlissTravelMembership\r\n        .hasLevel(item.level)\r\n    ) ||\r\n    (\r\n      tcAuthState.loggedIn &&\r\n      tcAuthState.owned[\r\n        item.level\r\n      ]\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 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    (\r\n      window.BlissTravelMembership &&\r\n      typeof window.BlissTravelMembership\r\n        .hasLevel === \"function\" &&\r\n      window.BlissTravelMembership\r\n        .hasLevel(requiredLevel)\r\n    ) ||\r\n    (\r\n      tcAuthState.loggedIn &&\r\n      tcAuthState.owned[\r\n        requiredLevel\r\n      ]\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] 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\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] 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] 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] The Current 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          \"The Current 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] 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\r\n<\/script>\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  (\r\n    url.searchParams.get(\"travelclub\") === \"1\" &&\r\n    url.searchParams.get(\"city\") === \"medayork\"\r\n  );\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        \"[Bliss Travel 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    console.log(\r\n      \"[Bliss Travel 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<style>\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<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<\/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\r\n  id=\"blissActivateHolo\"\r\n  class=\"blissActivate\"\r\n  type=\"button\"\r\n>\r\n  Activate Hologram\r\n<\/button>\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<\/div>\r\n\r\n<script>\r\nwindow.addEventListener(\"error\", function(event){\r\n\r\n  const message = [\r\n    \"BLISS JAVASCRIPT ERROR\",\r\n    \"\",\r\n    \"Message: \" + (event.message || \"Unknown error\"),\r\n    \"File: \" + (event.filename || \"Inline script\"),\r\n    \"Line: \" + (event.lineno || \"Unknown\"),\r\n    \"Column: \" + (event.colno || \"Unknown\")\r\n  ].join(\"\\n\");\r\n\r\n  console.error(message);\r\n\r\n  window.alert(message);\r\n\r\n});\r\n<\/script>\r\n\r\n<script>\r\n(function(){\r\n\r\n  const gate = document.getElementById('tcCityGate');\r\n\r\n  \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 || !dotsWrap) return;\r\n\r\nconst url =\r\n  new URL(window.location.href);\r\n\r\nconst travelClubActive =\r\n  url.searchParams.get(\"travelclub\") === \"1\";\r\n\r\nconst cityEntered =\r\n  url.searchParams.get(\"city\") === \"medayork\";\r\n\r\n\r\n\/*\r\n * NORMAL PASSWORD RESET PAGE\r\n * Hide the hologram completely.\r\n *\/\r\nif(!travelClubActive){\r\n\r\n  gate.classList.add(\r\n    \"tcCityGateHidden\"\r\n  );\r\n\r\n  return;\r\n}\r\n\r\n\r\n\/*\r\n * ALREADY ENTERED MEDAYORK\r\n * Hide hologram and allow Travel Club hero.\r\n *\/\r\nif(cityEntered){\r\n\r\n  gate.classList.add(\r\n    \"tcCityGateHidden\"\r\n  );\r\n\r\n  return;\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<!-- BLISS HERO SCROLL \u2014 CONNECTION RESTORE -->\r\n<script>\r\n(function(){\r\n\r\n  function connectHeroScroll(){\r\n\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\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(\r\n          0.78,\r\n          1 - p * 0.18\r\n        ).toFixed(3)\r\n      );\r\n\r\n      root.style.setProperty(\r\n        \"--tc2CopyOpacity\",\r\n        Math.max(\r\n          0,\r\n          1 - p * 0.88\r\n        ).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(\r\n          0.62,\r\n          1 - p * 0.16\r\n        ).toFixed(3)\r\n      );\r\n    }\r\n\r\n    function requestHeroUpdate(){\r\n\r\n      if(scheduled){\r\n        return;\r\n      }\r\n\r\n      scheduled = true;\r\n\r\n      requestAnimationFrame(\r\n        restoreHeroEffect\r\n      );\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] Hero scroll reconnected.\"\r\n    );\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      connectHeroScroll,\r\n      { once:true }\r\n    );\r\n\r\n  }else{\r\n\r\n    connectHeroScroll();\r\n\r\n  }\r\n\r\n  setTimeout(\r\n    connectHeroScroll,\r\n    500\r\n  );\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<!-- =========================================================\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 The Current 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 The Current 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        \"The Current 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 The Current 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 The Current 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 THE CURRENT 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\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\r\n<\/style>\r\n\r\n\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 = (function(){\r\n\r\n  try{\r\n\r\n    const cached =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          SESSION_CACHE_KEY\r\n        ) || \"[]\"\r\n      );\r\n\r\n    return Array.isArray(cached)\r\n      ? cached\r\n      : [];\r\n\r\n  }catch(error){\r\n\r\n    return [];\r\n\r\n  }\r\n\r\n})();\r\n\r\nlet 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 familyContext(){\r\n\r\n  try{\r\n\r\n    const access =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_FAMILY_ACCESS_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    const traveler =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    if(\r\n      !access ||\r\n      access.active !== true ||\r\n      !access.tripCode ||\r\n      !traveler ||\r\n      !traveler.id\r\n    ){\r\n      return null;\r\n    }\r\n\r\n    return {\r\n      access:access,\r\n      traveler:traveler,\r\n      tripCode:String(access.tripCode)\r\n    };\r\n\r\n  }catch(error){\r\n\r\n    return null;\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\nfunction canUseAccount(){\r\n\r\n  if(familyContext()){\r\n    return true;\r\n  }\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            : \"The Current Journey request failed.\";\r\n\r\n        throw new Error(message);\r\n\r\n      }\r\n\r\nreturn result.data || {};\r\n\r\n    });\r\n\r\n  }\r\n\r\n      function familyPost(action,payload){\r\n\r\n  const familyConfig =\r\n    window.BlissFamilyConfig || {};\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    familyConfig.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    familyConfig.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          : \"Family 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 THE CURRENT 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  const family =\r\n    familyContext();\r\n\r\n\r\n  \/*\r\n   * FAMILY JOURNEY\r\n   *\/\r\n  if(family){\r\n\r\n    if(\r\n      activeLoad &&\r\n      forceReload !== true\r\n    ){\r\n      return activeLoad;\r\n    }\r\n\r\n    activeLoad =\r\n      familyPost(\r\n        \"bliss_family_get_journey\",\r\n        {\r\n          tripCode:\r\n            family.tripCode,\r\n\r\n          trip_code:\r\n            family.tripCode\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\napplyAccountJourney(\r\n  items,\r\n  messages\r\n);\r\n\r\nreturn {\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 Family Journey] Load failed:\",\r\n          error\r\n        );\r\n\r\n        accountLoaded = false;\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   * NORMAL ACCOUNT JOURNEY\r\n   *\/\r\n  if(!canUseAccount()){\r\n\r\n    accountLoaded = false;\r\n\r\n    return new Promise(\r\n      function(resolve,reject){\r\n\r\n        let attempts = 0;\r\n\r\n        const waitForAccount =\r\n          setInterval(\r\n            function(){\r\n\r\n              attempts += 1;\r\n\r\n              if(canUseAccount()){\r\n\r\n                clearInterval(\r\n                  waitForAccount\r\n                );\r\n\r\n                loadAccountJourney(true)\r\n                  .then(resolve)\r\n                  .catch(reject);\r\n\r\n                return;\r\n              }\r\n\r\n              if(attempts >= 20){\r\n\r\n                clearInterval(\r\n                  waitForAccount\r\n                );\r\n\r\n                reject(\r\n                  new Error(\r\n                    \"The Journey account connection was not ready.\"\r\n                  )\r\n                );\r\n              }\r\n\r\n            },\r\n            250\r\n          );\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    activeLoad &&\r\n    forceReload !== true\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 = false;\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  const family =\r\n    familyContext();\r\n\r\n\r\n  \/*\r\n   * FAMILY JOURNEY\r\n   *\/\r\n  if(family){\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      return activeSave;\r\n    }\r\n\r\n    const itemsBeingSaved =\r\n      pendingSave.slice();\r\n\r\n    pendingSave = null;\r\n\r\n    const traveler =\r\n      family.traveler || {};\r\n\r\n    const familyItems =\r\n      itemsBeingSaved.map(\r\n        function(item){\r\n\r\n          return Object.assign(\r\n            {},\r\n            item,\r\n            {\r\n              familyTripCode:\r\n                family.tripCode,\r\n\r\n              savedByTravelerId:\r\n  item.savedByTravelerId ||\r\n  String(\r\n    traveler.id || \"\"\r\n  ),\r\n\r\nsavedByTravelerName:\r\n  item.savedByTravelerName ||\r\n  String(\r\n    traveler.name ||\r\n    \"Traveler\"\r\n  ),\r\n\r\nsavedByTravelerAvatar:\r\n  item.savedByTravelerAvatar ||\r\n  String(\r\n    traveler.avatar || \"\"\r\n  )\r\n            }\r\n          );\r\n\r\n        }\r\n      );\r\n\r\n    activeSave =\r\n      familyPost(\r\n        \"bliss_family_save_journey\",\r\n        {\r\n          tripCode:\r\n            family.tripCode,\r\n\r\n          trip_code:\r\n            family.tripCode,\r\n\r\n          items:\r\n            JSON.stringify(\r\n              familyItems\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            : familyItems;\r\n\r\n        applyAccountJourney(\r\n          finalItems,\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 Family Journey] Save failed:\",\r\n          error\r\n        );\r\n\r\n        \/*\r\n         * Reload the real server copy\r\n         * if permanent save failed.\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   * NORMAL ACCOUNT JOURNEY\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 Bliss Travel 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    return activeSave;\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      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 The Current 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  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\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  let activeView = \"dashboard\";\r\n\r\nlet originalJourneyRenderer = null;\r\n\r\nif(window.tc2JourneyV7){\r\n\r\n  if(typeof window.tc2JourneyV7.render === \"function\"){\r\n    originalJourneyRenderer =\r\n      window.tc2JourneyV7.render;\r\n  }\r\n\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 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\r\n  if(typeof originalJourneyRenderer === \"function\"){\r\n    originalJourneyRenderer();\r\n  }\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.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\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\r\n(function () {\r\n  \"use strict\";\r\n\r\n  let submissionInProgress = false;\r\n\r\n  function getConfig() {\r\n  const base =\r\n    window.BlissJourneyMemberConfig || {};\r\n\r\n  const pms =\r\n    window.gggPmsData || {};\r\n\r\n  const loggedIn =\r\n    Object.prototype.hasOwnProperty.call(\r\n      pms,\r\n      \"loggedIn\"\r\n    )\r\n      ? Boolean(pms.loggedIn)\r\n      : Boolean(base.loggedIn);\r\n\r\n  const userId =\r\n    pms.userId ||\r\n    base.userId ||\r\n    0;\r\n\r\n  let hasLevel2 =\r\n    Boolean(base.hasLevel2);\r\n\r\n  if(\r\n    window.BlissTravelMembership &&\r\n    typeof window.BlissTravelMembership.hasLevel === \"function\"\r\n  ){\r\n    try{\r\n      hasLevel2 =\r\n        window.BlissTravelMembership.hasLevel(2);\r\n    }catch(error){}\r\n  }else if(pms.owned){\r\n    if(Array.isArray(pms.owned)){\r\n      hasLevel2 =\r\n        pms.owned.includes(2) ||\r\n        pms.owned.includes(\"2\");\r\n    }else{\r\n      hasLevel2 =\r\n        Boolean(\r\n          pms.owned[2] ||\r\n          pms.owned[\"2\"]\r\n        );\r\n    }\r\n  }\r\n\r\n  return Object.assign(\r\n    {},\r\n    base,\r\n    {\r\n      loggedIn:loggedIn,\r\n      userId:userId,\r\n      hasLevel2:hasLevel2\r\n    }\r\n  );\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\nlet pendingJourneySubmitButton = null;\r\nlet pendingJourneyItemId = \"\";\r\n\r\nfunction openJourneyConfirmPopup(\r\n  button,\r\n  journeyItems,\r\n  journeyItemId\r\n){\r\n\r\n  const modal =\r\n    document.getElementById(\r\n      \"tc2JourneyConfirmModal\"\r\n    );\r\n\r\n  const summary =\r\n    document.getElementById(\r\n      \"tc2JourneyConfirmSummary\"\r\n    );\r\n\r\n  const confirmButton =\r\n    document.getElementById(\r\n      \"tc2ConfirmJourneySend\"\r\n    );\r\n\r\n  if(!modal){\r\n    return;\r\n  }\r\n\r\n  pendingJourneySubmitButton =\r\n    button;\r\n\r\n  pendingJourneyItemId =\r\n    journeyItemId\r\n      ? String(journeyItemId)\r\n      : \"\";\r\n\r\n\r\n  const total =\r\n    Array.isArray(journeyItems)\r\n      ? journeyItems.length\r\n      : 0;\r\n\r\n\r\n  if(summary){\r\n\r\n    if(pendingJourneyItemId){\r\n\r\n      const item =\r\n        journeyItems[0] || {};\r\n\r\n      summary.textContent =\r\n        \"Only \" +\r\n        String(\r\n          item.title ||\r\n          \"this Journey item\"\r\n        ) +\r\n        \" will be sent to Bliss Concierge.\";\r\n\r\n    }else{\r\n\r\n      summary.textContent =\r\n        total +\r\n        \" Journey item\" +\r\n        (total === 1 ? \"\" : \"s\") +\r\n        \" will be sent to Bliss Concierge.\";\r\n\r\n    }\r\n  }\r\n\r\n\r\n  if(confirmButton){\r\n\r\n    confirmButton.textContent =\r\n      pendingJourneyItemId\r\n        ? \"Confirm & Send This Reservation\"\r\n        : \"Confirm & Send The Current Journey\";\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\nwindow.BlissOpenJourneyConfirmPopup =\r\n  openJourneyConfirmPopup;\r\n\r\nfunction closeJourneyConfirmPopup() {\r\n  const modal =\r\n    document.getElementById(\"tc2JourneyConfirmModal\");\r\n\r\n  if (!modal) {\r\n    return;\r\n  }\r\n\r\n  modal.classList.remove(\"open\");\r\n  modal.setAttribute(\"aria-hidden\", \"true\");\r\n}\r\n\r\n  async function submitFullJourney(button, confirmed) {\r\n\r\n  if (submissionInProgress) {\r\n    return;\r\n  }\r\n\r\n  const config =\r\n    getConfig();\r\n\r\n  let family = null;\r\n\r\n  try {\r\n\r\n    const access =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_FAMILY_ACCESS_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    const traveler =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    if(\r\n  !access ||\r\n  access.active !== true ||\r\n  !access.tripCode ||\r\n  !traveler ||\r\n  !traveler.id\r\n){\r\n  family = null;\r\n}else{\r\n\r\n  family = {\r\n    access: access,\r\n    traveler: traveler,\r\n    tripCode: String(\r\n      access.tripCode\r\n    )\r\n  };\r\n\r\n    }\r\n\r\n  }catch(error){\r\n    family = null;\r\n  }\r\n\r\n\r\n  \/*\r\n   * NORMAL MEMBER:\r\n   * must be signed into WordPress.\r\n   *\r\n   * FAMILY JOURNEY:\r\n   * valid Family session replaces normal login.\r\n   *\/\r\n  if(\r\n    !family &&\r\n    !config.loggedIn\r\n  ){\r\n    showJourneyMessage(\r\n      \"Please sign in before sending your Journey to Bliss.\",\r\n      \"error\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  \/*\r\n   * Only normal member submission uses\r\n   * the regular member Level 2 check here.\r\n   *\r\n   * Family access is verified server-side\r\n   * against the Family Journey owner's levels.\r\n   *\/\r\n  if(\r\n    !family &&\r\n    !config.hasLevel2\r\n  ){\r\n    showJourneyMessage(\r\n      \"Sending your Journey to Concierge requires Bliss Travel Level 2.\",\r\n      \"error\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  const familyConfig =\r\n    window.BlissFamilyConfig || {};\r\n\r\n\r\n  \/*\r\n   * Confirm the correct AJAX connection exists.\r\n   *\/\r\n  if(family){\r\n\r\n    if(\r\n      !familyConfig.ajaxUrl ||\r\n      !familyConfig.nonce\r\n    ){\r\n      showJourneyMessage(\r\n        \"The Family Journey connection is unavailable. Please refresh the page and try again.\",\r\n        \"error\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n  }else{\r\n\r\n    if(\r\n      !config.ajaxUrl ||\r\n      !config.nonce\r\n    ){\r\n      showJourneyMessage(\r\n        \"The Journey connection is unavailable. Please refresh the page and try again.\",\r\n        \"error\"\r\n      );\r\n\r\n      return;\r\n    }\r\n  }\r\n\r\n\r\n  const journeyItems =\r\n    window.BlissJourneyAccount &&\r\n    typeof window.BlissJourneyAccount.read ===\r\n      \"function\"\r\n      ? window.BlissJourneyAccount.read()\r\n      : [];\r\n\r\n\r\n  if(\r\n    !Array.isArray(journeyItems) ||\r\n    journeyItems.length === 0\r\n  ){\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\r\n    return;\r\n  }\r\n\r\n\r\n  if(confirmed !== true){\r\n\r\n    openJourneyConfirmPopup(\r\n      button,\r\n      journeyItems\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  const arrivalDate =\r\n    document\r\n      .getElementById(\r\n        \"tc2JourneyArrivalDate\"\r\n      )\r\n      .value;\r\n\r\n\r\n  const departureDate =\r\n    document\r\n      .getElementById(\r\n        \"tc2JourneyDepartureDate\"\r\n      )\r\n      .value;\r\n\r\n\r\n  const travelers =\r\n    document\r\n      .getElementById(\r\n        \"tc2JourneyTravelers\"\r\n      )\r\n      .value;\r\n\r\n\r\n  const generalMessage =\r\n    document\r\n      .getElementById(\r\n        \"tc2JourneyGeneralMessage\"\r\n      )\r\n      .value\r\n      .trim();\r\n\r\n\r\n  if(\r\n    !arrivalDate ||\r\n    !departureDate\r\n  ){\r\n    showJourneyMessage(\r\n      \"Please enter both the arrival and departure dates.\",\r\n      \"error\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  if(\r\n    departureDate <\r\n    arrivalDate\r\n  ){\r\n    showJourneyMessage(\r\n      \"The departure date cannot be before the arrival date.\",\r\n      \"error\"\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  submissionInProgress = true;\r\n\r\n  setButtonLoading(\r\n    button,\r\n    true\r\n  );\r\n\r\n\r\n  try {\r\n\r\n    const body =\r\n      new URLSearchParams();\r\n\r\n\r\n    \/*\r\n     * =====================================================\r\n     * FAMILY JOURNEY SUBMISSION\r\n     * =====================================================\r\n     *\/\r\n\r\n    if(family){\r\n\r\n      body.set(\r\n        \"action\",\r\n        \"bliss_family_submit_full_journey\"\r\n      );\r\n\r\n      body.set(\r\n        \"nonce\",\r\n        familyConfig.nonce\r\n      );\r\n\r\n      body.set(\r\n        \"tripCode\",\r\n        family.tripCode\r\n      );\r\n\r\n      body.set(\r\n        \"trip_code\",\r\n        family.tripCode\r\n      );\r\n\r\n      body.set(\r\n        \"traveler_id\",\r\n        String(\r\n          family.traveler.id ||\r\n          \"\"\r\n        )\r\n      );\r\n\r\n      body.set(\r\n        \"traveler_name\",\r\n        String(\r\n          family.traveler.name ||\r\n          \"Family Traveler\"\r\n        )\r\n      );\r\n\r\n      body.set(\r\n        \"traveler_avatar\",\r\n        String(\r\n          family.traveler.avatar ||\r\n          \"\"\r\n        )\r\n      );\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * =====================================================\r\n     * NORMAL MEMBER SUBMISSION\r\n     * =====================================================\r\n     *\/\r\n\r\n    else{\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\r\n\r\n    \/*\r\n     * Shared Journey information.\r\n     *\/\r\n    body.set(\r\n      \"arrival_date\",\r\n      arrivalDate\r\n    );\r\n\r\n    body.set(\r\n      \"departure_date\",\r\n      departureDate\r\n    );\r\n\r\n    body.set(\r\n      \"travelers\",\r\n      travelers\r\n    );\r\n\r\n    body.set(\r\n      \"general_message\",\r\n      generalMessage\r\n    );\r\n\r\nif(pendingJourneyItemId){\r\n\r\n  body.set(\r\n    \"journey_id\",\r\n    pendingJourneyItemId\r\n  );\r\n}\r\n\r\n    const ajaxUrl =\r\n      family\r\n        ? familyConfig.ajaxUrl\r\n        : config.ajaxUrl;\r\n\r\n\r\n    const response =\r\n      await fetch(\r\n        ajaxUrl,\r\n        {\r\n          method:\"POST\",\r\n\r\n          credentials:\r\n            \"same-origin\",\r\n\r\n          headers:{\r\n            \"Content-Type\":\r\n              \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n          },\r\n\r\n          body:\r\n            body.toString()\r\n        }\r\n      );\r\n\r\n\r\n    const result =\r\n      await response.json();\r\n\r\n\r\n    if(\r\n      !response.ok ||\r\n      !result ||\r\n      result.success !== true\r\n    ){\r\n\r\n      let errorMessage =\r\n        family\r\n          ? \"Your Family Journey could not be sent to Bliss.\"\r\n          : \"Your Journey could not be sent to Bliss.\";\r\n\r\n\r\n      if(result){\r\n\r\n  if(result.data){\r\n\r\n    if(result.data.message){\r\n\r\n      errorMessage =\r\n        result.data.message;\r\n\r\n    }\r\n  }\r\n}\r\n\r\n\r\n      throw new Error(\r\n        errorMessage\r\n      );\r\n    }\r\n\r\n\r\n    const data =\r\n      result.data || {};\r\n\r\n\r\n   if(window.BlissJourneyAccount){\r\n\r\n  if(\r\n    typeof window.BlissJourneyAccount.load ===\r\n      \"function\"\r\n  ){\r\n\r\n    await window.BlissJourneyAccount.load(\r\n      true\r\n    );\r\n\r\n  }\r\n}\r\n\r\n\r\n    window.dispatchEvent(\r\n      new CustomEvent(\r\n        \"blissJourneySubmitted\",\r\n        {\r\n          detail:\r\n            data\r\n        }\r\n      )\r\n    );\r\n\r\n\r\n    closeJourneyConfirmPopup();\r\n\r\n\r\n    showJourneyMessage(\r\n      data.message ||\r\n      (\r\n        family\r\n          ? \"Your Family Journey was sent to Bliss Concierge.\"\r\n          : \"Your full Journey was sent to Bliss. Our Concierge team can now review your requests.\"\r\n      ),\r\n      \"success\"\r\n    );\r\n\r\n\r\n    button.textContent =\r\n      \"Journey Sent to Bliss\";\r\n\r\n    button.disabled =\r\n      true;\r\n\r\n    button.setAttribute(\r\n      \"data-journey-submitted\",\r\n      \"true\"\r\n    );\r\n\r\n\r\n  }catch(error){\r\n\r\n    console.error(\r\n      \"BLISS FULL JOURNEY SUBMISSION ERROR:\",\r\n      error\r\n    );\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\r\n    setButtonLoading(\r\n      button,\r\n      false\r\n    );\r\n\r\n  }finally{\r\n\r\n    submissionInProgress =\r\n      false;\r\n  }\r\n}\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function (event) {\r\n\r\n  const confirmJourneyButton =\r\n  typeof event.target.closest === \"function\"\r\n    ? event.target.closest(\r\n        \"#tc2ConfirmJourneySend\"\r\n      )\r\n    : null;\r\n\r\n\r\n  if (confirmJourneyButton) {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    submitFullJourney(\r\n      pendingJourneySubmitButton ||\r\n      confirmJourneyButton,\r\n      true\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n  const cancelJourneyButton =\r\n  typeof event.target.closest === \"function\"\r\n    ? event.target.closest(\r\n        \"#tc2CancelJourneySend\"\r\n      )\r\n    : null;\r\n\r\n  if (cancelJourneyButton) {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    closeJourneyConfirmPopup();\r\n\r\n    return;\r\n  }\r\n\r\n  let button =\r\n  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\nif (!button) {\r\n  if (typeof event.target.closest === \"function\") {\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\r\nif (!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\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 The Current 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\/* Hide the old Local Services request form *\/\r\n#tc2ServiceTypeChip,\r\n#tc2ServiceAttachChip,\r\n#tc2ServiceLocation,\r\n#tc2ServiceDate,\r\n#tc2ServiceTime,\r\n#tc2ServiceGuests,\r\n#tc2ServiceShortNotes,\r\n#tc2ServiceNotes,\r\n#tc2AddServiceBtn,\r\n#tc2ServiceWhatsAppBtn{\r\n  display:none !important;\r\n}\r\n\r\n\/* Hide the rows and fields containing those controls *\/\r\n#tc2ServiceLocation.closest,\r\n#tc2ServiceDate.closest{\r\n  display:none !important;\r\n}\r\n\r\n\/*\r\n * Hide the complete old controls area while keeping\r\n * #tc2ServicesGrid and #tc2ServicePreview visible.\r\n *\/\r\n#tc2ServicesGrid + .tc2-chipRow,\r\n#tc2ServicesGrid + .tc2-chipRow ~ .tc2-formGrid,\r\n#tc2ServicesGrid + .tc2-chipRow ~ .tc2-field,\r\n#tc2ServicesGrid + .tc2-chipRow ~ .tc2-btnRow{\r\n  display:none !important;\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\/* =========================================================\r\n   SERVICE REQUEST OPTIONS\r\n========================================================= *\/\r\n\r\n.bliss-request-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-request-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-request-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-request-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-request-grid{\r\n  display:grid;\r\n  grid-template-columns:\r\n    repeat(auto-fit,minmax(210px,1fr));\r\n  gap:12px;\r\n}\r\n\r\n.bliss-request-option{\r\n  appearance:none;\r\n  width:100%;\r\n  min-height:95px;\r\n  padding:16px;\r\n  border-radius:20px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  background:\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  transition:\r\n    transform .22s ease,\r\n    border-color .22s ease,\r\n    box-shadow .22s ease;\r\n}\r\n\r\n.bliss-request-option:hover,\r\n.bliss-request-option.is-selected{\r\n  transform:translateY(-3px);\r\n  border-color:rgba(83,243,255,.72);\r\n  box-shadow:0 0 20px rgba(83,243,255,.13);\r\n}\r\n\r\n.bliss-request-option strong{\r\n  display:block;\r\n  margin-bottom:7px;\r\n  color:#fff;\r\n  font-size:.94rem;\r\n}\r\n\r\n.bliss-request-option span{\r\n  color:rgba(248,251,255,.58);\r\n  font-size:.75rem;\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\nconst SERVICE_REQUESTS = {\r\n\r\n  \"Private Driver\": [\r\n    \"Airport Pickup\",\r\n    \"Airport Drop-Off\",\r\n    \"Private City Driver\",\r\n    \"Full-Day Private Driver\",\r\n    \"Driver to Climbing Activity\",\r\n    \"Driver to Riverwalk\",\r\n    \"Driver to Tree-Planting Activity\",\r\n    \"Driver to Sunset Location\",\r\n    \"Driver to Art Experience\",\r\n    \"Driver to Fashion Experience\",\r\n    \"Driver to Sculpture Experience\",\r\n    \"Driver to Music Experience\",\r\n    \"Driver to Cultural Exhibition\",\r\n    \"Night Driver\",\r\n    \"VIP Chauffeur\",\r\n    \"Custom Transportation Request\"\r\n  ],\r\n\r\n  \"Concierge\": [\r\n    \"Turn On AC\",\r\n    \"Turn Off AC Reminder\",\r\n    \"AC Needs Attention\",\r\n    \"AC Recommendation\",\r\n    \"Prepare Jacuzzi\",\r\n    \"Turn Off Jacuzzi Reminder\",\r\n    \"Jacuzzi Needs Attention\",\r\n    \"Jacuzzi Recommendation\",\r\n    \"Prepare Car\",\r\n    \"Turn Off Car Reminder\",\r\n    \"Car Needs Attention\",\r\n    \"Transportation Recommendation\",\r\n    \"Turn On Lights\",\r\n    \"Turn Off Lights Reminder\",\r\n    \"Lights Need Attention\",\r\n    \"Lighting Recommendation\",\r\n    \"Arrival Preparation\",\r\n    \"Accommodation Setup\",\r\n    \"Activity Coordination\",\r\n    \"Local Recommendation\",\r\n    \"Event Coordination\",\r\n    \"Personal Assistance\",\r\n    \"Custom Concierge Request\"\r\n  ],\r\n\r\n  \"Translator\": [\r\n    \"Live Translator\",\r\n    \"Online Translator\",\r\n    \"Personalized Language Help\",\r\n    \"Local Idioms and Expressions\",\r\n    \"Cultural Interpretation\",\r\n    \"Exhibition Translation\",\r\n    \"Appointment Translation\",\r\n    \"Business Translation\",\r\n    \"Medical Appointment Translation\",\r\n    \"Custom Translation Request\"\r\n  ],\r\n\r\n  \"Local Guide\": [\r\n    \"Nature Guide\",\r\n    \"Cultural Guide\",\r\n    \"History Guide\",\r\n    \"Neighborhood Guide\",\r\n    \"Food Guide\",\r\n    \"Climbing Guide\",\r\n    \"Riverwalk Guide\",\r\n    \"Tree-Planting Guide\",\r\n    \"Sunset Guide\",\r\n    \"Art Guide\",\r\n    \"Fashion Guide\",\r\n    \"Sculpture Guide\",\r\n    \"Music Guide\",\r\n    \"Indigenous Heritage Guide\",\r\n    \"Legends and Folklore Guide\",\r\n    \"Local Idioms Guide\",\r\n    \"Private Local Guide\",\r\n    \"Custom Local Guide Request\"\r\n  ],\r\n\r\n  \"Nightlife Help\": [\r\n    \"Nightlife Guide\",\r\n    \"Club Recommendation\",\r\n    \"Table and Club Access\",\r\n    \"Live Music Night\",\r\n    \"Music Venue Help\",\r\n    \"Rooftop Experience\",\r\n    \"Fashion and Evening Event\",\r\n    \"Night Driver Coordination\",\r\n    \"Safe Night Movement\",\r\n    \"Private Nightlife Experience\",\r\n    \"Custom Nightlife Request\"\r\n  ],\r\n\r\n  \"Reservations\": [\r\n    \"Restaurant Reservation\",\r\n    \"Rooftop Reservation\",\r\n    \"Attraction Tickets\",\r\n    \"Cultural Exhibition\",\r\n    \"History Exhibition\",\r\n    \"Indigenous Culture Exhibition\",\r\n    \"Legends and Folklore Exhibition\",\r\n    \"Climbing Activity\",\r\n    \"Riverwalk Activity\",\r\n    \"Tree-Planting Experience\",\r\n    \"Sunset Experience\",\r\n    \"Live Art Lesson\",\r\n    \"Art Experience\",\r\n    \"Live Fashion Experience\",\r\n    \"Fashion Experience\",\r\n    \"Live Sculpture Lesson\",\r\n    \"Sculpture Experience\",\r\n    \"Live Music Lesson\",\r\n    \"Music Experience\",\r\n    \"Live Class or Workshop\",\r\n    \"Private Experience\",\r\n    \"Custom Reservation Request\"\r\n  ],\r\n\r\n  \"Security Support\": [\r\n    \"Discreet Escort\",\r\n    \"Personal Protection\",\r\n    \"Transportation Security\",\r\n    \"Outdoor Activity Security\",\r\n    \"Climbing Activity Security\",\r\n    \"Nightlife Security\",\r\n    \"VIP Event Security\",\r\n    \"Private Event Security\",\r\n    \"Safe Arrival Support\",\r\n    \"Custom Security Request\"\r\n  ],\r\n\r\n  \"VIP Custom Support\": [\r\n    \"VIP Climbing Experience\",\r\n    \"VIP Riverwalk Experience\",\r\n    \"VIP Tree-Planting Experience\",\r\n    \"VIP Sunset Setup\",\r\n    \"VIP Art Experience\",\r\n    \"VIP Fashion Experience\",\r\n    \"VIP Sculpture Experience\",\r\n    \"VIP Music Experience\",\r\n    \"VIP Cultural Experience\",\r\n    \"Private Celebration Setup\",\r\n    \"Surprise Experience\",\r\n    \"Romantic Setup\",\r\n    \"Private Event Coordination\",\r\n    \"Custom VIP Request\"\r\n  ]\r\n\r\n};\r\n\r\n  let selectedService = \"\";\r\nlet selectedRequest = \"\";\r\nlet 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  ![\"http:\",\"https:\"].includes(url.protocol)\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\nfunction requestNameFromHost(host){\r\n\r\n  if(!host){\r\n    return \"\";\r\n  }\r\n\r\n  return String(\r\n    host.serviceRequest ||\r\n    host.request ||\r\n    host.option ||\r\n    host.suboption ||\r\n    \"\"\r\n  ).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\r\n  const requestedService =\r\n    normalize(serviceName);\r\n\r\n  return readServerProviders()\r\n    .filter(function(host){\r\n\r\n      return (\r\n        normalize(\r\n          serviceNameFromHost(host)\r\n        ) === requestedService\r\n      );\r\n\r\n    });\r\n}\r\n\r\nfunction providersForRequest(\r\n  serviceName,\r\n  requestName\r\n){\r\n\r\n  const requestedService =\r\n    normalize(serviceName);\r\n\r\n  const requestedRequest =\r\n    normalize(requestName);\r\n\r\n  return readServerProviders()\r\n    .filter(function(host){\r\n\r\n      const hostService =\r\n        normalize(\r\n          serviceNameFromHost(host)\r\n        );\r\n\r\n      const hostRequest =\r\n        normalize(\r\n          requestNameFromHost(host)\r\n        );\r\n\r\n      return (\r\n        hostService === requestedService &&\r\n        hostRequest === requestedRequest\r\n      );\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\nfunction requestOptionsForService(serviceName){\r\n\r\n  const direct =\r\n    SERVICE_REQUESTS[serviceName];\r\n\r\n  if(Array.isArray(direct)){\r\n    return direct;\r\n  }\r\n\r\n  const matchingKey =\r\n    Object.keys(SERVICE_REQUESTS)\r\n      .find(function(key){\r\n        return (\r\n          normalize(key) ===\r\n          normalize(serviceName)\r\n        );\r\n      });\r\n\r\n  return matchingKey\r\n    ? SERVICE_REQUESTS[matchingKey]\r\n    : [];\r\n}\r\n\r\nfunction requestOptionHTML(requestName){\r\n\r\n  const providers =\r\n    providersForRequest(\r\n      selectedService,\r\n      requestName\r\n    );\r\n\r\n  const selected =\r\n    normalize(selectedRequest) ===\r\n    normalize(requestName);\r\n\r\n  return `\r\n    <button\r\n      class=\"bliss-request-option ${\r\n        selected ? \"is-selected\" : \"\"\r\n      }\"\r\n      data-bliss-request-option=\"${\r\n        escapeHTML(requestName)\r\n      }\"\r\n      type=\"button\">\r\n\r\n      <strong>\r\n        ${escapeHTML(requestName)}\r\n      <\/strong>\r\n\r\n      <span>\r\n        ${\r\n          providers.length === 1\r\n            ? \"1 connected host\"\r\n            : providers.length +\r\n              \" connected hosts\"\r\n        }\r\n      <\/span>\r\n\r\n    <\/button>\r\n  `;\r\n}\r\n\r\nfunction renderRequestOptions(serviceName){\r\n\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  selectedRequest = \"\";\r\n\r\n  renderServiceOptions();\r\n\r\n  const requests =\r\n    requestOptionsForService(\r\n      selectedService\r\n    );\r\n\r\n  preview.classList.add(\r\n    \"bliss-provider-preview\"\r\n  );\r\n\r\n  if(!requests.length){\r\n\r\n    preview.innerHTML = `\r\n      <div class=\"bliss-service-empty\">\r\n\r\n        <h3>\r\n          ${escapeHTML(selectedService)}\r\n        <\/h3>\r\n\r\n        <p>\r\n          No request options are connected to this\r\n          Local Service yet.\r\n        <\/p>\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    return;\r\n  }\r\n\r\n  preview.innerHTML = `\r\n    <div class=\"bliss-request-heading\">\r\n\r\n      <span>\r\n        Choose what you need\r\n      <\/span>\r\n\r\n      <h3>\r\n        ${escapeHTML(selectedService)}\r\n      <\/h3>\r\n\r\n      <p>\r\n        Select one option to see all hosts connected\r\n        through the Control Panel.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bliss-request-grid\">\r\n      ${requests.map(requestOptionHTML).join(\"\")}\r\n    <\/div>\r\n  `;\r\n\r\n\/* MOBILE: move user to Service Preview *\/\r\nif(window.innerWidth <= 760){\r\n  setTimeout(function(){\r\n    preview.scrollIntoView({\r\n      behavior:\"smooth\",\r\n      block:\"start\"\r\n    });\r\n  },100);\r\n}\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  ){\r\n    if(host.images.length){\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){\r\n        if(first.url){\r\n          return first.url;\r\n        }\r\n      }\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              Send to The Current Journey\r\n            <\/button>\r\n\r\n          <\/div>\r\n        <\/div>\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function renderProviders(\r\n  serviceName,\r\n  requestName\r\n){\r\n\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  selectedRequest =\r\n    String(requestName || \"\").trim();\r\n\r\n  renderServiceOptions();\r\n\r\n  const providers =\r\n    providersForRequest(\r\n      selectedService,\r\n      selectedRequest\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\r\n    preview.innerHTML = `\r\n      <div class=\"bliss-provider-heading\">\r\n\r\n        <span>\r\n          ${escapeHTML(selectedService)}\r\n        <\/span>\r\n\r\n        <h3>\r\n          ${escapeHTML(selectedRequest)}\r\n        <\/h3>\r\n\r\n        <p>\r\n          No host is currently connected to this option.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bliss-service-empty\">\r\n\r\n        <h3>\r\n          Host coming soon\r\n        <\/h3>\r\n\r\n        <p>\r\n          This option remains available in Local Services.\r\n          Add a host in the Control Panel using this exact\r\n          service and request option.\r\n        <\/p>\r\n\r\n      <\/div>\r\n    `;\r\n\r\n    return;\r\n  }\r\n\r\n  preview.innerHTML = `\r\n    <div class=\"bliss-provider-heading\">\r\n\r\n      <span>\r\n        ${escapeHTML(selectedService)}\r\n      <\/span>\r\n\r\n      <h3>\r\n        ${escapeHTML(selectedRequest)}\r\n      <\/h3>\r\n\r\n      <p>\r\n        ${\r\n          providers.length === 1\r\n            ? \"1 connected host is available.\"\r\n            : providers.length +\r\n              \" connected hosts are available.\"\r\n        }\r\n        Visit the host website or send the complete\r\n        selection to The Current Journey.\r\n      <\/p>\r\n\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\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     THE CURRENT 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\nconst serviceRequest =\r\n  requestNameFromHost(host) ||\r\n  selectedRequest ||\r\n  \"\";\r\n\r\n    const requested =\r\n      status === \"Requested\";\r\n\r\n    return {\r\n      journeyId:\r\n  [\r\n    \"service-host\",\r\n    normalize(service),\r\n    normalize(serviceRequest),\r\n    providerID(host)\r\n  ].join(\"|\"),\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\nserviceRequest:\r\n  serviceRequest,\r\n\r\nrequest:\r\n  serviceRequest,\r\n\r\noption:\r\n  serviceRequest,\r\n\r\nsuboption:\r\n  serviceRequest,\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  [\r\n    serviceRequest\r\n      ? \"Request: \" + serviceRequest\r\n      : \"\",\r\n\r\n    host.description ||\r\n    host.desc ||\r\n    host.shortExplanation ||\r\n    service +\r\n      \" host connected through Local Services.\"\r\n  ]\r\n  .filter(Boolean)\r\n  .join(\" \u00b7 \"),\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 The Current Journey.\"\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n     \r\n\r\n      showMessage(\r\n        \"Saved to The Current 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        \"Bliss Travel Level 2 Required\",\r\n        \"Reserve With Bliss is available with Bliss Travel 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 The Current 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\r\n  event.preventDefault();\r\n  event.stopPropagation();\r\n  event.stopImmediatePropagation();\r\n\r\n  renderRequestOptions(\r\n    serviceButton.getAttribute(\r\n      \"data-bliss-service-option\"\r\n    )\r\n  );\r\n\r\n  return;\r\n}\r\n\r\nconst requestButton =\r\n  target.closest(\r\n    \"[data-bliss-request-option]\"\r\n  );\r\n\r\nif(requestButton){\r\n\r\n  event.preventDefault();\r\n  event.stopPropagation();\r\n  event.stopImmediatePropagation();\r\n\r\n  renderProviders(\r\n    selectedService,\r\n    requestButton.getAttribute(\r\n      \"data-bliss-request-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    },\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  requestNameFromHost(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(\r\n  selectedService &&\r\n  selectedRequest\r\n){\r\n\r\n  renderProviders(\r\n    selectedService,\r\n    selectedRequest\r\n  );\r\n\r\n}else if(selectedService){\r\n\r\n  renderRequestOptions(\r\n    selectedService\r\n  );\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\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  requests:\r\n    requestOptionsForService,\r\n\r\n  openService:\r\n    renderRequestOptions,\r\n\r\n  openRequest:\r\n    renderProviders\r\n\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\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 The Current 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 The Current 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 The Current 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. Preserves the popup's original Journey button connections.\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\/* Keep the popup card 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   THE CURRENT JOURNEY \u2014 SHOW COMPLETE HOST IMAGE\r\n========================================================= *\/\r\n\r\n\/*\r\n * Main account-driven The Current Journey renderer.\r\n *\r\n * \"contain\" shows the complete image without cutting off\r\n * the top, bottom, or sides.\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 applies the same image behavior if the older renderer\r\n * appears 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 * Keep only a soft lower gradient so the saved image\r\n * remains clearly 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 loading 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 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     * Move the original popup element into #tc2Overlay.\r\n     *\r\n     * This preserves:\r\n     * - Its original buttons\r\n     * - Its original event listeners\r\n     * - Its original private Journey button reference\r\n     * - Its existing submission connection\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 startRepair(){\r\n\r\n    \/*\r\n     * Complete immediately when both elements already exist.\r\n     *\/\r\n    if(movePopupInsideTravelClub()){\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * WordPress may finish inserting the Travel Club or\r\n     * concierge popup after this bottom repair loads.\r\n     *\r\n     * Retry briefly and stop as soon as the popup is moved.\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\nif(window.BlissExploreLevel3RescueLockV1){\r\n  return;\r\n}\r\n\r\nwindow.BlissExploreLevel3RescueLockV1 = true;\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\/*\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 TRAVEL CLUB\r\nCORE SIGN-IN + MAIN NAVIGATION REPAIR V1\r\n\r\nFIXES:\r\n1. Moves the existing Sign In button above the fullscreen overlay.\r\n2. Moves the existing authentication and membership modals inside it.\r\n3. Restores navigation for the main Travel Club cards.\r\n4. Does not bypass existing membership locks.\r\n========================================================= -->\r\n\r\n<style>\r\n\/* =========================================================\r\n   SIGN-IN BUTTON VISIBILITY\r\n========================================================= *\/\r\n\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\r\n  z-index:2147483647 !important;\r\n\r\n  visibility:visible !important;\r\n  opacity:1 !important;\r\n\r\n  pointer-events:auto !important;\r\n}\r\n\r\n\/*\r\n * Authentication and membership windows must also remain\r\n * visible after they are moved inside #tc2Overlay.\r\n *\/\r\nbody.tc2Hide #tc2Overlay #tc2AuthButton,\r\nbody.tc2Hide #tc2Overlay #tc2AuthButton *,\r\nbody.tc2Hide #tc2Overlay #tc2AuthChoiceModal,\r\nbody.tc2Hide #tc2Overlay #tc2AuthChoiceModal *,\r\nbody.tc2Hide #tc2Overlay #tc2MembershipGate,\r\nbody.tc2Hide #tc2Overlay #tc2MembershipGate *{\r\n  visibility:visible !important;\r\n}\r\n\r\n#tc2Overlay #tc2AuthChoiceModal,\r\n#tc2Overlay #tc2MembershipGate{\r\n  z-index:2147483647 !important;\r\n}\r\n\r\n@media(max-width:900px){\r\n\r\n  #tc2Overlay #tc2AuthButton{\r\n    top:18px !important;\r\n    right:76px !important;\r\n\r\n    max-width:145px !important;\r\n    min-height:42px !important;\r\n\r\n    padding:0 12px !important;\r\n\r\n    font-size:.61rem !important;\r\n  }\r\n\r\n\r\n  #tc2Overlay #blissFamilyJourneyEntry{\r\n    display:flex !important;\r\n    align-items:center !important;\r\n    justify-content:center !important;\r\n\r\n    visibility:visible !important;\r\n    opacity:1 !important;\r\n\r\n    top:74px !important;\r\n    right:18px !important;\r\n\r\n    min-height:42px !important;\r\n    padding:0 14px !important;\r\n\r\n    z-index:2147483646 !important;\r\n\r\n    font-size:9px !important;\r\n\r\n    pointer-events:auto !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 loading twice.\r\n   *\/\r\n  if(window.BlissCoreNavigationAuthRepairV1){\r\n    return;\r\n  }\r\n\r\n  window.BlissCoreNavigationAuthRepairV1 = true;\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n\r\n  \/* =========================================================\r\n     AUTHENTICATION LAYER REPAIR\r\n  ========================================================= *\/\r\n\r\n  function moveControlInsideOverlay(id){\r\n\r\n    const overlay =\r\n      byId(\"tc2Overlay\");\r\n\r\n    const element =\r\n      byId(id);\r\n\r\n    if(!overlay || !element){\r\n      return false;\r\n    }\r\n\r\n    \/*\r\n     * The fullscreen repair moves #tc2Overlay above the normal\r\n     * WordPress body.\r\n     *\r\n     * The original authentication code creates its button in\r\n     * document.body, which can leave the button underneath the\r\n     * fullscreen overlay.\r\n     *\r\n     * Moving the same element preserves its existing click\r\n     * listener and authentication connection.\r\n     *\/\r\n    if(element.parentElement !== overlay){\r\n      overlay.appendChild(element);\r\n    }\r\n\r\n    element.style.setProperty(\r\n      \"visibility\",\r\n      \"visible\",\r\n      \"important\"\r\n    );\r\n\r\n    element.style.setProperty(\r\n      \"pointer-events\",\r\n      \"auto\",\r\n      \"important\"\r\n    );\r\n\r\n    return true;\r\n  }\r\n\r\n  function repairAuthLayer(){\r\n\r\n    moveControlInsideOverlay(\r\n      \"tc2AuthButton\"\r\n    );\r\n\r\n    moveControlInsideOverlay(\r\n      \"tc2AuthChoiceModal\"\r\n    );\r\n\r\n    moveControlInsideOverlay(\r\n      \"tc2MembershipGate\"\r\n    );\r\n  }\r\n\r\n\r\n  \/* =========================================================\r\n     MAIN TRAVEL CLUB NAVIGATION\r\n  ========================================================= *\/\r\n\r\n  const PAGE_MAP = {\r\n\r\n    tc2MainAstro:\r\n      \"tc2AstroPage\",\r\n\r\n    tc2MainBrain:\r\n      \"tc2BrainPage\",\r\n\r\n    tc2MainExplore:\r\n      \"tc2ExplorePage\",\r\n\r\n    tc2MainJourney:\r\n      \"tc2JourneyPage\",\r\n\r\n    tc2MainServices:\r\n      \"tc2ServicesPage\",\r\n\r\n    tc2MainStory:\r\n      \"tc2StoryPage\",\r\n\r\n    tc2FloatExplore:\r\n      \"tc2ExplorePage\",\r\n\r\n    tc2FloatJourney:\r\n      \"tc2JourneyPage\",\r\n\r\n    tc2FloatServices:\r\n      \"tc2ServicesPage\",\r\n\r\n    tc2FloatStory:\r\n      \"tc2StoryPage\"\r\n  };\r\n\r\n  const CONTROL_SELECTOR =\r\n    Object.keys(PAGE_MAP)\r\n      .map(function(id){\r\n        return \"#\" + id;\r\n      })\r\n      .join(\",\");\r\n\r\n  function showPageById(pageId){\r\n\r\n    const overlay =\r\n      byId(\"tc2Overlay\");\r\n\r\n    const target =\r\n      byId(pageId);\r\n\r\n    if(!overlay || !target){\r\n\r\n      console.error(\r\n        \"[Bliss Navigation Repair] Page not found:\",\r\n        pageId\r\n      );\r\n\r\n      return false;\r\n    }\r\n\r\n    overlay\r\n      .querySelectorAll(\".tc2-page\")\r\n      .forEach(function(page){\r\n\r\n        page.classList.remove(\r\n          \"active\"\r\n        );\r\n\r\n        page.setAttribute(\r\n          \"aria-hidden\",\r\n          \"true\"\r\n        );\r\n      });\r\n\r\n    target.classList.add(\r\n      \"active\"\r\n    );\r\n\r\n    target.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n\r\nif(\r\n  pageId === \"tc2JourneyPage\" &&\r\n  typeof setJourneyView === \"function\"\r\n){\r\n  setJourneyView(\"dashboard\");\r\n}\r\n\r\nif(\r\n  pageId === \"tc2JourneyPage\" &&\r\n  typeof setJourneyView === \"function\"\r\n){\r\n  setJourneyView(\"dashboard\");\r\n}\r\n\r\n    \/*\r\n     * Return to the top of the newly opened section.\r\n     *\/\r\n    try{\r\n\r\n      overlay.scrollTo({\r\n        top:0,\r\n        behavior:\"auto\"\r\n      });\r\n\r\n    }catch(error){\r\n\r\n      overlay.scrollTop = 0;\r\n\r\n    }\r\n\r\n    \/*\r\n     * Rebuild the Astro wheel when Astro opens.\r\n     *\/\r\n    if(\r\n      pageId === \"tc2AstroPage\" &&\r\n      typeof window.buildAstroWheel ===\r\n        \"function\"\r\n    ){\r\n      try{\r\n        window.buildAstroWheel();\r\n      }catch(error){\r\n        console.warn(\r\n          \"[Bliss Navigation Repair] Astro wheel:\",\r\n          error\r\n        );\r\n      }\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  \/*\r\n   * This uses normal bubbling instead of window capture.\r\n   *\r\n   * The existing membership gate runs before it and may stop\r\n   * clicks on locked features. This repair therefore does not\r\n   * bypass membership restrictions.\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 control =\r\n        target.closest(\r\n          CONTROL_SELECTOR\r\n        );\r\n\r\n      if(!control){\r\n        return;\r\n      }\r\n\r\n      \/*\r\n       * Never manually open a feature that the membership\r\n       * system has marked as locked.\r\n       *\/\r\n      if(\r\n        control.getAttribute(\r\n          \"aria-disabled\"\r\n        ) === \"true\" ||\r\n\r\n        control.classList.contains(\r\n          \"tc2-vault-locked\"\r\n        ) ||\r\n\r\n        control.classList.contains(\r\n          \"is-locked\"\r\n        )\r\n      ){\r\n        return;\r\n      }\r\n\r\n      const pageId =\r\n        PAGE_MAP[control.id];\r\n\r\n      if(!pageId){\r\n        return;\r\n      }\r\n\r\n      event.preventDefault();\r\n\r\n      showPageById(\r\n        pageId\r\n      );\r\n\r\n    },\r\n    false\r\n  );\r\n\r\n\r\n  \/* =========================================================\r\n     STARTUP\r\n  ========================================================= *\/\r\n\r\n  function boot(){\r\n\r\n    repairAuthLayer();\r\n\r\n    \/*\r\n     * WordPress and the authentication code may create their\r\n     * elements shortly after this bottom repair runs.\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        repairAuthLayer();\r\n\r\n        if(attempts >= 30){\r\n          clearInterval(timer);\r\n        }\r\n\r\n      },250);\r\n  }\r\n\r\n  if(\r\n    document.readyState ===\r\n    \"loading\"\r\n  ){\r\n\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      boot,\r\n      {once:true}\r\n    );\r\n\r\n  }else{\r\n\r\n    boot();\r\n\r\n  }\r\n\r\n  \/*\r\n   * Move the controls again after authentication or\r\n   * membership information finishes loading.\r\n   *\/\r\n  window.addEventListener(\r\n    \"blissAuthStateLoaded\",\r\n    repairAuthLayer\r\n  );\r\n\r\n  window.addEventListener(\r\n    \"blissMembershipLoaded\",\r\n    repairAuthLayer\r\n  );\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 COMPLETE SCRIPT RECOVERY\r\nPASTE ONCE AT THE VERY BOTTOM OF THE ENTIRE PAGE\r\n========================================================= -->\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  if (window.__BLISS_TRAVEL_CLUB_RECOVERY_RUNNING__) {\r\n    return;\r\n  }\r\n\r\n  window.__BLISS_TRAVEL_CLUB_RECOVERY_RUNNING__ = true;\r\n\r\n  function log(message, data) {\r\n    if (typeof data === \"undefined\") {\r\n      console.log(\"[Bliss Recovery] \" + message);\r\n    } else {\r\n      console.log(\"[Bliss Recovery] \" + message, data);\r\n    }\r\n  }\r\n\r\n  function cleanScript(source) {\r\n    return String(source || \"\")\r\n      .replace(\/&#0*38;\/gi, \"&\")\r\n      .replace(\/&#x0*26;\/gi, \"&\")\r\n      .replace(\/&amp;\/gi, \"&\")\r\n      .replace(\/<script\\s*\\\/\\s*>\/gi, \"\")\r\n      .replace(\/<script\\s*>\\s*<\\\/script>\/gi, \"\")\r\n      .replace(\/\\u00a0\/g, \" \");\r\n  }\r\n\r\n  function findTravelClubScript() {\r\n    var scripts = Array.prototype.slice.call(\r\n      document.querySelectorAll(\"script:not([src])\")\r\n    );\r\n\r\n    return scripts.find(function (script) {\r\n      var source = script.textContent || \"\";\r\n\r\n      return (\r\n        source.indexOf(\"function showPage(name)\") !== -1 &&\r\n        source.indexOf(\"window.buildAstroWheel=renderSigns\") !== -1 &&\r\n        source.indexOf(\"tc2ExploreV6\") !== -1\r\n      );\r\n    }) || null;\r\n  }\r\n\r\n  function openPage(pageId) {\r\n\r\n  var pageMap = {\r\n    tc2HomePage: \"home\",\r\n    tc2AstroPage: \"astro\",\r\n    tc2BrainPage: \"brain\",\r\n    tc2ExplorePage: \"explore\",\r\n    tc2JourneyPage: \"journey\",\r\n    tc2ServicesPage: \"services\",\r\n    tc2StoryPage: \"story\"\r\n  };\r\n\r\n  var pageName =\r\n    pageMap[pageId];\r\n\r\n  \/*\r\n   * ALWAYS use the real Travel Club navigation\r\n   * when it is available.\r\n   *\r\n   * This keeps state.currentPage synchronized,\r\n   * which is required for the global Back arrow.\r\n   *\/\r\n  if(\r\n    pageName &&\r\n    typeof window.tc2ShowPage === \"function\"\r\n  ){\r\n    window.tc2ShowPage(pageName);\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Emergency fallback only.\r\n   *\/\r\n  var overlay =\r\n    document.getElementById(\"tc2Overlay\");\r\n\r\n  var target =\r\n    document.getElementById(pageId);\r\n\r\n  if(!overlay || !target){\r\n    console.error(\r\n      \"[Bliss Recovery] Missing page:\",\r\n      pageId\r\n    );\r\n    return;\r\n  }\r\n\r\n  overlay\r\n    .querySelectorAll(\".tc2-page\")\r\n    .forEach(function(page){\r\n\r\n      page.classList.remove(\"active\");\r\n      page.style.display = \"none\";\r\n      page.setAttribute(\r\n        \"aria-hidden\",\r\n        \"true\"\r\n      );\r\n\r\n    });\r\n\r\n  target.classList.add(\"active\");\r\n  target.style.display = \"block\";\r\n  target.style.visibility = \"visible\";\r\n  target.style.opacity = \"1\";\r\n  target.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\r\n\r\n  overlay.style.display = \"block\";\r\n  overlay.scrollTop = 0;\r\n}\r\n\r\n  function installNavigation() {\r\n    var routes = {\r\n      tc2MainAstro: \"tc2AstroPage\",\r\n      tc2MainExplore: \"tc2ExplorePage\",\r\n      tc2MainBrain: \"tc2BrainPage\",\r\n      tc2MainJourney: \"tc2JourneyPage\",\r\n      tc2MainServices: \"tc2ServicesPage\",\r\n      tc2MainStory: \"tc2StoryPage\",\r\n\r\n      tc2FloatExplore: \"tc2ExplorePage\",\r\n      tc2FloatJourney: \"tc2JourneyPage\",\r\n      tc2FloatServices: \"tc2ServicesPage\",\r\n      tc2FloatStory: \"tc2StoryPage\"\r\n    };\r\n\r\n    document.addEventListener(\r\n      \"click\",\r\n      function (event) {\r\n        var button = event.target.closest(\r\n          Object.keys(routes)\r\n            .map(function (id) {\r\n              return \"#\" + id;\r\n            })\r\n            .join(\",\")\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        event.stopImmediatePropagation();\r\n\r\n        openPage(routes[button.id]);\r\n      },\r\n      true\r\n    );\r\n\r\n    log(\"Navigation recovery installed.\");\r\n  }\r\n\r\n  function initializeSections() {\r\n    try {\r\n      if (typeof window.buildAstroWheel === \"function\") {\r\n        window.buildAstroWheel();\r\n        log(\"Astro initialized.\");\r\n      }\r\n\r\n      if (\r\n        window.tc2ExploreV6 &&\r\n        typeof window.tc2ExploreV6.renderOptions === \"function\"\r\n      ) {\r\n        window.tc2ExploreV6.renderOptions();\r\n        log(\"Explore initialized.\");\r\n      }\r\n\r\n      if (\r\n        window.tc2JourneyV7 &&\r\n        typeof window.tc2JourneyV7.render === \"function\"\r\n      ) {\r\n        window.tc2JourneyV7.render();\r\n        log(\"Journey initialized.\");\r\n      }\r\n\r\n      if (\r\n        window.tc2LocalServices &&\r\n        typeof window.tc2LocalServices.render === \"function\"\r\n      ) {\r\n        window.tc2LocalServices.render();\r\n        log(\"Services initialized.\");\r\n      }\r\n    } catch (error) {\r\n      console.error(\r\n        \"[Bliss Recovery] Initialization error:\",\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  function recoverApplication() {\r\n    installNavigation();\r\n\r\n    var alreadyLoaded =\r\n      typeof window.buildAstroWheel === \"function\" &&\r\n      window.tc2ExploreV6;\r\n\r\n    if (alreadyLoaded) {\r\n      log(\"Bliss Travel application is already loaded.\");\r\n      initializeSections();\r\n      return;\r\n    }\r\n\r\n    var originalScript = findTravelClubScript();\r\n\r\n    if (!originalScript) {\r\n      console.error(\r\n        \"[Bliss Recovery] The integrated Bliss Travel script was not found.\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    var originalSource =\r\n      originalScript.textContent || \"\";\r\n\r\n    var repairedSource =\r\n      cleanScript(originalSource);\r\n\r\n    if (!repairedSource.trim()) {\r\n      console.error(\r\n        \"[Bliss Recovery] The Bliss Travel script was empty.\"\r\n      );\r\n      return;\r\n    }\r\n\r\n    try {\r\n      var runRepairedScript =\r\n        new Function(repairedSource);\r\n\r\n      runRepairedScript();\r\n\r\n      log(\r\n        \"The integrated Bliss Travel script was repaired and executed.\"\r\n      );\r\n\r\n      setTimeout(initializeSections, 100);\r\n      setTimeout(initializeSections, 600);\r\n      setTimeout(initializeSections, 1500);\r\n    } catch (error) {\r\n      console.error(\r\n        \"[Bliss Recovery] The repaired script still contains an error:\",\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      recoverApplication,\r\n      { once: true }\r\n    );\r\n  } else {\r\n    recoverApplication();\r\n  }\r\n})();\r\n<\/script>\r\n<!-- END BLISS TRAVEL CLUB RECOVERY -->\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 INTERNAL CONCIERGE CHAT\r\n========================================================= -->\r\n\r\n<style>\r\n#blissMemberChatOverlay {\r\n  position: fixed !important;\r\n  inset: 0 !important;\r\n  z-index: 2147483647 !important;\r\n  display: none;\r\n  place-items: center;\r\n  padding: 18px;\r\n  background: rgba(0, 0, 0, .78);\r\n  backdrop-filter: blur(8px);\r\n}\r\n\r\n#blissMemberChatOverlay.is-open {\r\n  display: grid;\r\n}\r\n\r\n#blissMemberChatPanel {\r\n  width: min(94vw, 620px);\r\n  max-height: 88vh;\r\n  display: flex;\r\n  flex-direction: column;\r\n  overflow: hidden;\r\n  border: 1px solid rgba(0, 255, 255, .38);\r\n  border-radius: 22px;\r\n  background:\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(8, 16, 30, .98),\r\n      rgba(2, 7, 16, .99)\r\n    );\r\n  color: white;\r\n  box-shadow:\r\n    0 0 35px rgba(0, 255, 255, .24);\r\n  font-family: Orbitron, system-ui, sans-serif;\r\n}\r\n\r\n#blissMemberChatHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 12px;\r\n  padding: 16px 18px;\r\n  border-bottom:\r\n    1px solid rgba(255, 255, 255, .1);\r\n}\r\n\r\n#blissMemberChatHeader h3 {\r\n  margin: 0;\r\n  font-size: 17px;\r\n}\r\n\r\n#blissMemberChatClose {\r\n  width: 36px;\r\n  height: 36px;\r\n  border: 1px solid rgba(255, 255, 255, .2);\r\n  border-radius: 50%;\r\n  background: rgba(255, 255, 255, .06);\r\n  color: white;\r\n  cursor: pointer;\r\n  font-size: 20px;\r\n}\r\n\r\n#blissMemberChatMessages {\r\n  min-height: 230px;\r\n  max-height: 48vh;\r\n  overflow-y: auto;\r\n  display: grid;\r\n  gap: 10px;\r\n  padding: 16px;\r\n}\r\n\r\n.bliss-member-chat-message {\r\n  max-width: 84%;\r\n  padding: 11px 13px;\r\n  border-radius: 15px;\r\n  background: rgba(255, 255, 255, .07);\r\n  border: 1px solid rgba(255, 255, 255, .09);\r\n  line-height: 1.45;\r\n}\r\n\r\n.bliss-member-chat-message.customer {\r\n  margin-left: auto;\r\n  border-color: rgba(0, 255, 255, .25);\r\n  background: rgba(0, 255, 255, .09);\r\n}\r\n\r\n.bliss-member-chat-message.admin {\r\n  margin-right: auto;\r\n  border-color: rgba(255, 215, 0, .28);\r\n  background: rgba(255, 215, 0, .08);\r\n}\r\n\r\n.bliss-member-chat-message.system {\r\n  max-width: 100%;\r\n  margin: 0 auto;\r\n  opacity: .72;\r\n  font-size: 12px;\r\n  text-align: center;\r\n}\r\n\r\n.bliss-member-chat-sender {\r\n  display: block;\r\n  margin-bottom: 5px;\r\n  font-size: 11px;\r\n  font-weight: 900;\r\n  letter-spacing: .06em;\r\n}\r\n\r\n.bliss-member-chat-date {\r\n  display: block;\r\n  margin-top: 6px;\r\n  opacity: .58;\r\n  font-size: 10px;\r\n}\r\n\r\n#blissMemberChatComposer {\r\n  padding: 14px 16px 16px;\r\n  border-top:\r\n    1px solid rgba(255, 255, 255, .1);\r\n}\r\n\r\n#blissMemberChatInput {\r\n  width: 100%;\r\n  min-height: 90px;\r\n  resize: vertical;\r\n  box-sizing: border-box;\r\n  padding: 12px;\r\n  border: 1px solid rgba(0, 255, 255, .25);\r\n  border-radius: 14px;\r\n  background: rgba(0, 0, 0, .38);\r\n  color: white;\r\n  font: inherit;\r\n}\r\n\r\n#blissMemberChatSend {\r\n  width: 100%;\r\n  margin-top: 10px;\r\n  padding: 12px 16px;\r\n  border: 1px solid cyan;\r\n  border-radius: 999px;\r\n  background: rgba(0, 255, 255, .12);\r\n  color: white;\r\n  cursor: pointer;\r\n  font-weight: 900;\r\n}\r\n\r\n#blissMemberChatStatus {\r\n  min-height: 18px;\r\n  margin-top: 8px;\r\n  font-size: 11px;\r\n  color: #aefcff;\r\n}\r\n\r\n#blissMemberChatStatus.error {\r\n  color: #ff9b9b;\r\n}\r\n<\/style>\r\n\r\n<div\r\n  id=\"blissMemberChatOverlay\"\r\n  aria-hidden=\"true\">\r\n\r\n  <div\r\n    id=\"blissMemberChatPanel\"\r\n    role=\"dialog\"\r\n    aria-modal=\"true\"\r\n    aria-label=\"Bliss Concierge Chat\">\r\n\r\n    <div id=\"blissMemberChatHeader\">\r\n      <h3>Bliss Concierge<\/h3>\r\n\r\n      <button\r\n        id=\"blissMemberChatClose\"\r\n        type=\"button\"\r\n        aria-label=\"Close\">\r\n        \u00d7\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <div id=\"blissMemberChatMessages\">\r\n    <\/div>\r\n\r\n    <div id=\"blissMemberChatComposer\">\r\n\r\n      <textarea\r\n        id=\"blissMemberChatInput\"\r\n        placeholder=\"Write a message to Bliss Concierge...\">\r\n      <\/textarea>\r\n\r\n      <button\r\n        id=\"blissMemberChatSend\"\r\n        type=\"button\">\r\n        Send Message\r\n      <\/button>\r\n\r\n      <div id=\"blissMemberChatStatus\"><\/div>\r\n\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  let selectedJourneyId = \"\";\r\n\r\n  function byId(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function escapeHTML(value){\r\n    return String(\r\n      value == null ? \"\" : value\r\n    ).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 account(){\r\n    return window.BlissJourneyAccount || null;\r\n  }\r\n\r\n  function journeyItems(){\r\n    const api = account();\r\n\r\n    if (!api) {\r\n      return [];\r\n    }\r\n\r\n    if (typeof api.read !== \"function\") {\r\n      return [];\r\n    }\r\n\r\n    const items = api.read();\r\n\r\n    return Array.isArray(items)\r\n      ? items\r\n      : [];\r\n  }\r\n\r\n  function journeyMessages(){\r\n    const api = account();\r\n\r\n    if (!api) {\r\n      return [];\r\n    }\r\n\r\n    if (typeof api.messages !== \"function\") {\r\n      return [];\r\n    }\r\n\r\n    const messages = api.messages();\r\n\r\n    return Array.isArray(messages)\r\n      ? messages\r\n      : [];\r\n  }\r\n\r\n  function itemId(item){\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    );\r\n  }\r\n\r\n  function chooseJourneyId(){\r\n    const items = journeyItems();\r\n    const messages = journeyMessages();\r\n\r\n    \/*\r\n     * Prefer the Journey item connected to the\r\n     * newest existing message.\r\n     *\/\r\n    for (\r\n      let index = 0;\r\n      index < messages.length;\r\n      index++\r\n    ) {\r\n      const messageId =\r\n        String(\r\n          messages[index].journeyId || \"\"\r\n        );\r\n\r\n      if (!messageId) {\r\n        continue;\r\n      }\r\n\r\n      const belongsToItem =\r\n        items.some(\r\n          function(item){\r\n            return itemId(item) === messageId;\r\n          }\r\n        );\r\n\r\n      if (belongsToItem) {\r\n        return messageId;\r\n      }\r\n    }\r\n\r\n    \/*\r\n     * Otherwise use the first available Journey item.\r\n     *\/\r\n    if (items.length > 0) {\r\n      return itemId(items[0]);\r\n    }\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function senderLabel(type){\r\n    const clean =\r\n      String(type || \"\").toLowerCase();\r\n\r\n    if (clean === \"customer\") {\r\n      return \"You\";\r\n    }\r\n\r\n    if (clean === \"admin\") {\r\n      return \"Bliss Concierge\";\r\n    }\r\n\r\n    return \"Journey Update\";\r\n  }\r\n\r\n  function renderMessages(){\r\n    const box =\r\n      byId(\"blissMemberChatMessages\");\r\n\r\n    if (!box) {\r\n      return;\r\n    }\r\n\r\n    const messages =\r\n      journeyMessages()\r\n        .filter(\r\n          function(message){\r\n\r\n            if (!selectedJourneyId) {\r\n              return true;\r\n            }\r\n\r\n            return (\r\n              String(\r\n                message.journeyId || \"\"\r\n              ) === selectedJourneyId\r\n            );\r\n          }\r\n        )\r\n        .slice()\r\n        .reverse();\r\n\r\n    if (messages.length === 0) {\r\n      box.innerHTML =\r\n        '<div class=\"bliss-member-chat-message system\">' +\r\n        'No Concierge messages yet.' +\r\n        '<\/div>';\r\n\r\n      return;\r\n    }\r\n\r\n    box.innerHTML =\r\n      messages.map(\r\n        function(message){\r\n\r\n          const type =\r\n            String(\r\n              message.type || \"system\"\r\n            ).toLowerCase();\r\n\r\n          return (\r\n            '<div class=\"bliss-member-chat-message ' +\r\n            escapeHTML(type) +\r\n            '\">' +\r\n\r\n              '<span class=\"bliss-member-chat-sender\">' +\r\n                escapeHTML(\r\n                  senderLabel(type)\r\n                ) +\r\n              '<\/span>' +\r\n\r\n              '<div>' +\r\n                escapeHTML(\r\n                  message.message || \"\"\r\n                ).replace(\/\\n\/g, \"<br>\") +\r\n              '<\/div>' +\r\n\r\n              '<span class=\"bliss-member-chat-date\">' +\r\n                escapeHTML(\r\n                  message.createdAt || \"\"\r\n                ) +\r\n              '<\/span>' +\r\n\r\n            '<\/div>'\r\n          );\r\n        }\r\n      ).join(\"\");\r\n\r\n    box.scrollTop =\r\n      box.scrollHeight;\r\n  }\r\n\r\n  async function reloadMessages(journeyIdToKeep){\r\n\r\n  const api = account();\r\n\r\n  if (!api) {\r\n    return;\r\n  }\r\n\r\n  if (typeof api.load !== \"function\") {\r\n    return;\r\n  }\r\n\r\n  const keepJourneyId =\r\n    journeyIdToKeep !== undefined &&\r\n    journeyIdToKeep !== null &&\r\n    String(journeyIdToKeep) !== \"\"\r\n      ? String(journeyIdToKeep)\r\n      : String(selectedJourneyId || \"\");\r\n\r\n  await api.load(true);\r\n\r\n  if(keepJourneyId){\r\n    selectedJourneyId =\r\n      keepJourneyId;\r\n  }else if(!selectedJourneyId){\r\n    selectedJourneyId =\r\n      chooseJourneyId();\r\n  }\r\n\r\n  renderMessages();\r\n}\r\n\r\n  function openChat(journeyId){\r\n\r\n  const overlay =\r\n    byId(\"blissMemberChatOverlay\");\r\n\r\n  if (!overlay) {\r\n    console.error(\r\n      \"Bliss Concierge overlay was not found.\"\r\n    );\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Specific Journey item:\r\n   * use its Journey ID.\r\n   *\r\n   * General Concierge:\r\n   * use the whole Journey conversation.\r\n   *\/\r\n  selectedJourneyId =\r\n    journeyId\r\n      ? String(journeyId)\r\n      : \"__FULL_JOURNEY__\";\r\n\r\n  \/*\r\n   * Put the chat INSIDE the Travel Club overlay.\r\n   * This avoids the visibility\/stacking problems caused\r\n   * by tc2Hide and the full-screen Travel Club overlay.\r\n   *\/\r\n  const travelClubOverlay =\r\n    byId(\"tc2Overlay\");\r\n\r\n  if(\r\n    travelClubOverlay &&\r\n    overlay.parentNode !== travelClubOverlay\r\n  ){\r\n    travelClubOverlay.appendChild(overlay);\r\n  }\r\n\r\n  overlay.classList.add(\"is-open\");\r\n\r\n  overlay.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\r\n\r\n  overlay.style.setProperty(\r\n    \"display\",\r\n    \"grid\",\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.style.setProperty(\r\n    \"pointer-events\",\r\n    \"auto\",\r\n    \"important\"\r\n  );\r\n\r\n  overlay.style.setProperty(\r\n    \"z-index\",\r\n    \"2147483647\",\r\n    \"important\"\r\n  );\r\n\r\n  document.documentElement.style.overflow =\r\n    \"hidden\";\r\n\r\n  renderMessages();\r\n\r\nreloadMessages(\r\n  selectedJourneyId\r\n)\r\n.catch(function(error){\r\n\r\n  console.error(\r\n    \"Bliss chat load error:\",\r\n    error\r\n  );\r\n\r\n  setStatus(\r\n    error.message ||\r\n    \"Could not load Concierge messages.\",\r\n    true\r\n  );\r\n\r\n});\r\n}\r\n\r\n  function closeChat(){\r\n    const overlay =\r\n      byId(\"blissMemberChatOverlay\");\r\n\r\n    if (!overlay) {\r\n      return;\r\n    }\r\n\r\n    overlay.classList.remove(\"is-open\");\r\n    overlay.setAttribute(\r\n      \"aria-hidden\",\r\n      \"true\"\r\n    );\r\n\r\noverlay.style.setProperty(\r\n  \"display\",\r\n  \"none\",\r\n  \"important\"\r\n);\r\n\r\n    document.documentElement.style.overflow =\r\n      \"\";\r\n  }\r\n\r\n  function setStatus(message,isError){\r\n    const status =\r\n      byId(\"blissMemberChatStatus\");\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.classList.toggle(\r\n      \"error\",\r\n      Boolean(isError)\r\n    );\r\n  }\r\n\r\nfunction familyChatContext(){\r\n\r\n  try{\r\n\r\n    const access =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_FAMILY_ACCESS_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    const traveler =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\"\r\n        ) || \"null\"\r\n      );\r\n\r\n    if(\r\n      !access ||\r\n      access.active !== true ||\r\n      !access.tripCode ||\r\n      !traveler ||\r\n      !traveler.id\r\n    ){\r\n      return null;\r\n    }\r\n\r\n    return {\r\n      tripCode:\r\n        String(access.tripCode),\r\n\r\n      traveler:\r\n        traveler\r\n    };\r\n\r\n  }catch(error){\r\n\r\n    return null;\r\n\r\n  }\r\n}\r\n\r\n  async function sendMessage(){\r\n\r\n  const input =\r\n    byId(\"blissMemberChatInput\");\r\n\r\n  const button =\r\n    byId(\"blissMemberChatSend\");\r\n\r\n  const message =\r\n    input\r\n      ? input.value.trim()\r\n      : \"\";\r\n\r\n  const family =\r\n    familyChatContext();\r\n\r\n  const memberConfig =\r\n    window.BlissJourneyMemberConfig || {};\r\n\r\n  const familyConfig =\r\n    window.BlissFamilyConfig || {};\r\n\r\n  const requestConfig =\r\n    family\r\n      ? familyConfig\r\n      : memberConfig;\r\n\r\n\r\n  if(!selectedJourneyId){\r\n\r\n    setStatus(\r\n      \"Choose a Journey item first.\",\r\n      true\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  if(!message){\r\n\r\n    setStatus(\r\n      \"Write a message first.\",\r\n      true\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  if(\r\n    !requestConfig.ajaxUrl ||\r\n    !requestConfig.nonce\r\n  ){\r\n\r\n    setStatus(\r\n      \"The Concierge connection is unavailable.\",\r\n      true\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  if(button){\r\n\r\n    button.disabled = true;\r\n    button.textContent =\r\n      \"Sending...\";\r\n\r\n  }\r\n\r\n\r\n  setStatus(\r\n    \"Sending message...\",\r\n    false\r\n  );\r\n\r\n\r\n  try{\r\n\r\n    const body =\r\n      new URLSearchParams();\r\n\r\n\r\n    if(family){\r\n\r\n      body.set(\r\n        \"action\",\r\n        \"bliss_family_add_journey_message\"\r\n      );\r\n\r\n      body.set(\r\n        \"nonce\",\r\n        familyConfig.nonce\r\n      );\r\n\r\n      body.set(\r\n        \"tripCode\",\r\n        family.tripCode\r\n      );\r\n\r\n      body.set(\r\n        \"trip_code\",\r\n        family.tripCode\r\n      );\r\n\r\n      body.set(\r\n        \"traveler_id\",\r\n        String(\r\n          family.traveler.id || \"\"\r\n        )\r\n      );\r\n\r\n      body.set(\r\n        \"traveler_name\",\r\n        String(\r\n          family.traveler.name ||\r\n          \"Family Traveler\"\r\n        )\r\n      );\r\n\r\n    }else{\r\n\r\n      body.set(\r\n        \"action\",\r\n        \"bliss_member_add_journey_message\"\r\n      );\r\n\r\n      body.set(\r\n        \"nonce\",\r\n        memberConfig.nonce\r\n      );\r\n\r\n    }\r\n\r\n\r\n    body.set(\r\n      \"journey_id\",\r\n      selectedJourneyId\r\n    );\r\n\r\n    body.set(\r\n      \"message\",\r\n      message\r\n    );\r\n\r\n\r\n    const response =\r\n      await fetch(\r\n        requestConfig.ajaxUrl,\r\n        {\r\n          method:\"POST\",\r\n\r\n          credentials:\r\n            \"same-origin\",\r\n\r\n          headers:{\r\n            \"Content-Type\":\r\n              \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n          },\r\n\r\n          body:\r\n            body.toString()\r\n        }\r\n      );\r\n\r\n\r\n    const result =\r\n      await response.json();\r\n\r\n\r\n    if(\r\n      !response.ok ||\r\n      !result ||\r\n      result.success !== true\r\n    ){\r\n\r\n      const errorMessage =\r\n        result &&\r\n        result.data &&\r\n        result.data.message\r\n          ? result.data.message\r\n          : \"The message could not be sent.\";\r\n\r\n      throw new Error(\r\n        errorMessage\r\n      );\r\n    }\r\n\r\n\r\n    if(input){\r\n      input.value = \"\";\r\n    }\r\n\r\n\r\n    await reloadMessages();\r\n\r\n\r\n    setStatus(\r\n      \"Message sent to Bliss Concierge.\",\r\n      false\r\n    );\r\n\r\n\r\n  }catch(error){\r\n\r\n    console.error(\r\n      \"Bliss Journey chat error:\",\r\n      error\r\n    );\r\n\r\n    setStatus(\r\n      error.message ||\r\n      \"The message could not be sent.\",\r\n      true\r\n    );\r\n\r\n\r\n  }finally{\r\n\r\n    if(button){\r\n\r\n      button.disabled = false;\r\n\r\n      button.textContent =\r\n        \"Send Message\";\r\n\r\n    }\r\n\r\n  }\r\n}\r\n\r\n  document.addEventListener(\r\n    \"click\",\r\n    function(event){\r\n\r\n      const messageButton =\r\n        typeof event.target.closest ===\r\n        \"function\"\r\n          ? event.target.closest(\r\n             \"#tc2MjChat\"\r\n            )\r\n          : null;\r\n\r\n      if (messageButton) {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n        openChat();\r\n        return;\r\n      }\r\n\r\n      const closeButton =\r\n        typeof event.target.closest ===\r\n        \"function\"\r\n          ? event.target.closest(\r\n              \"#blissMemberChatClose\"\r\n            )\r\n          : null;\r\n\r\n      if (closeButton) {\r\n        event.preventDefault();\r\n        closeChat();\r\n        return;\r\n      }\r\n\r\n      const sendButton =\r\n        typeof event.target.closest ===\r\n        \"function\"\r\n          ? event.target.closest(\r\n              \"#blissMemberChatSend\"\r\n            )\r\n          : null;\r\n\r\n      if (sendButton) {\r\n        event.preventDefault();\r\n        sendMessage();\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n  const overlay =\r\n    byId(\"blissMemberChatOverlay\");\r\n\r\n  if (overlay) {\r\n    overlay.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n        if (event.target === overlay) {\r\n          closeChat();\r\n        }\r\n      }\r\n    );\r\n  }\r\n\r\n  document.addEventListener(\r\n    \"keydown\",\r\n    function(event){\r\n      if (event.key === \"Escape\") {\r\n        closeChat();\r\n      }\r\n    }\r\n  );\r\n\r\n  window.addEventListener(\r\n  \"blissJourneyAccountUpdated\",\r\n  function(){\r\n\r\n    const overlay =\r\n      byId(\"blissMemberChatOverlay\");\r\n\r\n    if(\r\n      overlay &&\r\n      overlay.classList.contains(\"is-open\")\r\n    ){\r\n      renderMessages();\r\n    }\r\n\r\n  }\r\n);\r\n\r\n  window.BlissMemberConciergeChat = {\r\n\r\n  open:\r\n    openChat,\r\n\r\n  openFor:\r\n    function(journeyId){\r\n      openChat(journeyId);\r\n    },\r\n\r\n  close:\r\n    closeChat,\r\n\r\n  reload:\r\n    reloadMessages\r\n};\r\n\r\n\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nLEVEL 4 PERSONAL EVOLUTION \u2014 INTERNAL TRAVEL CLUB PAGE\r\nPASTE THIS AT THE VERY BOTTOM OF THE REAL TRAVEL CLUB CODE.\r\n\r\nREAL BUTTON CONNECTED:\r\n#tc2MainEvolution\r\n\r\nNEW INTERNAL PAGE:\r\n#tc2EvolutionPage\r\n\r\nHOST ROUTE:\r\nsection   = evolution\r\nlevel     = 4\r\nstage     = Survival \/ Gastronomic \/ Conference \/ Give \/\r\n            Cosmic \/ Entrepreneur \/ Insight\r\noption    = one of the four group options\r\nsuboption = one of the four leaves\r\n========================================================= -->\r\n\r\n<style id=\"tc2EvolutionStyles\">\r\n#tc2EvolutionPage{\r\n  --pe-bg:#02050d;\r\n  --pe-panel:#081427;\r\n  --pe-line:rgba(255,255,255,.12);\r\n  --pe-soft:rgba(235,246,255,.72);\r\n  --pe-white:#f7fbff;\r\n  --pe-cyan:#58f3ff;\r\n  --pe-violet:#a66cff;\r\n  --pe-gold:#f1d47b;\r\n  min-height:100%;\r\n  color:var(--pe-white);\r\n  background:\r\n    radial-gradient(circle at 15% 8%,rgba(88,243,255,.12),transparent 25%),\r\n    radial-gradient(circle at 84% 10%,rgba(166,108,255,.15),transparent 28%),\r\n    linear-gradient(180deg,#02050d,#071326 54%,#02050d);\r\n}\r\n#tc2EvolutionPage *{box-sizing:border-box}\r\n#tc2EvolutionPage .pe-shell{\r\n  width:min(1220px,94vw);\r\n  margin:0 auto;\r\n  padding:24px 0 70px;\r\n}\r\n#tc2EvolutionPage .pe-topbar{\r\n  position:sticky;\r\n  top:0;\r\n  z-index:35;\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:12px;\r\n  padding:14px 0 18px;\r\n  background:linear-gradient(180deg,rgba(2,5,13,.98),rgba(2,5,13,.88),transparent);\r\n}\r\n#tc2EvolutionPage .pe-back,\r\n#tc2EvolutionPage .pe-home{\r\n  border:1px solid var(--pe-line);\r\n  border-radius:999px;\r\n  background:rgba(0,0,0,.48);\r\n  color:var(--pe-white);\r\n  padding:10px 15px;\r\n  cursor:pointer;\r\n  font:800 12px\/1 Orbitron,Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-back[hidden]{display:none!important}\r\n#tc2EvolutionPage .pe-hero{\r\n  text-align:center;\r\n  padding:34px 12px 42px;\r\n}\r\n#tc2EvolutionPage .pe-kicker{\r\n  color:var(--pe-cyan);\r\n  letter-spacing:.22em;\r\n  font:900 11px\/1 Orbitron,Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-hero h2{\r\n  margin:14px 0 12px;\r\n  font:900 clamp(34px,6vw,72px)\/.95 Orbitron,Arial,sans-serif;\r\n  text-transform:uppercase;\r\n}\r\n#tc2EvolutionPage .pe-hero p{\r\n  max-width:760px;\r\n  margin:0 auto;\r\n  color:var(--pe-soft);\r\n  font:500 15px\/1.7 Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-stage-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(7,minmax(130px,1fr));\r\n  gap:12px;\r\n}\r\n#tc2EvolutionPage .pe-stage-card{\r\n  min-height:165px;\r\n  border:1px solid var(--pe-line);\r\n  border-radius:24px;\r\n  padding:17px 12px;\r\n  color:var(--pe-white);\r\n  background:linear-gradient(180deg,rgba(255,255,255,.07),rgba(255,255,255,.025));\r\n  cursor:pointer;\r\n  text-align:center;\r\n  box-shadow:0 18px 48px rgba(0,0,0,.28);\r\n  transition:transform .2s,border-color .2s,box-shadow .2s;\r\n}\r\n#tc2EvolutionPage .pe-stage-card:hover{\r\n  transform:translateY(-5px);\r\n  border-color:var(--pe-cyan);\r\n  box-shadow:0 0 28px rgba(88,243,255,.18);\r\n}\r\n#tc2EvolutionPage .pe-stage-number{\r\n  display:block;\r\n  color:var(--pe-gold);\r\n  letter-spacing:.14em;\r\n  font-size:10px;\r\n  font-weight:900;\r\n}\r\n#tc2EvolutionPage .pe-stage-icon{\r\n  display:block;\r\n  margin:13px 0 9px;\r\n  font-size:36px;\r\n}\r\n#tc2EvolutionPage .pe-stage-name{\r\n  display:block;\r\n  font-size:14px;\r\n  font-weight:900;\r\n}\r\n#tc2EvolutionPage .pe-stage-tag{\r\n  display:block;\r\n  margin-top:8px;\r\n  color:var(--pe-soft);\r\n  font:500 11px\/1.4 Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-view{display:none}\r\n#tc2EvolutionPage .pe-view.active{display:block}\r\n#tc2EvolutionPage .pe-route-title{\r\n  margin:10px 0 22px;\r\n  color:var(--pe-cyan);\r\n  text-transform:uppercase;\r\n  letter-spacing:.12em;\r\n  font-size:11px;\r\n  font-weight:900;\r\n}\r\n#tc2EvolutionPage .pe-options{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:16px;\r\n}\r\n#tc2EvolutionPage .pe-option{\r\n  border:1px solid var(--pe-line);\r\n  border-radius:24px;\r\n  padding:20px;\r\n  background:rgba(8,20,39,.88);\r\n  box-shadow:0 18px 50px rgba(0,0,0,.25);\r\n}\r\n#tc2EvolutionPage .pe-option h3{\r\n  margin:0 0 15px;\r\n  font-size:17px;\r\n}\r\n#tc2EvolutionPage .pe-leaves{\r\n  display:grid;\r\n  gap:9px;\r\n}\r\n#tc2EvolutionPage .pe-leaf{\r\n  position:relative;\r\n  min-height:51px;\r\n  padding:12px 13px 12px 34px;\r\n  border:1px solid var(--pe-line);\r\n  border-radius:15px;\r\n  background:rgba(255,255,255,.045);\r\n  color:var(--pe-white);\r\n  cursor:pointer;\r\n  text-align:left;\r\n  font:800 12px\/1.35 Orbitron,Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-leaf:before{\r\n  content:\"\u25c6\";\r\n  position:absolute;\r\n  left:13px;\r\n  top:50%;\r\n  transform:translateY(-50%);\r\n  color:var(--pe-cyan);\r\n  font-size:9px;\r\n}\r\n#tc2EvolutionPage .pe-leaf:hover,\r\n#tc2EvolutionPage .pe-leaf.selected{\r\n  border-color:var(--pe-cyan);\r\n  background:rgba(88,243,255,.09);\r\n}\r\n#tc2EvolutionPage .pe-host-zone{\r\n  margin-top:30px;\r\n}\r\n#tc2EvolutionPage .pe-host-head{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:flex-end;\r\n  gap:12px;\r\n  margin-bottom:14px;\r\n}\r\n#tc2EvolutionPage .pe-host-head h3{\r\n  margin:0;\r\n  font-size:24px;\r\n}\r\n#tc2EvolutionPage .pe-host-count{\r\n  color:var(--pe-soft);\r\n  font:600 12px Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-host-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:16px;\r\n}\r\n#tc2EvolutionPage .pe-host-card{\r\n  overflow:hidden;\r\n  border:1px solid var(--pe-line);\r\n  border-radius:22px;\r\n  background:rgba(8,20,39,.92);\r\n  box-shadow:0 18px 50px rgba(0,0,0,.28);\r\n}\r\n#tc2EvolutionPage .pe-host-image{\r\n  height:215px;\r\n  background:#06101f center\/cover no-repeat;\r\n}\r\n#tc2EvolutionPage .pe-host-body{padding:18px}\r\n#tc2EvolutionPage .pe-host-route{\r\n  color:var(--pe-cyan);\r\n  text-transform:uppercase;\r\n  letter-spacing:.07em;\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n#tc2EvolutionPage .pe-host-body h4{\r\n  margin:9px 0 7px;\r\n  font-size:19px;\r\n}\r\n#tc2EvolutionPage .pe-host-meta{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:7px;\r\n  margin-bottom:10px;\r\n}\r\n#tc2EvolutionPage .pe-chip{\r\n  border:1px solid var(--pe-line);\r\n  border-radius:999px;\r\n  padding:5px 8px;\r\n  color:var(--pe-soft);\r\n  font:700 10px Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-host-body p{\r\n  margin:0;\r\n  color:var(--pe-soft);\r\n  font:500 13px\/1.55 Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-host-actions{\r\n  display:flex;\r\n  gap:8px;\r\n  margin-top:16px;\r\n}\r\n#tc2EvolutionPage .pe-host-btn{\r\n  flex:1;\r\n  border:1px solid var(--pe-line);\r\n  border-radius:12px;\r\n  padding:10px;\r\n  background:rgba(255,255,255,.055);\r\n  color:var(--pe-white);\r\n  cursor:pointer;\r\n  font:800 11px\/1 Orbitron,Arial,sans-serif;\r\n}\r\n#tc2EvolutionPage .pe-host-btn.primary{\r\n  background:var(--pe-cyan);\r\n  border-color:var(--pe-cyan);\r\n  color:#031018;\r\n}\r\n#tc2EvolutionPage .pe-empty{\r\n  grid-column:1\/-1;\r\n  padding:30px;\r\n  border:1px dashed var(--pe-line);\r\n  border-radius:20px;\r\n  color:var(--pe-soft);\r\n  text-align:center;\r\n  font:600 14px\/1.7 Arial,sans-serif;\r\n}\r\n@media(max-width:1050px){\r\n  #tc2EvolutionPage .pe-stage-grid{grid-template-columns:repeat(4,1fr)}\r\n  #tc2EvolutionPage .pe-options{grid-template-columns:repeat(2,1fr)}\r\n}\r\n@media(max-width:760px){\r\n  #tc2EvolutionPage .pe-stage-grid{grid-template-columns:repeat(2,1fr)}\r\n  #tc2EvolutionPage .pe-host-grid{grid-template-columns:1fr}\r\n}\r\n@media(max-width:560px){\r\n  #tc2EvolutionPage .pe-options{grid-template-columns:1fr}\r\n  #tc2EvolutionPage .pe-stage-card{min-height:140px}\r\n}\r\n<\/style>\r\n\r\n<script id=\"tc2EvolutionInstaller\">\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const STRUCTURE = [{\"id\": \"survival\", \"name\": \"Survival\", \"icon\": \"\ud83d\udee1\ufe0f\", \"tagline\": \"Connection and belonging\", \"options\": [{\"name\": \"Networking\", \"leaves\": [\"Social Connections\", \"Digital Networking\", \"Business Networking\", \"Influencer Connections\"]}, {\"name\": \"Dating\", \"leaves\": [\"Dating Events\", \"Online Dating\", \"Blind Dates\", \"Social Mixers\"]}, {\"name\": \"Shared Dining\", \"leaves\": [\"Restaurant Hopping\", \"Dinner Festivals\", \"Progressive Dinners\", \"City Dining\"]}, {\"name\": \"Partnership\", \"leaves\": [\"Meet the Family\", \"Wedding Planning\", \"Matchmaking\", \"Marriage Experiences\"]}]}, {\"id\": \"gastronomic\", \"name\": \"Gastronomic\", \"icon\": \"\ud83c\udf7d\ufe0f\", \"tagline\": \"Food and creativity\", \"options\": [{\"name\": \"Culinary Skills\", \"leaves\": [\"Learn to Cook\", \"Cook With Locals\", \"In-Room Cooking\", \"Shop and Cook\"]}, {\"name\": \"Culinary Experiences\", \"leaves\": [\"Culinary Camps\", \"Cooking Classes\", \"Culinary Dates\", \"Private Dining\"]}, {\"name\": \"Food Discovery\", \"leaves\": [\"Gastronomic Experiences\", \"Food-Truck Experiences\", \"Culinary Expositions\", \"Food Festivals\"]}, {\"name\": \"Food Innovation\", \"leaves\": [\"Creative Cuisine\", \"Herbal Cuisine\", \"Botanical Cuisine\", \"Medicinal Nutrition\"]}]}, {\"id\": \"conference\", \"name\": \"Conference\", \"icon\": \"\ud83d\udde3\ufe0f\", \"tagline\": \"Learning and expression\", \"options\": [{\"name\": \"Creative Learning\", \"leaves\": [\"One-Day Sessions\", \"Learning Camps\", \"Online Sessions\", \"Exclusive Sessions\"]}, {\"name\": \"Books and Writing\", \"leaves\": [\"Meet an Author\", \"Creative Writing\", \"Writing Workshops\", \"Literary Festivals\"]}, {\"name\": \"Digital Innovation\", \"leaves\": [\"Industry Conferences\", \"Innovation Camps\", \"Trading Education\", \"Youth Programs\"]}, {\"name\": \"Reinvention\", \"leaves\": [\"Trial Sessions\", \"Transformation Camps\", \"Online Programs\", \"International Programs\"]}]}, {\"id\": \"give\", \"name\": \"Give\", \"icon\": \"\ud83c\udf81\", \"tagline\": \"Compassion and service\", \"options\": [{\"name\": \"Support Children\", \"leaves\": [\"Volunteer for a Day\", \"Health Support\", \"Meaningful Gifts\", \"Educational Trips\"]}, {\"name\": \"Strengthen Families\", \"leaves\": [\"Share a Meal\", \"Support Education\", \"Family Experiences\", \"Adoption Support\"]}, {\"name\": \"Honor Older Adults\", \"leaves\": [\"Walk Together\", \"Educational Support\", \"Spend a Day Together\", \"Community Outings\"]}, {\"name\": \"Community Support\", \"leaves\": [\"Provide a Meal\", \"Community Meals\", \"Educational Support\", \"Inspire Change\"]}]}, {\"id\": \"cosmic\", \"name\": \"Cosmic\", \"icon\": \"\ud83c\udf0c\", \"tagline\": \"Healing and higher connection\", \"options\": [{\"name\": \"Celestial Travel\", \"leaves\": [\"Stargazing\", \"Meteor Experiences\", \"Eclipse Journeys\", \"Full-Moon Experiences\"]}, {\"name\": \"Universal Love\", \"leaves\": [\"Relationship Retreats\", \"Self-Love\", \"Family Connection\", \"Love Again\"]}, {\"name\": \"Healing Journey\", \"leaves\": [\"Spiritual Discovery\", \"Recovery Retreats\", \"Support and Renewal\", \"Purposeful Work\"]}, {\"name\": \"Higher Self\", \"leaves\": [\"Cosmic Awareness\", \"Past-Life Reflection\", \"Reiki Energy\", \"Astral Exploration\"]}]}, {\"id\": \"entrepreneur\", \"name\": \"Entrepreneur\", \"icon\": \"\ud83d\udcbc\", \"tagline\": \"Creation and personal power\", \"options\": [{\"name\": \"Inspiration\", \"leaves\": [\"Start-Up Experience\", \"Founder Lessons\", \"Business Bootcamp\", \"Mentor Others\"]}, {\"name\": \"Growth Mindset\", \"leaves\": [\"Level Up\", \"Share Knowledge\", \"Sustainable Growth\", \"Innovate\"]}, {\"name\": \"Creation\", \"leaves\": [\"Build Your Vision\", \"Design the Future\", \"Action Steps\", \"Creative Energy\"]}, {\"name\": \"Launch\", \"leaves\": [\"Launch Workshops\", \"Start Your Project\", \"Showcase Your Work\", \"Inspire Others\"]}]}, {\"id\": \"insight\", \"name\": \"Insight\", \"icon\": \"\ud83d\udca1\", \"tagline\": \"Awareness and inner wisdom\", \"options\": [{\"name\": \"Mindful Movement\", \"leaves\": [\"Wellness Retreats\", \"Yoga Instruction\", \"Scenic Yoga\", \"Virtual Practice\"]}, {\"name\": \"Silent Reflection\", \"leaves\": [\"Meditation Retreats\", \"Guided Learning\", \"One-Day Immersion\", \"Become a Guide\"]}, {\"name\": \"Nature Connection\", \"leaves\": [\"Forest Connection\", \"Nights in Nature\", \"Parks and Sanctuaries\", \"Ancestral Traditions\"]}, {\"name\": \"Meditation and Energy\", \"leaves\": [\"Mindful Yoga\", \"Past Reflection\", \"Reiki Wellness\", \"Astral Meditation\"]}]}];\r\n  const AJAX_URL = \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n  const LOAD_ACTION = \"ggg_tc_get_inventory\";\r\n\r\n  const norm = value => String(value || \"\")\r\n    .toLowerCase()\r\n    .normalize(\"NFD\")\r\n    .replace(\/[\\u0300-\\u036f]\/g,\"\")\r\n    .replace(\/[^a-z0-9]+\/g,\" \")\r\n    .trim();\r\n\r\n  const esc = value => String(value ?? \"\")\r\n    .replace(\/&\/g,\"&amp;\")\r\n    .replace(\/<\/g,\"&lt;\")\r\n    .replace(\/>\/g,\"&gt;\")\r\n    .replace(\/\"\/g,\"&quot;\")\r\n    .replace(\/'\/g,\"&#039;\");\r\n\r\n  let inventory = [];\r\n  let currentStage = null;\r\n\r\n  function activeHost(host){\r\n    return host &&\r\n      host.active !== false &&\r\n      host.active !== 0 &&\r\n      norm(host.status || \"active\") !== \"hidden\";\r\n  }\r\n\r\n  function isEvolutionHost(host){\r\n    const section = norm(host && (host.section || host.source || \"\"));\r\n    return section === \"evolution\" ||\r\n      section === \"personal evolution\" ||\r\n      (Number(host && host.level) === 4);\r\n  }\r\n\r\n  function routeValue(host,key){\r\n    if(key === \"stage\") return host.stage || host.guide || host.category || \"\";\r\n    if(key === \"option\") return host.option || host.parent || \"\";\r\n    return host.suboption || host.style || host.experience || \"\";\r\n  }\r\n\r\n  function matches(host,stage,option,leaf){\r\n    return isEvolutionHost(host) &&\r\n      activeHost(host) &&\r\n      norm(routeValue(host,\"stage\")) === norm(stage.name) &&\r\n      norm(routeValue(host,\"option\")) === norm(option.name) &&\r\n      norm(routeValue(host,\"leaf\")) === norm(leaf);\r\n  }\r\n\r\n  function getImage(host){\r\n  if(host.image || host.imageUrl){\r\n    return host.image || host.imageUrl;\r\n  }\r\n\r\n  if(Array.isArray(host.images)){\r\n    if(host.images[0]){\r\n      return typeof host.images[0] === \"string\"\r\n        ? host.images[0]\r\n        : host.images[0].url || \"\";\r\n    }\r\n  }\r\n\r\n  return \"\";\r\n}\r\n\r\n  function safeUrl(value){\r\n    const url = String(value || \"\").trim();\r\n    return \/^(https?:\\\/\\\/|\\\/)\/i.test(url) ? url : \"\";\r\n  }\r\n\r\n  async function loadInventory(){\r\n    if(window.BlissTravelControlPanel &&\r\n       typeof window.BlissTravelControlPanel.getInventory === \"function\"){\r\n      inventory = window.BlissTravelControlPanel.getInventory() || [];\r\n      return;\r\n    }\r\n\r\n    try{\r\n      const body = new URLSearchParams({action:LOAD_ACTION});\r\n      const response = await fetch(AJAX_URL,{\r\n        method:\"POST\",\r\n        credentials:\"same-origin\",\r\n        headers:{\"Content-Type\":\"application\/x-www-form-urlencoded; charset=UTF-8\"},\r\n        body:body.toString()\r\n      });\r\n      const result = await response.json();\r\n      const data = result && result.success ? result.data : result;\r\n      inventory = Array.isArray(data)\r\n        ? data\r\n        : Array.isArray(data && data.inventory)\r\n          ? data.inventory\r\n          : Array.isArray(data && data.items)\r\n            ? data.items\r\n            : [];\r\n    }catch(error){\r\n      console.warn(\"[Personal Evolution] Could not load inventory.\",error);\r\n      inventory = [];\r\n    }\r\n  }\r\n\r\n  function pageHTML(){\r\n    return `\r\n      <section id=\"tc2EvolutionPage\" class=\"tc2-page\" aria-hidden=\"true\">\r\n        <div class=\"pe-shell\">\r\n          <div class=\"pe-topbar\">\r\n            <button id=\"peBackButton\" class=\"pe-back\" type=\"button\" hidden>\u2190 All Stages<\/button>\r\n            <button id=\"peHomeButton\" class=\"pe-home\" type=\"button\">Bliss Travel Home<\/button>\r\n          <\/div>\r\n\r\n          <div id=\"peStagesView\" class=\"pe-view active\">\r\n            <div class=\"pe-hero\">\r\n              <div class=\"pe-kicker\">LEVEL 4 \u00b7 PERSONAL EVOLUTION<\/div>\r\n              <h2>Seven Stages of Growth<\/h2>\r\n              <p>Choose a stage, explore its four branches, and select a leaf to discover the hosts connected to that exact Personal Evolution experience.<\/p>\r\n            <\/div>\r\n            <div id=\"peStageGrid\" class=\"pe-stage-grid\"><\/div>\r\n          <\/div>\r\n\r\n          <div id=\"peRouteView\" class=\"pe-view\">\r\n            <div id=\"peRouteTitle\" class=\"pe-route-title\"><\/div>\r\n            <div id=\"peOptions\" class=\"pe-options\"><\/div>\r\n\r\n            <div class=\"pe-host-zone\">\r\n              <div class=\"pe-host-head\">\r\n                <h3 id=\"peHostTitle\">Choose a leaf<\/h3>\r\n                <div id=\"peHostCount\" class=\"pe-host-count\"><\/div>\r\n              <\/div>\r\n              <div id=\"peHostGrid\" class=\"pe-host-grid\">\r\n                <div class=\"pe-empty\">Select one leaf to see its connected Personal Evolution hosts.<\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>`;\r\n  }\r\n\r\n  function showTC2Page(pageId){\r\n  const overlay =\r\n    document.getElementById(\"tc2Overlay\");\r\n\r\n  if(!overlay){\r\n    return;\r\n  }\r\n\r\n  overlay.style.display = \"block\";\r\n  overlay.setAttribute(\r\n    \"aria-hidden\",\r\n    \"false\"\r\n  );\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\r\n    .querySelectorAll(\r\n      \"#tc2Overlay .tc2-page\"\r\n    )\r\n    .forEach(function(page){\r\n\r\n      const active =\r\n        page.id === pageId;\r\n\r\n      page.classList.toggle(\r\n        \"active\",\r\n        active\r\n      );\r\n\r\n      page.setAttribute(\r\n        \"aria-hidden\",\r\n        active ? \"false\" : \"true\"\r\n      );\r\n    });\r\n\r\n  requestAnimationFrame(function(){\r\n    overlay.scrollTop = 0;\r\n\r\n    const page =\r\n      document.getElementById(pageId);\r\n\r\n    if(page){\r\n      page.scrollIntoView({\r\n        block:\"start\"\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\n  function renderStages(){\r\n    document.getElementById(\"peStageGrid\").innerHTML =\r\n      STRUCTURE.map((stage,index) => `\r\n        <button class=\"pe-stage-card\" type=\"button\" data-pe-stage=\"${esc(stage.id)}\">\r\n          <span class=\"pe-stage-number\">STAGE ${index + 1}<\/span>\r\n          <span class=\"pe-stage-icon\">${esc(stage.icon)}<\/span>\r\n          <span class=\"pe-stage-name\">${esc(stage.name)}<\/span>\r\n          <span class=\"pe-stage-tag\">${esc(stage.tagline)}<\/span>\r\n        <\/button>\r\n      `).join(\"\");\r\n  }\r\n\r\n  function showStage(stage){\r\n    currentStage = stage;\r\n    document.getElementById(\"peStagesView\").classList.remove(\"active\");\r\n    document.getElementById(\"peRouteView\").classList.add(\"active\");\r\n    document.getElementById(\"peBackButton\").hidden = false;\r\n    document.getElementById(\"peRouteTitle\").textContent =\r\n      \"Level 4 \u00b7 Personal Evolution \u00b7 \" + stage.name;\r\n\r\n    document.getElementById(\"peOptions\").innerHTML =\r\n      stage.options.map((option,optionIndex) => `\r\n        <article class=\"pe-option\">\r\n          <h3>${optionIndex + 1}. ${esc(option.name)}<\/h3>\r\n          <div class=\"pe-leaves\">\r\n            ${option.leaves.map((leaf,leafIndex) => `\r\n              <button class=\"pe-leaf\" type=\"button\"\r\n                data-pe-option=\"${optionIndex}\"\r\n                data-pe-leaf=\"${leafIndex}\">\r\n                ${esc(leaf)}\r\n              <\/button>\r\n            `).join(\"\")}\r\n          <\/div>\r\n        <\/article>\r\n      `).join(\"\");\r\n\r\n    document.getElementById(\"peHostTitle\").textContent = \"Choose a leaf\";\r\n    document.getElementById(\"peHostCount\").textContent = \"\";\r\n    document.getElementById(\"peHostGrid\").innerHTML =\r\n      '<div class=\"pe-empty\">Select one leaf to see its connected Personal Evolution hosts.<\/div>';\r\n  }\r\n\r\n  function showStages(){\r\n    currentStage = null;\r\n    document.getElementById(\"peStagesView\").classList.add(\"active\");\r\n    document.getElementById(\"peRouteView\").classList.remove(\"active\");\r\n    document.getElementById(\"peBackButton\").hidden = true;\r\n  }\r\n\r\n  function renderHosts(option,leaf){\r\n    document.querySelectorAll(\"#tc2EvolutionPage .pe-leaf\").forEach(btn => {\r\n      btn.classList.toggle(\r\n        \"selected\",\r\n        Number(btn.dataset.peOption) === currentStage.options.indexOf(option) &&\r\n        Number(btn.dataset.peLeaf) === option.leaves.indexOf(leaf)\r\n      );\r\n    });\r\n\r\n    const hosts = inventory\r\n      .filter(host => matches(host,currentStage,option,leaf))\r\n      .sort((a,b) =>\r\n        Number(b.featured || 0) - Number(a.featured || 0) ||\r\n        Number(a.order || 999) - Number(b.order || 999)\r\n      );\r\n\r\n    document.getElementById(\"peHostTitle\").textContent = leaf;\r\n    document.getElementById(\"peHostCount\").textContent =\r\n      `${hosts.length} connected ${hosts.length === 1 ? \"host\" : \"hosts\"}`;\r\n\r\n    if(!hosts.length){\r\n      document.getElementById(\"peHostGrid\").innerHTML = `\r\n        <div class=\"pe-empty\">\r\n          No active host is connected yet to:<br>\r\n          <strong>${esc(currentStage.name)} \u2192 ${esc(option.name)} \u2192 ${esc(leaf)}<\/strong>\r\n        <\/div>`;\r\n      return;\r\n    }\r\n\r\n    document.getElementById(\"peHostGrid\").innerHTML = hosts.map(host => {\r\n      const image = getImage(host);\r\n      const website = safeUrl(host.websiteUrl || host.url);\r\n      const reserve = safeUrl(host.reserveUrl || host.checkoutUrl);\r\n      const location = host.location || host.city || \"\";\r\n      const price = host.price || \"\";\r\n      return `\r\n        <article class=\"pe-host-card\">\r\n          <div class=\"pe-host-image\"\r\n            ${image ? `style=\"background-image:url('${esc(image)}')\"` : \"\"}><\/div>\r\n          <div class=\"pe-host-body\">\r\n            <div class=\"pe-host-route\">${esc(currentStage.name)} \u2192 ${esc(option.name)} \u2192 ${esc(leaf)}<\/div>\r\n            <h4>${esc(host.name || host.title || \"Personal Evolution Host\")}<\/h4>\r\n            <div class=\"pe-host-meta\">\r\n              ${location ? `<span class=\"pe-chip\">${esc(location)}<\/span>` : \"\"}\r\n              ${price ? `<span class=\"pe-chip\">${esc(price)}<\/span>` : \"\"}\r\n            <\/div>\r\n            <p>${esc(host.description || host.desc || \"\")}<\/p>\r\n            <div class=\"pe-host-actions\">\r\n              ${website ? `<button class=\"pe-host-btn\" type=\"button\" data-pe-url=\"${esc(website)}\">Website<\/button>` : \"\"}\r\n              ${reserve ? `<button class=\"pe-host-btn primary\" type=\"button\" data-pe-url=\"${esc(reserve)}\">Reserve<\/button>` : \"\"}\r\n            <\/div>\r\n          <\/div>\r\n        <\/article>`;\r\n    }).join(\"\");\r\n  }\r\n\r\n  async function openEvolution(){\r\n    await loadInventory();\r\n    showStages();\r\n    showTC2Page(\"tc2EvolutionPage\");\r\n  }\r\n\r\n  function returnHome(){\r\n    showTC2Page(\"tc2HomePage\");\r\n  }\r\n\r\n  function buttonIsUnlocked(button){\r\n    if(window.BlissTravelGate &&\r\n       typeof window.BlissTravelGate.canUseEvolution === \"function\"){\r\n      return window.BlissTravelGate.canUseEvolution();\r\n    }\r\n\r\n    return !button.classList.contains(\"is-locked\") &&\r\n      !button.classList.contains(\"tc2-vault-locked\") &&\r\n      button.getAttribute(\"aria-disabled\") !== \"true\";\r\n  }\r\n\r\n  function connectRealButton(){\r\n    const button = document.getElementById(\"tc2MainEvolution\");\r\n    if(!button || button.dataset.peConnected === \"1\") return false;\r\n\r\n    button.dataset.peConnected = \"1\";\r\n    button.addEventListener(\"click\",function(event){\r\n      if(!buttonIsUnlocked(button)){\r\n        return; \/\/ preserve the existing Level 4 membership gate\r\n      }\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      event.stopImmediatePropagation();\r\n      openEvolution();\r\n    },true);\r\n\r\n    return true;\r\n  }\r\n\r\n  function install(){\r\n    const overlay = document.getElementById(\"tc2Overlay\");\r\n    if(!overlay) return false;\r\n\r\n    if(!document.getElementById(\"tc2EvolutionPage\")){\r\n  const mount =\r\n    document.querySelector(\"#tc2Overlay .tc2-wrap\");\r\n\r\n  if(!mount){\r\n    console.error(\r\n      \"[Personal Evolution] The Bliss Travel .tc2-wrap container was not found.\"\r\n    );\r\n    return false;\r\n  }\r\n\r\n  mount.insertAdjacentHTML(\r\n    \"beforeend\",\r\n    pageHTML()\r\n  );\r\n}\r\n\r\n    renderStages();\r\n\r\n    document.getElementById(\"peStageGrid\").addEventListener(\"click\",event => {\r\n      const button = event.target.closest(\"[data-pe-stage]\");\r\n      if(!button) return;\r\n      const stage = STRUCTURE.find(item => item.id === button.dataset.peStage);\r\n      if(stage) showStage(stage);\r\n    });\r\n\r\n    document.getElementById(\"peOptions\").addEventListener(\"click\",event => {\r\n      const button = event.target.closest(\"[data-pe-option][data-pe-leaf]\");\r\n      if(!button || !currentStage) return;\r\n      const option = currentStage.options[Number(button.dataset.peOption)];\r\n      const leaf = option && option.leaves[Number(button.dataset.peLeaf)];\r\n      if(option && leaf) renderHosts(option,leaf);\r\n    });\r\n\r\n    document.getElementById(\"peHostGrid\").addEventListener(\"click\",event => {\r\n      const button = event.target.closest(\"[data-pe-url]\");\r\n      if(button) window.open(button.dataset.peUrl,\"_blank\",\"noopener\");\r\n    });\r\n\r\n    document.getElementById(\"peBackButton\").addEventListener(\"click\",showStages);\r\n    document.getElementById(\"peHomeButton\").addEventListener(\"click\",returnHome);\r\n\r\n    connectRealButton();\r\n\r\n    window.BlissPersonalEvolution = {\r\n      open:openEvolution,\r\n      close:returnHome,\r\n      reload:loadInventory,\r\n      structure:STRUCTURE\r\n    };\r\n\r\n    return true;\r\n  }\r\n\r\n  function boot(){\r\n    if(install()) return;\r\n\r\n    let attempts = 0;\r\n    const timer = setInterval(function(){\r\n      attempts++;\r\n      if(install() || attempts > 100) clearInterval(timer);\r\n    },200);\r\n\r\n    new MutationObserver(function(){\r\n      connectRealButton();\r\n    }).observe(document.documentElement,{childList:true,subtree:true});\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\"DOMContentLoaded\",boot,{once:true});\r\n  }else{\r\n    boot();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  const params =\r\n    new URLSearchParams(\r\n      window.location.search\r\n    );\r\n\r\n  if(\r\n    params.get(\"travelclub\") !== \"1\"\r\n  ){\r\n    return;\r\n  }\r\n\r\n  const FAMILY_MODE_KEY =\r\n    \"BLISS_FAMILY_MODE_V1\";\r\n\r\n  const ACTIVE_TRIP_KEY =\r\n    \"BLISS_ACTIVE_FAMILY_TRIP_V1\";\r\n\r\n  const ACTIVE_TRAVELER_KEY =\r\n    \"BLISS_ACTIVE_FAMILY_TRAVELER_V1\";\r\n\r\n  const FAMILY_ACCESS_KEY =\r\n    \"BLISS_FAMILY_ACCESS_V1\";\r\n\r\n\r\n  let familyMode = false;\r\n  let tripCode = \"\";\r\n  let traveler = null;\r\n  let access = null;\r\n\r\n\r\n  try{\r\n\r\n    familyMode =\r\n      sessionStorage.getItem(\r\n        FAMILY_MODE_KEY\r\n      ) === \"1\";\r\n\r\n    tripCode =\r\n      sessionStorage.getItem(\r\n        ACTIVE_TRIP_KEY\r\n      ) || \"\";\r\n\r\n    traveler =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          ACTIVE_TRAVELER_KEY\r\n        ) || \"null\"\r\n      );\r\n\r\n    access =\r\n      JSON.parse(\r\n        sessionStorage.getItem(\r\n          FAMILY_ACCESS_KEY\r\n        ) || \"null\"\r\n      );\r\n\r\n  }catch(error){\r\n\r\n    console.warn(\r\n      \"[Bliss Family] Could not read Family session.\",\r\n      error\r\n    );\r\n\r\n    return;\r\n  }\r\n\r\n\r\n  if(\r\n  !familyMode ||\r\n  !tripCode ||\r\n  !traveler ||\r\n  !traveler.id ||\r\n  !access ||\r\n  access.active !== true\r\n){\r\n  return;\r\n}\r\n\r\n  const levels =\r\n    Array.isArray(\r\n      access.ownedLevels\r\n    )\r\n      ? access.ownedLevels\r\n          .map(Number)\r\n          .filter(function(level){\r\n            return (\r\n              Number.isFinite(level) &&\r\n              level >= 1 &&\r\n              level <= 8\r\n            );\r\n          })\r\n      : [1];\r\n\r\n\r\n  if(!levels.includes(1)){\r\n    levels.push(1);\r\n  }\r\n\r\n\r\n  window.BlissFamilyAccess = {\r\n\r\n    active:true,\r\n\r\n    tripCode:tripCode,\r\n\r\n    tripId:\r\n      access.tripId || \"\",\r\n\r\n    tripName:\r\n      access.tripName || \"\",\r\n\r\n    destination:\r\n      access.destination || \"\",\r\n\r\n    ownerUserId:\r\n      Number(\r\n        access.ownerUserId || 0\r\n      ),\r\n\r\n    ownerName:\r\n      access.ownerName || \"\",\r\n\r\n    ownedLevels:\r\n      Array.from(\r\n        new Set(levels)\r\n      ),\r\n\r\n    traveler:traveler\r\n  };\r\n\r\n\r\n console.log(\r\n  \"[Bliss Family] Entitlements active.\",\r\n  window.BlissFamilyAccess\r\n);\r\n\r\n\r\n\/*\r\n * FAMILY CONTROLS\r\n * Switch traveler \/ leave family\r\n *\/\r\nconst menuList =\r\n  document.querySelector(\r\n    \"#tc2MenuPanel .tc2-menuList\"\r\n  );\r\n\r\nif(menuList){\r\n\r\n  const switchButton =\r\n    document.createElement(\"button\");\r\n\r\n  switchButton.type = \"button\";\r\n  switchButton.className =\r\n    \"tc2-menuLink\";\r\n\r\n  switchButton.textContent =\r\n    \"Switch Traveler\";\r\n\r\n\r\n  const leaveButton =\r\n    document.createElement(\"button\");\r\n\r\n  leaveButton.type = \"button\";\r\n  leaveButton.className =\r\n    \"tc2-menuLink\";\r\n\r\n  leaveButton.textContent =\r\n    \"Leave Family\";\r\n\r\n\r\n  switchButton.addEventListener(\r\n    \"click\",\r\n    function(){\r\n\r\n      try{\r\n\r\n        sessionStorage.removeItem(\r\n          ACTIVE_TRAVELER_KEY\r\n        );\r\n\r\n      }catch(error){}\r\n\r\n      window.location.href =\r\n  \"https:\/\/godsgalaxygame.com\/GGG\/pisces\/?familyjourney=1\";\r\n\r\n    }\r\n  );\r\n\r\n\r\n  leaveButton.addEventListener(\r\n    \"click\",\r\n    function(){\r\n\r\n      try{\r\n\r\n        sessionStorage.removeItem(\r\n          FAMILY_MODE_KEY\r\n        );\r\n\r\n        sessionStorage.removeItem(\r\n          ACTIVE_TRIP_KEY\r\n        );\r\n\r\n        sessionStorage.removeItem(\r\n          ACTIVE_TRAVELER_KEY\r\n        );\r\n\r\n        sessionStorage.removeItem(\r\n          FAMILY_ACCESS_KEY\r\n        );\r\n\r\n      }catch(error){}\r\n\r\n      window.location.href =\r\n        window.location.origin +\r\n        window.location.pathname;\r\n\r\n    }\r\n  );\r\n\r\n\r\n  menuList.appendChild(\r\n    switchButton\r\n  );\r\n\r\n  menuList.appendChild(\r\n    leaveButton\r\n  );\r\n\r\n}\r\n\r\n\/*\r\n * FAMILY IDENTITY BAR\r\n *\/\r\nconst overlay =\r\n  document.getElementById(\r\n    \"tc2Overlay\"\r\n  );\r\n\r\nif(overlay){\r\n\r\n  const familyBar =\r\n    document.createElement(\"div\");\r\n\r\n  familyBar.id =\r\n    \"blissFamilyIdentityBar\";\r\n\r\n\r\n  const travelerName =\r\n    document.createElement(\"span\");\r\n\r\n  travelerName.className =\r\n    \"blissFamilyTravelerName\";\r\n\r\n  travelerName.textContent =\r\n    traveler.name ||\r\n    \"Traveler\";\r\n\r\n\r\n  const familySwitch =\r\n    document.createElement(\"button\");\r\n\r\n  familySwitch.type =\r\n    \"button\";\r\n\r\n  familySwitch.textContent =\r\n    \"Switch Traveler\";\r\n\r\n\r\n  familySwitch.addEventListener(\r\n    \"click\",\r\n    function(){\r\n\r\n      try{\r\n\r\n        sessionStorage.removeItem(\r\n          ACTIVE_TRAVELER_KEY\r\n        );\r\n\r\n      }catch(error){}\r\n\r\n      window.location.href =\r\n        \"https:\/\/godsgalaxygame.com\/GGG\/pisces\/?familyjourney=1\";\r\n\r\n    }\r\n  );\r\n\r\n\r\n  familyBar.appendChild(\r\n    travelerName\r\n  );\r\n\r\n  familyBar.appendChild(\r\n    familySwitch\r\n  );\r\n\r\n  overlay.appendChild(\r\n    familyBar\r\n  );\r\n\r\n\r\n  const familyBarStyle =\r\n    document.createElement(\"style\");\r\n\r\n  familyBarStyle.textContent = `\r\n\r\n    #blissFamilyIdentityBar{\r\n      position:fixed;\r\n\r\n      top:76px;\r\n      right:18px;\r\n\r\n      z-index:2147483645;\r\n\r\n      display:flex;\r\n      align-items:center;\r\n      gap:10px;\r\n\r\n      max-width:320px;\r\n      min-height:42px;\r\n\r\n      padding:5px 6px 5px 14px;\r\n\r\n      border:1px solid rgba(83,243,255,.28);\r\n      border-radius:999px;\r\n\r\n      background:\r\n        linear-gradient(\r\n          135deg,\r\n          rgba(5,17,34,.96),\r\n          rgba(18,12,42,.96)\r\n        );\r\n\r\n      box-shadow:\r\n        0 0 22px rgba(83,243,255,.12);\r\n\r\n      backdrop-filter:blur(14px);\r\n      -webkit-backdrop-filter:blur(14px);\r\n\r\n      color:#fff;\r\n\r\n      font-family:\r\n        Arial,\r\n        Helvetica,\r\n        sans-serif;\r\n    }\r\n\r\n\r\n    #blissFamilyIdentityBar\r\n    .blissFamilyTravelerName{\r\n\r\n      min-width:0;\r\n\r\n      overflow:hidden;\r\n      text-overflow:ellipsis;\r\n      white-space:nowrap;\r\n\r\n      color:#ffffff;\r\n\r\n      font-size:13px;\r\n      font-weight:900;\r\n\r\n    }\r\n\r\n\r\n    #blissFamilyIdentityBar button{\r\n\r\n      flex:0 0 auto;\r\n\r\n      min-height:32px;\r\n\r\n      padding:0 11px;\r\n\r\n      border:\r\n        1px solid\r\n        rgba(83,243,255,.28);\r\n\r\n      border-radius:999px;\r\n\r\n      background:\r\n        rgba(83,243,255,.09);\r\n\r\n      color:#dffaff;\r\n\r\n      font-size:9px;\r\n      font-weight:900;\r\n\r\n      letter-spacing:.06em;\r\n      text-transform:uppercase;\r\n\r\n      cursor:pointer;\r\n\r\n    }\r\n\r\n\r\n    @media(max-width:900px){\r\n\r\n      #blissFamilyIdentityBar{\r\n\r\n        top:60px !important;\r\nright:18px !important;\r\n\r\n        max-width:\r\n          calc(100vw - 24px);\r\n\r\n        min-height:40px;\r\n\r\n      }\r\n\r\n\r\n      #blissFamilyIdentityBar\r\n      .blissFamilyTravelerName{\r\n\r\n        font-size:12px;\r\n\r\n      }\r\n\r\n\r\n      #blissFamilyIdentityBar button{\r\n\r\n        font-size:8px;\r\n\r\n        padding:0 9px;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  `;\r\n\r\n  document.head.appendChild(\r\n    familyBarStyle\r\n  );\r\n\r\n}\r\n\r\n})();\r\n<\/script>\r\n","protected":false},"excerpt":{"rendered":"<p>Explore Journey Services Story \u2190 \u2630 Bliss Travel A private membership to discover, plan, experience, and remember destinations. Privacy Policy Terms of Use Operations Disclosure MEDAYORK BLISS Travel Your membership to destinations, experiences, local services, and unforgettable journeys. Scroll to Enter FREE \u00b7 ONLINE \u2648 Astro Travel Recommendations Choose any of the 12 zodiac signs [&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-7100","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/7100","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=7100"}],"version-history":[{"count":123,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/7100\/revisions"}],"predecessor-version":[{"id":10488,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/7100\/revisions\/10488"}],"wp:attachment":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/media?parent=7100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}