{"data":{"schema":3,"maxNodeId":172994,"subFlows":[{"description":"Free for Registered","pages":[{"name":"pages","id":1966,"notes":"","target":{"allpages":false,"urls":{"kind":"any","data":[]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[159599],"false":[]}}]},{"name":"segpages","id":159599,"notes":"","target":{"allpages":false,"urls":{"kind":"all","data":[{"include":false,"value":"*://*/shenyun/"}]},"categories":{"kind":"all","data":[{"include":false,"value":"ntd-competitions-26628"},{"include":false,"value":"master-li-hongzhi-articles-59302"},{"include":false,"value":"persecution-in-china-46"},{"include":false,"value":"shenyun-13896"},{"include":false,"value":"organ-harvesting-in-china-75906"},{"include":false,"value":"falun-gong-59163"}]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[160430,165142],"false":[]}}]},{"name":"segpages","id":166161,"notes":"","target":{"allpages":false,"urls":{"kind":"all","data":[]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[{"include":true,"value":"ntd-paywall-85755"}]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[170903],"false":[]}}]},{"name":"segpages","id":170903,"notes":"","target":{"allpages":false,"urls":{"kind":"any","data":[{"include":true,"value":"*://*utm_term=free1min"}]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[171071],"false":[172489]}}]},{"name":"segpages","id":166298,"notes":"paid page","target":{"allpages":false,"urls":{"kind":"any","data":[]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[{"include":true,"value":"ntd-paywall-85755"}]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[169736,166573],"false":[163392]}}]},{"name":"segpages","id":164828,"notes":"Social Media  wall","target":{"allpages":false,"urls":{"kind":"any","data":[{"include":true,"value":"*://*utm_term=socmedall"},{"include":true,"value":"*://*utm_term=fbsocial"}]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[172195],"false":[165601]}}]},{"name":"segpages","id":165601,"notes":"Hannah 5s wall","target":{"allpages":false,"urls":{"kind":"any","data":[{"include":true,"value":"*://*housing-crisis_1108839.html"},{"include":true,"value":"*://*to-longevity_1108161"},{"include":true,"value":"*://*in-snap_1108336"},{"include":true,"value":"*://*high_1109348.html"},{"include":true,"value":"*://*take-effect_1110646.html"},{"include":true,"value":"*://*competition_1065183.html"},{"include":true,"value":"*://*beyond_1113753.html"},{"include":true,"value":"*://*year_1109538.html"},{"include":true,"value":"*://*benefits_1071593.html"},{"include":true,"value":"*://*taxpayers_1115471.html"},{"include":true,"value":"*://*concerns_1117018.html"},{"include":true,"value":"*://*adjustments_1095623.html"},{"include":true,"value":"*://*things-to-know_1116954"},{"include":true,"value":"*://*chris-martenson_1149148"},{"include":true,"value":"*://*amie-ichikawa_1148610"},{"include":true,"value":"*://*your-dna_1154651"}]},"categories":{"kind":"all","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[172643],"false":[164333]}}]}],"users":[{"name":"users","id":160440,"notes":"","target":{"loginstatus":{"selected":true,"value":"true","withEst":"or"},"emailverified":{"selected":false,"value":"false"},"rules":{"selected":false,"checkkind":"any","value":[]},"devices":{"selected":false,"checkkind":"any","value":[]},"geocountry":{"selected":false,"include":true,"value":[]},"referred":{"selected":false,"include":true,"value":[]},"cookie":{"selected":false,"keyname":"utm_term","include":false,"value":["nw"]},"localstorage":{"selected":false,"keyname":"","include":true,"value":[]},"onLogin":{},"onSignUp":{},"cookieTimeout":{"keyname":"","period":null}},"flowgate":[{"boolean":{"description":"","true":[166023],"false":[166298]}}]},{"name":"users","id":166023,"notes":"","target":{"loginstatus":{"selected":true,"value":"true","withEst":"or"},"emailverified":{"selected":false,"value":"false"},"onLogin":{"selected":false,"value":"false"},"onSignUp":{"selected":false,"value":"false"},"rules":{"selected":true,"checkkind":"all","value":["full-access"]},"devices":{"selected":false,"checkkind":"any","value":[]},"geocountry":{"selected":false,"include":true,"value":[]},"referred":{"selected":false,"include":true,"value":[]},"cookie":{"selected":false,"keyname":"","include":true,"value":[]},"cookieTimeout":{"selected":false,"keyname":"","period":0,"include":true,"value":[]},"localstorage":{"selected":false,"keyname":"","include":true,"value":[]}},"flowgate":[{"boolean":{"description":"","true":[166821],"false":[166161]}}]},{"name":"users","id":163392,"notes":"","target":{"loginstatus":{"selected":false,"value":"true","withEst":"or"},"emailverified":{"selected":false,"value":"false"},"rules":{"selected":false,"checkkind":"any","value":[]},"devices":{"selected":false,"checkkind":"any","value":[]},"geocountry":{"selected":false,"include":true,"value":[]},"referred":{"selected":false,"include":true,"value":[]},"cookie":{"selected":true,"keyname":"utm_term","include":true,"value":["nw"]},"localstorage":{"selected":false,"keyname":"","include":true,"value":[]},"onLogin":{},"onSignUp":{},"cookieTimeout":{"keyname":"","period":null}},"flowgate":[{"boolean":{"description":"","true":[],"false":[164828]}}]}],"eventAndTriggers":[{"name":"jsdecision","id":165142,"notes":"","template":"return /_\\d+\\.html/.test(window.location.href);","flowgate":[{"boolean":{"description":"","true":[160440],"false":[]}}]},{"name":"jsdecision","id":171071,"notes":"1min check","template":"var key = 'ntd_1min_preview_used:' + location.pathname;\nvar used = localStorage.getItem(key) === '1';\n\nfunction exitFullscreenNow() {\n  try {\n    if (document.fullscreenElement && document.exitFullscreen) {\n      document.exitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (document.webkitFullscreenElement && document.webkitExitFullscreen) {\n      document.webkitExitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    document.querySelectorAll('video').forEach(function(video) {\n      if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n        video.webkitExitFullscreen();\n      }\n    });\n  } catch (e) {}\n}\n\nfunction lockVideosBriefly() {\n  try {\n    document.querySelectorAll('video').forEach(function(video) {\n      video.pause();\n      video.muted = true;\n      video.volume = 0;\n\n      video.setAttribute('playsinline', '');\n      video.setAttribute('webkit-playsinline', '');\n      video.playsInline = true;\n\n      if (video.controlsList) {\n        video.controlsList.add('nofullscreen');\n        video.controlsList.add('nodownload');\n        video.controlsList.add('noremoteplayback');\n      }\n    });\n  } catch (e) {}\n}\n\nif (used) {\n  exitFullscreenNow();\n  lockVideosBriefly();\n\n  setTimeout(function () {\n    exitFullscreenNow();\n    lockVideosBriefly();\n  }, 300);\n\n  setTimeout(function () {\n    exitFullscreenNow();\n    lockVideosBriefly();\n  }, 800);\n}\n\nreturn used;","flowgate":[{"boolean":{"description":"","true":[171172],"false":[171276,171305]}}]},{"name":"jsdecision","id":172489,"notes":"quit full","template":"function tryExitFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    if (doc.fullscreenElement && doc.exitFullscreen) {\n      doc.exitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.webkitFullscreenElement && doc.webkitExitFullscreen) {\n      doc.webkitExitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.mozFullScreenElement && doc.mozCancelFullScreen) {\n      doc.mozCancelFullScreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.msFullscreenElement && doc.msExitFullscreen) {\n      doc.msExitFullscreen();\n    }\n  } catch (e) {}\n}\n\nfunction exitVideoFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    doc.querySelectorAll(\"video\").forEach(function (video) {\n      try {\n        if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n          video.webkitExitFullscreen();\n        }\n      } catch (e) {}\n    });\n  } catch (e) {}\n}\n\nfunction quitFullScreen() {\n  tryExitFullscreen(document);\n  exitVideoFullscreen(document);\n\n  try {\n    if (window.top && window.top.document && window.top.document !== document) {\n      tryExitFullscreen(window.top.document);\n      exitVideoFullscreen(window.top.document);\n    }\n  } catch (e) {}\n}\n\n// 先马上退一次\nquitFullScreen();\n\n// 2秒后再退一次\nsetTimeout(quitFullScreen, 2000);\n\n// 补几次，防止手机端第一次没退出来\nsetTimeout(quitFullScreen, 2500);\nsetTimeout(quitFullScreen, 3000);\n\nreturn true;","flowgate":[{"boolean":{"description":"","true":[171530],"false":[]}}]},{"name":"jsdecision","id":172195,"notes":"quit full","template":"function tryExitFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    if (doc.fullscreenElement && doc.exitFullscreen) {\n      doc.exitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.webkitFullscreenElement && doc.webkitExitFullscreen) {\n      doc.webkitExitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.mozFullScreenElement && doc.mozCancelFullScreen) {\n      doc.mozCancelFullScreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.msFullscreenElement && doc.msExitFullscreen) {\n      doc.msExitFullscreen();\n    }\n  } catch (e) {}\n}\n\nfunction exitVideoFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    doc.querySelectorAll(\"video\").forEach(function (video) {\n      try {\n        if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n          video.webkitExitFullscreen();\n        }\n      } catch (e) {}\n    });\n  } catch (e) {}\n}\n\nfunction quitFullScreen() {\n  tryExitFullscreen(document);\n  exitVideoFullscreen(document);\n\n  try {\n    if (window.top && window.top.document && window.top.document !== document) {\n      tryExitFullscreen(window.top.document);\n      exitVideoFullscreen(window.top.document);\n    }\n  } catch (e) {}\n}\n\n// 先马上退一次\nquitFullScreen();\n\n// 2秒后再退一次\nsetTimeout(quitFullScreen, 2000);\n\n// 补几次，防止手机端第一次没退出来\nsetTimeout(quitFullScreen, 2500);\nsetTimeout(quitFullScreen, 3000);\n\nreturn true;","flowgate":[{"boolean":{"description":"","true":[164859],"false":[]}}]},{"name":"jsdecision","id":172643,"notes":"quit full","template":"function tryExitFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    if (doc.fullscreenElement && doc.exitFullscreen) {\n      doc.exitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.webkitFullscreenElement && doc.webkitExitFullscreen) {\n      doc.webkitExitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.mozFullScreenElement && doc.mozCancelFullScreen) {\n      doc.mozCancelFullScreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.msFullscreenElement && doc.msExitFullscreen) {\n      doc.msExitFullscreen();\n    }\n  } catch (e) {}\n}\n\nfunction exitVideoFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    doc.querySelectorAll(\"video\").forEach(function (video) {\n      try {\n        if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n          video.webkitExitFullscreen();\n        }\n      } catch (e) {}\n    });\n  } catch (e) {}\n}\n\nfunction quitFullScreen() {\n  tryExitFullscreen(document);\n  exitVideoFullscreen(document);\n\n  try {\n    if (window.top && window.top.document && window.top.document !== document) {\n      tryExitFullscreen(window.top.document);\n      exitVideoFullscreen(window.top.document);\n    }\n  } catch (e) {}\n}\n\n// 不马上退出全屏，6秒后才退出\nsetTimeout(quitFullScreen, 6000);\n\n// 6秒后补几次\nsetTimeout(quitFullScreen, 6500);\nsetTimeout(quitFullScreen, 7000);\nsetTimeout(quitFullScreen, 7500);\n\n// JS Decision 仍然要马上 return true\nreturn true;","flowgate":[{"boolean":{"description":"","true":[165702],"false":[]}}]},{"name":"pageviewmeter","id":164333,"notes":"10pages/30 days wall","target":{"expireAt":10,"reset":{"value":30,"unit":"days"},"countSamePage":false},"flowgate":[{"meter_value":{"description":"","type":"expired","equals":0,"increments":{"start_at":0,"every":1},"execution":[172857]}}]},{"name":"jsdecision","id":172857,"notes":"quit full","template":"function tryExitFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    if (doc.fullscreenElement && doc.exitFullscreen) {\n      doc.exitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.webkitFullscreenElement && doc.webkitExitFullscreen) {\n      doc.webkitExitFullscreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.mozFullScreenElement && doc.mozCancelFullScreen) {\n      doc.mozCancelFullScreen();\n    }\n  } catch (e) {}\n\n  try {\n    if (doc.msFullscreenElement && doc.msExitFullscreen) {\n      doc.msExitFullscreen();\n    }\n  } catch (e) {}\n}\n\nfunction exitVideoFullscreen(doc) {\n  if (!doc) return;\n\n  try {\n    doc.querySelectorAll(\"video\").forEach(function (video) {\n      try {\n        if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n          video.webkitExitFullscreen();\n        }\n      } catch (e) {}\n    });\n  } catch (e) {}\n}\n\nfunction quitFullScreen() {\n  tryExitFullscreen(document);\n  exitVideoFullscreen(document);\n\n  try {\n    if (window.top && window.top.document && window.top.document !== document) {\n      tryExitFullscreen(window.top.document);\n      exitVideoFullscreen(window.top.document);\n    }\n  } catch (e) {}\n}\n\n\nquitFullScreen();\n\n// 2秒后再退一次\nsetTimeout(quitFullScreen, 2000);\n\n// 补几次，\nsetTimeout(quitFullScreen, 2500);\nsetTimeout(quitFullScreen, 3000);\n\nreturn true;","flowgate":[{"boolean":{"description":"","true":[160448],"false":[]}}]}],"actions":[{"name":"runjs","id":160430,"notes":"","style":"js","template":"function setCookie(name, value, days) {\n  const date = new Date();\n  date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n  const expires = date.toUTCString();\n  document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;\n}\nlet params = new URLSearchParams(document.location.search);\nlet value = params.get(\"utm_term\");\nif (!!value) setCookie(\"utm_term\", value, 7);"},{"name":"runjs","id":166821,"notes":"unmute JS","style":"js","template":"(function () {\n  function unmuteAndPlayMediaInDoc(doc) {\n    if (!doc) return;\n\n    const medias = doc.querySelectorAll('video, audio');\n\n    medias.forEach(function (media) {\n      try {\n        media.muted = false;\n        media.defaultMuted = false;\n        media.volume = 1;\n\n        // Auto play / resume\n        const playPromise = media.play();\n\n        if (playPromise && typeof playPromise.catch === 'function') {\n          playPromise.catch(function (e) {\n            console.warn('Auto play blocked or failed:', e);\n          });\n        }\n      } catch (e) {}\n    });\n  }\n\n  function unmuteAndPlayBackgroundMedia() {\n    // stop mute timer\n    try {\n      if (window.__ntdPaywallMuteTimer) {\n        clearInterval(window.__ntdPaywallMuteTimer);\n        window.__ntdPaywallMuteTimer = null;\n      }\n    } catch (e) {}\n\n    // current page / iframe\n    try {\n      unmuteAndPlayMediaInDoc(document);\n    } catch (e) {}\n\n    // parent page\n    try {\n      if (window.parent && window.parent !== window) {\n        unmuteAndPlayMediaInDoc(window.parent.document);\n      }\n    } catch (e) {}\n\n    // notify parent/player\n    try {\n      window.parent.postMessage({\n        event_id: 'paywall.unmute_media',\n        action: 'unmute_and_play'\n      }, '*');\n    } catch (e) {}\n  }\n\n  unmuteAndPlayBackgroundMedia();\n})();"},{"name":"showtemplate","id":171172,"notes":"paywall","templateId":"ntd-paywall-1min-free","type":"noniframe","style":"popup","version":"","selector":"","modalClass":"","modalStyle":"","wallTemplateId":"","wallOffers":"","wallAction":"","wallType":null,"resizable":true,"sizes":[{"minSize":"1","maxSize":"600","widthValue":100,"heightValue":0,"widthUnit":"%","heightUnit":"%"}],"customParams":[],"trackingParams":[],"width":"718px","height":"402px","showCloseButton":false,"overlappable":false,"trigger":null},{"name":"showtemplate","id":171276,"notes":"paywall","templateId":"ntd-paywall-1min-free","type":"noniframe","style":"popup","version":"","selector":"","modalClass":"","modalStyle":"","wallTemplateId":"","wallOffers":"","wallAction":"","wallType":null,"resizable":true,"sizes":[{"minSize":"1","maxSize":"600","widthValue":100,"heightValue":0,"widthUnit":"%","heightUnit":"%"}],"customParams":[],"trackingParams":[],"width":"718px","height":"402px","showCloseButton":false,"overlappable":false,"trigger":{"type":"delay","delaySec":30,"scrollPercentage":10,"scrollDenominatorSelector":null}},{"name":"runjs","id":171305,"notes":"remember 1min","style":"js","template":"setTimeout(function () {\n  var key = 'ntd_1min_preview_used:' + location.pathname;\n\n  try {\n    localStorage.setItem(key, '1');\n    sessionStorage.setItem('ntd_1min_preview_locked', '1');\n    console.log('[PW] 1min preview locked:', key);\n  } catch (e) {}\n\n  function exitAllFullscreen() {\n    try {\n      if (document.fullscreenElement && document.exitFullscreen) {\n        document.exitFullscreen();\n      }\n    } catch (e) {}\n\n    try {\n      if (document.webkitFullscreenElement && document.webkitExitFullscreen) {\n        document.webkitExitFullscreen();\n      }\n    } catch (e) {}\n\n    try {\n      if (document.mozFullScreenElement && document.mozCancelFullScreen) {\n        document.mozCancelFullScreen();\n      }\n    } catch (e) {}\n\n    try {\n      if (document.msFullscreenElement && document.msExitFullscreen) {\n        document.msExitFullscreen();\n      }\n    } catch (e) {}\n  }\n\n  function lockVideo(video) {\n    try {\n      video.pause();\n      video.muted = true;\n      video.volume = 0;\n\n      video.controls = false;\n      video.removeAttribute('controls');\n      video.style.pointerEvents = 'none';\n\n      if (!video.dataset.ntdPreviewLocked) {\n        video.dataset.ntdPreviewLocked = '1';\n\n        video.addEventListener('play', function () {\n          try {\n            video.pause();\n            video.muted = true;\n            video.volume = 0;\n          } catch (e) {}\n        }, true);\n\n        video.addEventListener('playing', function () {\n          try {\n            video.pause();\n            video.muted = true;\n            video.volume = 0;\n          } catch (e) {}\n        }, true);\n\n        video.addEventListener('volumechange', function () {\n          try {\n            video.muted = true;\n            video.volume = 0;\n          } catch (e) {}\n        }, true);\n      }\n\n      if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n        video.webkitExitFullscreen();\n      }\n    } catch (e) {}\n  }\n\n  function lockAllVideos() {\n    exitAllFullscreen();\n\n    document.querySelectorAll('video').forEach(function(video) {\n      lockVideo(video);\n    });\n  }\n\n  lockAllVideos();                 // 32秒\n  setTimeout(lockAllVideos, 2000); // 34秒\n  setTimeout(lockAllVideos, 4000); // 36秒\n\n  var lockCount = 0;\n  var lockTimer = setInterval(function () {\n    lockAllVideos();\n    lockCount++;\n\n    if (lockCount >= 20) {\n      clearInterval(lockTimer);\n    }\n  }, 250);\n\n}, 32000);"},{"name":"showtemplate","id":171530,"notes":"direct paywall","templateId":"ntd-paywall","type":"noniframe","style":"popup","version":"","selector":"","modalClass":"","modalStyle":"","wallTemplateId":"","wallOffers":"","wallAction":"","wallType":null,"resizable":true,"sizes":[{"minSize":"1","maxSize":"600","widthValue":100,"heightValue":0,"widthUnit":"%","heightUnit":"%"}],"customParams":[],"trackingParams":[],"width":"718px","height":"376px","showCloseButton":false,"overlappable":false,"trigger":null},{"name":"runjs","id":169736,"notes":"15s quit full mute","style":"js","template":"(function () {\n  if (window.__ntd15sLockStarted) return;\n  window.__ntd15sLockStarted = true;\n\n  // clear old mute timer if previous mute JS created one\n  try {\n    if (window.__ntdPaywallMuteTimer) {\n      clearInterval(window.__ntdPaywallMuteTimer);\n      window.__ntdPaywallMuteTimer = null;\n    }\n  } catch (e) {}\n\n  function exitFullscreenInDoc(doc) {\n    if (!doc) return;\n\n    try {\n      if (doc.fullscreenElement && doc.exitFullscreen) {\n        doc.exitFullscreen();\n      }\n    } catch (e) {}\n\n    try {\n      if (doc.webkitFullscreenElement && doc.webkitExitFullscreen) {\n        doc.webkitExitFullscreen();\n      }\n    } catch (e) {}\n\n    try {\n      doc.querySelectorAll('video').forEach(function(video) {\n        if (video.webkitDisplayingFullscreen && video.webkitExitFullscreen) {\n          video.webkitExitFullscreen();\n        }\n      });\n    } catch (e) {}\n  }\n\n  function lockMediaInDoc(doc) {\n    if (!doc) return;\n\n    try {\n      doc.querySelectorAll('video, audio').forEach(function(media) {\n        try {\n          media.pause();\n          media.muted = true;\n          media.defaultMuted = true;\n          media.volume = 0;\n\n          if (media.tagName && media.tagName.toLowerCase() === 'video') {\n            media.setAttribute('playsinline', '');\n            media.setAttribute('webkit-playsinline', '');\n            media.playsInline = true;\n\n            if (media.controlsList) {\n              media.controlsList.add('nofullscreen');\n              media.controlsList.add('nodownload');\n              media.controlsList.add('noremoteplayback');\n            }\n\n            if (!media.dataset.ntdRegWallLocked) {\n              media.dataset.ntdRegWallLocked = '1';\n\n              media.addEventListener('play', function () {\n                try {\n                  media.pause();\n                  media.muted = true;\n                  media.volume = 0;\n                } catch (e) {}\n              }, true);\n\n              media.addEventListener('playing', function () {\n                try {\n                  media.pause();\n                  media.muted = true;\n                  media.volume = 0;\n                } catch (e) {}\n              }, true);\n            }\n          }\n        } catch (e) {}\n      });\n    } catch (e) {}\n  }\n\n  function lockAll() {\n    try {\n      exitFullscreenInDoc(document);\n      lockMediaInDoc(document);\n    } catch (e) {}\n\n    try {\n      if (window.parent && window.parent !== window) {\n        exitFullscreenInDoc(window.parent.document);\n        lockMediaInDoc(window.parent.document);\n      }\n    } catch (e) {}\n\n    try {\n      window.parent.postMessage({\n        event_id: 'paywall.mute_media',\n        action: 'mute'\n      }, '*');\n    } catch (e) {}\n  }\n\n  setTimeout(function () {\n    lockAll();\n\n    setTimeout(lockAll, 1000);\n    setTimeout(lockAll, 2000);\n\n    var count = 0;\n    var timer = setInterval(function () {\n      lockAll();\n      count++;\n\n      if (count >= 20) {\n        clearInterval(timer);\n      }\n    }, 250);\n\n  }, 10000);\n})();"},{"name":"showtemplate","id":166573,"notes":"registration before paywall","templateId":"sign-in-combo","type":"noniframe","style":"popup","version":"","selector":"","sizes":[{"minSize":"600","maxSize":10000,"widthValue":"600","heightValue":"600","widthUnit":"px","heightUnit":"px"},{"minSize":"1","maxSize":"599","widthValue":"100","heightValue":100,"widthUnit":"%","heightUnit":"%"}],"width":"630px","height":"647px","showCloseButton":false,"overlappable":false,"resizable":true,"modalClass":"","modalStyle":"","customParams":[{"name":"title","value":"aaa"}],"wallTemplateId":"","wallOffers":"","trackingParams":[],"trigger":{"type":"delay","delaySec":8,"scrollPercentage":10}},{"name":"showtemplate","id":164859,"notes":"","templateId":"sign-in-combo","type":"noniframe","style":"popup","version":"","selector":"","sizes":[{"minSize":"600","maxSize":10000,"widthValue":"600","heightValue":"600","widthUnit":"px","heightUnit":"px"},{"minSize":"1","maxSize":"599","widthValue":"100","heightValue":100,"widthUnit":"%","heightUnit":"%"}],"width":"630px","height":"647px","showCloseButton":false,"overlappable":false,"resizable":true,"modalClass":"","modalStyle":"","customParams":[{"name":"title","value":"aaa"}],"wallTemplateId":"","wallOffers":"","trackingParams":[]},{"name":"showtemplate","id":165702,"notes":"","templateId":"sign-in-combo","type":"noniframe","style":"popup","version":"","selector":"","sizes":[{"minSize":"600","maxSize":10000,"widthValue":"600","heightValue":"600","widthUnit":"px","heightUnit":"px"},{"minSize":"1","maxSize":"599","widthValue":"100","heightValue":100,"widthUnit":"%","heightUnit":"%"}],"width":"630px","height":"647px","showCloseButton":false,"overlappable":false,"resizable":true,"modalClass":"","modalStyle":"","customParams":[],"trackingParams":[],"wallTemplateId":"","wallOffers":"","trigger":{"type":"delay","delaySec":5,"scrollPercentage":10}},{"name":"showtemplate","id":160448,"notes":"","templateId":"sign-in-combo","type":"noniframe","style":"popup","version":"","selector":"","sizes":[{"minSize":"600","maxSize":10000,"widthValue":"600","heightValue":"600","widthUnit":"px","heightUnit":"px"},{"minSize":"1","maxSize":"599","widthValue":"100","heightValue":100,"widthUnit":"%","heightUnit":"%"}],"width":"630px","height":"647px","showCloseButton":false,"overlappable":false,"resizable":true,"modalClass":"","modalStyle":"","customParams":[{"name":"title","value":"aaa"}],"wallTemplateId":"","wallOffers":"","trackingParams":[]}],"componentRefs":[],"continuationNodes":{}},{"description":"Home page","pages":[{"name":"pages","id":170185,"notes":"Home page","target":{"allpages":false,"urls":{"kind":"any","data":[]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"all","data":[{"include":true,"value":"home"}]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[170472],"false":[]}}]}],"users":[{"name":"users","id":170472,"notes":"","target":{"loginstatus":{"selected":false,"value":"true","withEst":"none"},"emailverified":{"selected":false,"value":"false"},"onLogin":{"selected":false,"value":"false"},"onSignUp":{"selected":false,"value":"false"},"rules":{"selected":false,"checkkind":"any","value":[]},"devices":{"selected":true,"checkkind":"any","value":["Desktop","iOS","Android","Tablet","Mobile"]},"geocountry":{"selected":false,"include":true,"value":[]},"referred":{"selected":false,"include":true,"value":[]},"cookie":{"selected":false,"keyname":"","include":true,"value":[]},"cookieTimeout":{"selected":false,"keyname":"","period":0,"include":true,"value":[]},"localstorage":{"selected":false,"keyname":"","include":true,"value":[]}},"flowgate":[{"boolean":{"description":"","true":[170328],"false":[]}}]}],"eventAndTriggers":[],"actions":[{"name":"runjs","id":170328,"notes":"Show World Cup Iframe","style":"js","template":"showWorldCupIframe();\n\nfunction showWorldCupIframe() {\n  var iframeUrl = \"https://usworldcup2026.s3.us-west-1.amazonaws.com/worldcup/worldcup2026_en_v3.html\";\n  var insertId = \"worldcup-under-ntd-tv-dots\";\n  var iframeHeight = 600;\n\n  function getDoc() {\n    try {\n      if (window.top && window.top.document) return window.top.document;\n    } catch (e) {}\n    return document;\n  }\n\n  function getWin(doc) {\n    return doc.defaultView || window;\n  }\n\n  function removeOldTests(doc) {\n    [\n      \"worldcup-test-under-ntd-tv\",\n      \"worldcup-under-ntd-tv-dots-test\",\n      \"worldcup-iframe-under-ntd-tv\"\n    ].forEach(function (id) {\n      var old = doc.getElementById(id);\n      if (old) old.remove();\n    });\n  }\n\n  function isVisible(el) {\n    if (!el) return false;\n\n    var rect = el.getBoundingClientRect();\n    var style = getWin(getDoc()).getComputedStyle(el);\n\n    return (\n      style.display !== \"none\" &&\n      style.visibility !== \"hidden\" &&\n      rect.width > 0 &&\n      rect.height > 0\n    );\n  }\n\n  function cleanText(str) {\n    return String(str || \"\").replace(/\\s+/g, \" \").trim();\n  }\n\n  // 电脑端：完全保留你原来的 selector 逻辑\n  function findDesktopLiveStreamEle(doc) {\n    var selector = \".relative.flex.w-full.flex-col.justify-start.gap-y-2.border-b.border-gray-200.pb-\\\\[40px\\\\].md\\\\:border-b-0\";\n    var el = doc.querySelector(selector);\n\n    if (el && isVisible(el)) {\n      return el;\n    }\n\n    return null;\n  }\n\n  // 手机端：找 NTD Television 24/7 所在的整块直播区域\n  function findMobileLiveStreamEle(doc) {\n    var nodes = doc.querySelectorAll(\"h1,h2,h3,h4,h5,h6,div,p,span,strong\");\n\n    for (var i = 0; i < nodes.length; i++) {\n      var node = nodes[i];\n      var text = cleanText(node.textContent);\n\n      if (\n        text.indexOf(\"NTD Television 24/7\") !== -1 &&\n        text.length < 150 &&\n        isVisible(node)\n      ) {\n        var el = node;\n\n        // 往上找包含 video + title + dots 的 mobile 區塊\n        for (var k = 0; k < 12 && el && el !== doc.body; k++) {\n          var rect = el.getBoundingClientRect();\n          var elText = cleanText(el.textContent);\n\n          if (\n            elText.indexOf(\"NTD Television 24/7\") !== -1 &&\n            rect.width > 250 &&\n            rect.height > 180 &&\n            rect.height < 700 &&\n            isVisible(el)\n          ) {\n            return el;\n          }\n\n          el = el.parentElement;\n        }\n\n        // fallback：如果找不到整块，就插在标题父层下面\n        return node.parentElement || node;\n      }\n    }\n\n    return null;\n  }\n\n  function insertIframe() {\n    var doc = getDoc();\n    var win = getWin(doc);\n\n    removeOldTests(doc);\n\n    var old = doc.getElementById(insertId);\n    if (old) {\n      if (isVisible(old)) return true;\n      old.remove();\n    }\n\n    var liveStreamEle = findDesktopLiveStreamEle(doc);\n    var isMobileMode = false;\n\n    // 电脑 selector 找不到，才走手机逻辑\n    if (!liveStreamEle) {\n      liveStreamEle = findMobileLiveStreamEle(doc);\n      isMobileMode = true;\n    }\n\n    if (!liveStreamEle) {\n      console.log(\"[WorldCup] live stream section not found yet\");\n      return false;\n    }\n\n    // 只保留电脑端原来的 hide 行为\n    // 手机端不要 hide，否则容易把文章列表或 mobile section 隐掉\n    if (!isMobileMode) {\n      try {\n        if (liveStreamEle.nextElementSibling) {\n          var articleSectionHeight = liveStreamEle.nextElementSibling.clientHeight;\n          liveStreamEle.nextElementSibling.style.display = \"none\";\n        }\n      } catch (e) {}\n    }\n\n    var finalHeight = isMobileMode || win.innerWidth <= 767 ? 760 : iframeHeight;\n\n    var wrapper = doc.createElement(\"div\");\n    wrapper.id = insertId;\n    wrapper.style.width = \"100%\";\n    wrapper.style.margin = \"18px 0 24px 0\";\n    wrapper.style.position = \"relative\";\n    wrapper.style.zIndex = \"1\";\n    wrapper.style.boxSizing = \"border-box\";\n    wrapper.style.display = \"block\";\n    wrapper.style.visibility = \"visible\";\n    wrapper.style.background = \"#fff\";\n\n    wrapper.innerHTML =\n      '<iframe ' +\n      'src=\"' + iframeUrl + '\" ' +\n      'width=\"100%\" ' +\n      'height=\"' + finalHeight + '\" ' +\n      'style=\"border:0; display:block; width:100%; height:' + finalHeight + 'px; background:#fff;\" ' +\n      'loading=\"eager\" ' +\n      'allowfullscreen>' +\n      '</iframe>';\n\n    liveStreamEle.insertAdjacentElement(\"afterend\", wrapper);\n\n    console.log(\"[WorldCup] iframe inserted\", isMobileMode ? \"mobile\" : \"desktop\");\n\n    return true;\n  }\n\n  var tries = 0;\n  var timer = setInterval(function () {\n    tries++;\n\n    try {\n      if (insertIframe() || tries > 80) {\n        clearInterval(timer);\n      }\n    } catch (e) {\n      console.log(\"[WorldCup] insert error\", e);\n    }\n  }, 400);\n\n  // 真手機上有時 React / Next.js 會後渲染，把插入的東西刷掉\n  // 所以加 MutationObserver，頁面變動後再補插一次\n  try {\n    var doc = getDoc();\n\n    var observer = new MutationObserver(function () {\n      if (!doc.getElementById(insertId)) {\n        insertIframe();\n      }\n    });\n\n    observer.observe(doc.body, {\n      childList: true,\n      subtree: true\n    });\n  } catch (e) {}\n}"}],"componentRefs":[],"continuationNodes":{}},{"description":"Inherit UTM","pages":[{"name":"pages","id":170680,"notes":"","target":{"allpages":false,"urls":{"kind":"any","data":[]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[170690],"false":[]}}]},{"name":"segpages","id":170690,"notes":"","target":{"allpages":false,"urls":{"kind":"any","data":[{"include":true,"value":"*://*divine-messengers"},{"include":true,"value":"*://*william-bouguereau"},{"include":true,"value":"*://*bachs-inspiration"}]},"categories":{"kind":"any","data":[]},"primaryCategories":{"kind":"any","data":[]},"tags":{"kind":"any","data":[]},"terms":{"kind":"any","data":[]},"pageTypes":{"kind":"any","data":[]},"authors":{"kind":"any","data":[]},"postIds":{"kind":"any","data":[]}},"flowgate":[{"boolean":{"description":"","true":[170729],"false":[]}}]}],"users":[],"eventAndTriggers":[],"actions":[{"name":"runjs","id":170729,"notes":"","style":"js","template":"(function () {\n  if (window.__ntdKeepUtmLoadedV2) return;\n  window.__ntdKeepUtmLoadedV2 = true;\n\n  var STORAGE_KEY = 'ntd_keep_utm_v2';\n  var TTL_MS = 24 * 60 * 60 * 1000; // 保存 24 小时\n\n  var KEEP_KEYS = [\n    'utm_source',\n    'utm_medium',\n    'utm_campaign',\n    'utm_term',\n    'utm_content',\n    'utm_id',\n    'gl',\n    'gclid',\n    'gbraid',\n    'wbraid',\n    'fbclid',\n    'twclid'\n  ];\n\n  function hasObj(obj) {\n    return obj && Object.keys(obj).length > 0;\n  }\n\n  function readParamsFromUrl() {\n    var search = new URLSearchParams(window.location.search);\n    var params = {};\n\n    KEEP_KEYS.forEach(function (key) {\n      var value = search.get(key);\n      if (value) {\n        params[key] = value;\n      }\n    });\n\n    return params;\n  }\n\n  function loadParams() {\n    try {\n      var raw =\n        sessionStorage.getItem(STORAGE_KEY) ||\n        localStorage.getItem(STORAGE_KEY);\n\n      if (!raw) return {};\n\n      var data = JSON.parse(raw);\n      if (!data || !data.ts || !data.params) return {};\n\n      if (Date.now() - data.ts > TTL_MS) {\n        localStorage.removeItem(STORAGE_KEY);\n        sessionStorage.removeItem(STORAGE_KEY);\n        return {};\n      }\n\n      return data.params || {};\n    } catch (e) {\n      return {};\n    }\n  }\n\n  function saveParams(params) {\n    if (!hasObj(params)) return;\n\n    try {\n      var oldParams = loadParams();\n      var merged = {};\n\n      Object.keys(oldParams || {}).forEach(function (key) {\n        merged[key] = oldParams[key];\n      });\n\n      Object.keys(params || {}).forEach(function (key) {\n        merged[key] = params[key];\n      });\n\n      var data = {\n        ts: Date.now(),\n        params: merged\n      };\n\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n      sessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n    } catch (e) {}\n  }\n\n  function isNtdInternalUrl(url) {\n    var host = url.hostname.replace(/^www\\./, '');\n    return host === 'ntd.com';\n  }\n\n  function shouldDecorate(url) {\n    if (!url) return false;\n    if (!isNtdInternalUrl(url)) return false;\n\n    // 只作用于 NTD+ 页面\n    return url.pathname.indexOf('/ntdplus') === 0;\n  }\n\n  function decorateUrl(inputUrl) {\n    if (!inputUrl) return inputUrl;\n\n    var raw = String(inputUrl);\n\n    if (\n      raw.indexOf('mailto:') === 0 ||\n      raw.indexOf('tel:') === 0 ||\n      raw.indexOf('javascript:') === 0 ||\n      raw.indexOf('data:') === 0 ||\n      raw.indexOf('blob:') === 0 ||\n      raw.charAt(0) === '#'\n    ) {\n      return inputUrl;\n    }\n\n    var url;\n\n    try {\n      url = new URL(raw, window.location.href);\n    } catch (e) {\n      return inputUrl;\n    }\n\n    if (!shouldDecorate(url)) return inputUrl;\n\n    var params = loadParams();\n    if (!hasObj(params)) return inputUrl;\n\n    Object.keys(params).forEach(function (key) {\n      if (!url.searchParams.has(key)) {\n        url.searchParams.set(key, params[key]);\n      }\n    });\n\n    // 如果原本是绝对 URL，就返回绝对 URL\n    if (/^https?:\\/\\//i.test(raw)) {\n      return url.toString();\n    }\n\n    // 如果原本是相对 URL，就返回相对 URL，避免影响站内 router\n    return url.pathname + url.search + url.hash;\n  }\n\n  function decorateAllLinks(root) {\n    root = root || document;\n\n    // 普通 a 标签\n    root.querySelectorAll('a[href]').forEach(function (a) {\n      var oldHref = a.getAttribute('href');\n      var newHref = decorateUrl(oldHref);\n\n      if (newHref && newHref !== oldHref) {\n        a.setAttribute('href', newHref);\n      }\n    });\n\n    // 有些 React 卡片会把链接存在 data-url / data-href\n    var attrs = ['data-url', 'data-href', 'data-link', 'data-to'];\n\n    attrs.forEach(function (attr) {\n      root.querySelectorAll('[' + attr + ']').forEach(function (el) {\n        var oldValue = el.getAttribute(attr);\n        var newValue = decorateUrl(oldValue);\n\n        if (newValue && newValue !== oldValue) {\n          el.setAttribute(attr, newValue);\n        }\n      });\n    });\n  }\n\n  // 当前页面如果有 UTM，先存起来\n  saveParams(readParamsFromUrl());\n\n  // 如果当前 URL 已经被 React 跳转成没有 UTM，自动补回\n  function fixCurrentUrl() {\n    var newUrl = decorateUrl(window.location.href);\n\n    if (newUrl && newUrl !== window.location.href) {\n      try {\n        history.replaceState(history.state, document.title, newUrl);\n      } catch (e) {}\n    }\n  }\n\n  // 关键：拦截 React / Next / SPA 的 pushState\n  var nativePushState = history.pushState;\n  var nativeReplaceState = history.replaceState;\n\n  history.pushState = function () {\n    var args = Array.prototype.slice.call(arguments);\n\n    if (args.length >= 3 && args[2]) {\n      args[2] = decorateUrl(args[2]);\n    }\n\n    return nativePushState.apply(history, args);\n  };\n\n  history.replaceState = function () {\n    var args = Array.prototype.slice.call(arguments);\n\n    if (args.length >= 3 && args[2]) {\n      args[2] = decorateUrl(args[2]);\n    }\n\n    return nativeReplaceState.apply(history, args);\n  };\n\n  // 拦截 window.open\n  var nativeOpen = window.open;\n\n  window.open = function (url, name, specs) {\n    return nativeOpen.call(window, decorateUrl(url), name, specs);\n  };\n\n  function run() {\n    decorateAllLinks(document);\n    fixCurrentUrl();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', run);\n  } else {\n    run();\n  }\n\n  // 动态加载出来的视频卡片也处理\n  var timer = null;\n\n  var observer = new MutationObserver(function () {\n    clearTimeout(timer);\n    timer = setTimeout(run, 100);\n  });\n\n  observer.observe(document.documentElement, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n    attributeFilter: ['href', 'data-url', 'data-href', 'data-link', 'data-to']\n  });\n\n  // 点击图片、视频卡片、div onclick 时兜底处理\n  document.addEventListener(\n    'click',\n    function (e) {\n      var a = e.target.closest && e.target.closest('a[href]');\n\n      if (a) {\n        var oldHref = a.getAttribute('href');\n        var newHref = decorateUrl(oldHref);\n\n        if (newHref && newHref !== oldHref) {\n          a.setAttribute('href', newHref);\n        }\n      }\n\n      // React 点击后可能稍后才 pushState，所以连续补几次\n      setTimeout(run, 0);\n      setTimeout(run, 100);\n      setTimeout(run, 300);\n      setTimeout(run, 800);\n      setTimeout(run, 1500);\n    },\n    true\n  );\n\n  window.addEventListener('popstate', function () {\n    setTimeout(run, 50);\n  });\n\n  // 前几秒多跑几次，处理页面异步加载\n  var count = 0;\n  var interval = setInterval(function () {\n    run();\n    count++;\n\n    if (count >= 20) {\n      clearInterval(interval);\n    }\n  }, 500);\n})();"}],"componentRefs":[],"continuationNodes":{}}],"componentIds":[],"componentData":[]}, "modifiedAt":1782488007000}