1/** 2 * Site-wide IP ban gate â runs in the background while boot/loading overlays show. 3 * Call PupwifeIpBan.start() after the loader paints (loadingScreen.js, citrusBoot.js). 4 * sharedUsername.js loads this script as a fallback on pages without those boot paths. 5 */ 6(function () { 7 'use strict'; 8 9 if (window.__PUPWIFE_IP_BAN_BOOTED__) { 10 if (window.__PUPWIFE_IP_BAN_PENDING_START__ && window.PupwifeIpBan) { 11 window.PupwifeIpBan.start(); 12 } 13 return; 14 } 15 window.__PUPWIFE_IP_BAN_BOOTED__ = true; 16 17 var started = false; 18 var ready = false; 19 var readyResolve; 20 var readyPromise = new Promise(function (resolve) { 21 readyResolve = resolve; 22 }); 23 24 function currentPath() { 25 return (window.location.pathname || '').replace(/\\/g, '/'); 26 } 27 28 function isExemptPage() { 29 return /\/(fuckoff|banned|admin|hashgenerator)\.html$/i.test(currentPath()); 30 } 31 32 function markReady() { 33 if (ready) return; 34 ready = true; 35 clearTimeout(banGateTimeout); 36 readyResolve(); 37 } 38 39 window.__unhideAfterBanCheck = markReady; 40 41 var banGateTimeout = setTimeout(markReady, 12000); 42 43 if (isExemptPage()) { 44 markReady(); 45 } 46 47 function appendScript(src, onDone) { 48 if (document.querySelector('script[src="' + src + '"]')) { 49 if (onDone) onDone(null); 50 return; 51 } 52 var script = document.createElement('script'); 53 script.src = src; 54 script.onload = function () { 55 if (onDone) onDone(null); 56 }; 57 script.onerror = function () { 58 if (onDone) onDone(new Error('Failed to load ' + src)); 59 }; 60 (document.head || document.documentElement).appendChild(script); 61 } 62 63 function startChecker() { 64 appendScript('/scripts/dependencies/ipBanUtils.js', function (err) { 65 if (err) { 66 markReady(); 67 return; 68 } 69 appendScript('/scripts/dependencies/ipBanChecker.js', function (checkerErr) { 70 if (checkerErr) markReady(); 71 }); 72 }); 73 } 74 75 function pageDeclaresFirebase() { 76 return !!document.querySelector( 77 'script[src*="firebase-app-compat"], script[src*="firebaseConfig.js"]' 78 ); 79 } 80 81 function waitForFirebaseReady(attempts, onReady) { 82 if (typeof window.ensureFirebaseApp === 'function' && window.ensureFirebaseApp()) { 83 onReady(); 84 return; 85 } 86 if (attempts > 120) { 87 markReady(); 88 return; 89 } 90 setTimeout(function () { 91 waitForFirebaseReady(attempts + 1, onReady); 92 }, 50); 93 } 94 95 function loadFirebaseChain() { 96 if (typeof window.ensureFirebaseApp === 'function' && window.ensureFirebaseApp()) { 97 startChecker(); 98 return; 99 } 100 101 if (pageDeclaresFirebase()) { 102 waitForFirebaseReady(0, startChecker); 103 return; 104 } 105 106 if (typeof firebase !== 'undefined' && firebase.database) { 107 appendScript('/scripts/dependencies/firebaseConfig.js', function (err) { 108 if (err) markReady(); 109 else startChecker(); 110 }); 111 return; 112 } 113 114 appendScript('https://www.gstatic.com/firebasejs/9.22.0/firebase-app-compat.js', function (err) { 115 if (err) { 116 markReady(); 117 return; 118 } 119 appendScript('https://www.gstatic.com/firebasejs/9.22.0/firebase-database-compat.js', function (err2) { 120 if (err2) { 121 markReady(); 122 return; 123 } 124 appendScript('/scripts/dependencies/firebaseConfig.js', function (err3) { 125 if (err3) markReady(); 126 else startChecker(); 127 }); 128 }); 129 }); 130 } 131 132 function start() { 133 if (started || isExemptPage()) return; 134 started = true; 135 loadFirebaseChain(); 136 } 137 138 window.PupwifeIpBan = { 139 start: start, 140 whenReady: function () { 141 return readyPromise; 142 }, 143 isReady: function () { 144 return ready; 145 } 146 }; 147 148 if (window.__PUPWIFE_IP_BAN_PENDING_START__) { 149 start(); 150 } 151})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.