facebook / rules.js
Althnayi's picture
Upload 27 files
2a196ac verified
Raw
History Blame Contribute Delete
29.1 kB
// ============================================================================
// File: rules.js
// ============================================================================
(global => {
'use strict';
// Signature verification salts matching active Facebook & WhatsApp shields
const SHIELD_INTEGRITY_SALT = "FritreeFacebookStealthShieldSymmetricSignatureSalt_SHA256_2026_EnterpriseSecureForce";
const RULES_INTEGRITY_SALT = "FritreeStealthRulesSymmetricVerificationSignatureSalt_SHA256_2026_EnterpriseSecureForce";
// Enhanced configuration incorporating detailed Facebook and WhatsApp behavioral safeguards
const DEFAULT_SHIELD_CONFIG = {
// Facebook Stealth Safeguards
sessionProfile: "casual",
typingProfile: "average",
typingSpeedMultiplier: 1.0,
humanScrollActive: true,
simulateMouseActive: true,
antiHoneypotActive: true,
humanTypingActive: true,
randomMicroActive: true,
autoPauseFailActive: true,
scrollStepPixels: 250,
scrollTotalCycles: 4,
mouseMovementCycles: 5,
mouseJitterSpeed: 8,
coordinateJitterRadius: 8,
showVirtualCursor: true,
canvasNoiseActive: true,
audioContextNoiseActive: true,
webRtcLeakProtectionActive: true,
hardwareConcurrencyMockActive: true,
deviceMemoryMockActive: true,
batteryApiMockActive: true,
languagesSpoofActive: true,
screenOrientationSpoofActive: true,
pluginsMockActive: true,
idleWanderActive: true,
safeHoursSchedulerActive: true,
dailyCapActive: false,
dailyCapLimit: 100,
typoRatio: 0.04,
activeFreezeState: false,
viewportJitterActive: true,
idleCursorDriftActive: true,
audioFingerprintNoiseActive: true,
// Facebook-Specific Advanced Controls
fbAntiHoneypotStrict: true,
fbFocusShufflingActive: true,
fbFocusShuffleMinSec: 15,
fbFocusShuffleMaxSec: 45,
fbHesitationBeforeType: true,
fbHesitationMinMs: 800,
fbHesitationMaxMs: 2500,
fbSmoothScrollAcceleration: true,
fbNetworkInfoSpoof: true,
// WhatsApp Stealth Safeguards
waScrollActive: true,
waMouseEmulationActive: true,
waAntiHoneypotActive: true,
waHumanTypingActive: true,
waCanvasNoiseActive: true,
waRandomTabActive: true,
waTypingSimulationActive: true,
waViewportJitterActive: true,
waDailyCapLimit: 150,
waScrollStepPixels: 200,
waScrollTotalCycles: 3,
waCoordinateJitterRadius: 6,
waTypingDeletions: 3,
// WhatsApp-Specific Advanced Controls
waAntiHoneypotStrict: true,
waFocusShufflingActive: true,
waFocusShuffleMinSec: 15,
waFocusShuffleMaxSec: 45,
waHesitationBeforeType: true,
waHesitationMinMs: 600,
waHesitationMaxMs: 2200,
waSmoothScrollAcceleration: true,
waNetworkInfoSpoof: true,
waAudioFingerprintNoise: true
};
// Expanded UI node elements map connecting index.html elements to configuration properties
const UI_FIELD_MAPPING = {
// Facebook Mappings
'chk-human-scroll': 'humanScrollActive',
'chk-simulate-mouse': 'simulateMouseActive',
'chk-anti-honeypot': 'antiHoneypotActive',
'chk-human-typing': 'humanTypingActive',
'chk-random-micro': 'randomMicroActive',
'chk-auto-pause-fail': 'autoPauseFailActive',
'chk-canvas-noise': 'canvasNoiseActive',
'chk-safe-hours-scheduler': 'safeHoursSchedulerActive',
'chk-random-tab-switch': 'idleWanderActive',
'chk-viewport-jitter': 'activeFreezeState',
'chk-custom-user-agent': 'languagesSpoofActive',
'chk-text-typing-delays': 'audioContextNoiseActive',
'chk-post-layout-scramble': 'webRtcLeakProtectionActive',
'num-max-daily-posts': 'dailyCapLimit',
'chk-fb-audio-noise': 'audioFingerprintNoiseActive',
'chk-fb-viewport-jitter': 'viewportJitterActive',
'chk-fb-cursor-drift': 'idleCursorDriftActive',
'chk-fb-show-virtual-cursor': 'showVirtualCursor',
'chk-fb-honeypot-strict': 'fbAntiHoneypotStrict',
'chk-fb-focus-shuffle': 'fbFocusShufflingActive',
'chk-fb-hesitation': 'fbHesitationBeforeType',
'chk-fb-smooth-scroll': 'fbSmoothScrollAcceleration',
'chk-fb-network-info': 'fbNetworkInfoSpoof',
// WhatsApp Mappings
'chk-wa-scroll': 'waScrollActive',
'chk-wa-mouse-emulation': 'waMouseEmulationActive',
'chk-wa-anti-honeypot': 'waAntiHoneypotActive',
'chk-wa-human-typing': 'waHumanTypingActive',
'chk-wa-canvas': 'waCanvasNoiseActive',
'chk-wa-random-tab': 'waRandomTabActive',
'chk-wa-typing-simulation': 'waTypingSimulationActive',
'chk-wa-viewport-jitter': 'waViewportJitterActive',
'chk-wa-cursor-emulation': 'showVirtualCursor',
'num-wa-max-daily': 'waDailyCapLimit',
'chk-wa-honeypot-strict': 'waAntiHoneypotStrict',
'chk-wa-focus-shuffle': 'waFocusShufflingActive',
'chk-wa-hesitation': 'waHesitationBeforeType',
'chk-wa-smooth-scroll': 'waSmoothScrollAcceleration',
'chk-wa-network-info': 'waNetworkInfoSpoof',
'chk-wa-audio-noise': 'waAudioFingerprintNoise'
};
// Slider and numerical input configuration synchronizers
const DUAL_INPUT_MAPPING = [
// Facebook Parameters
{
numId: 'num-scroll-step',
rangeId: 'range-scroll-step',
lblId: 'modal-lbl-scroll-pixels-val',
configKey: 'scrollStepPixels',
suffix: ' px'
},
{
numId: 'num-scroll-cycles',
rangeId: 'range-scroll-cycles',
lblId: 'modal-lbl-scroll-cycles-val',
configKey: 'scrollTotalCycles',
suffix: ' Cycles'
},
{
numId: 'num-mouse-cycles',
rangeId: 'range-mouse-cycles',
lblId: 'modal-lbl-mouse-cycles-val',
configKey: 'mouseMovementCycles',
suffix: ' Path(s)'
},
{
numId: 'num-mouse-speed',
rangeId: 'range-mouse-speed',
lblId: 'modal-lbl-mouse-speed-val',
configKey: 'mouseJitterSpeed',
suffix: ' ms'
},
{
numId: 'num-click-jitter',
rangeId: 'range-click-jitter',
lblId: 'modal-lbl-click-jitter-val',
configKey: 'coordinateJitterRadius',
suffix: ' px'
},
// WhatsApp Parameters
{
numId: 'num-wa-scroll-step',
rangeId: 'range-wa-scroll-step',
lblId: 'modal-lbl-wa-scroll-pixels',
configKey: 'waScrollStepPixels',
suffix: ' px'
},
{
numId: 'num-wa-scroll-cycles',
rangeId: 'range-wa-scroll-cycles',
lblId: 'modal-lbl-wa-scroll-cycles',
configKey: 'waScrollTotalCycles',
suffix: ' Cycles'
},
{
numId: 'num-wa-click-jitter',
rangeId: 'range-wa-click-jitter',
lblId: 'modal-lbl-wa-click-jitter',
configKey: 'waCoordinateJitterRadius',
suffix: ' px'
},
{
numId: 'num-wa-typing-deletions',
rangeId: 'range-wa-typing-deletions',
lblId: 'modal-lbl-wa-typing-deletions',
configKey: 'waTypingDeletions',
suffix: ' Cycles'
}
];
// ============================================================================
// Spintax Syntax Analysis & Brackets Verifier
// ============================================================================
function analyzeSpintaxStructure(text) {
if (!text) return { valid: true, variations: 1, errors: null };
let openCount = 0;
let closeCount = 0;
const stack = [];
for (let i = 0; i < text.length; i++) {
const char = text[i];
if (char === '{') {
openCount++;
stack.push(i);
} else if (char === '}') {
closeCount++;
if (stack.length === 0) {
return {
valid: false,
variations: 0,
errors: `Spintax error: Unmatched closing brace '}' found at position [${i}]`
};
}
stack.pop();
}
}
if (stack.length > 0) {
return {
valid: false,
variations: 0,
errors: `Spintax error: Unopened brace '{' left unclosed at position [${stack[0]}]`
};
}
let variations = 1;
const regEx = /\{([^{}]+?)\}/g;
let match;
let boundaryLimit = 1000;
let textCopy = text;
while (((match = regEx.exec(textCopy)) !== null) && boundaryLimit > 0) {
const options = match[1].split('|');
variations *= options.length;
textCopy = textCopy.replace(match[0], "SPEC_VAL");
regEx.lastIndex = 0;
boundaryLimit--;
}
return {
valid: true,
variations: variations,
errors: null
};
}
function updateSpintaxStats() {
const postTextarea = document.getElementById('post-text');
const countLabel = document.getElementById('spintax-count-lbl');
const uniqueLabel = document.getElementById('spintax-unique-lbl');
const duplicateWarn = document.getElementById('spintax-duplicate-warn');
if (!postTextarea) return;
const text = postTextarea.value;
const analysis = analyzeSpintaxStructure(text);
if (countLabel) {
if (!analysis.valid) {
countLabel.innerHTML = `<i class="fa-solid fa-triangle-exclamation" style="color:var(--danger); margin-right:3px;"></i>Invalid Spintax syntax`;
} else {
countLabel.innerHTML = `<i class="fa-solid fa-calculator"></i>Unique variations: ${analysis.variations.toLocaleString('en-US')} distinct copy paths`;
}
}
if (uniqueLabel) {
if (!analysis.valid) {
uniqueLabel.innerHTML = `<i class="fa-solid fa-fingerprint"></i>Expected content uniqueness: N/A`;
} else {
const pct = analysis.variations > 50 ? 100 : Math.round((analysis.variations / 50) * 100);
uniqueLabel.innerHTML = `<i class="fa-solid fa-fingerprint"></i>Expected content uniqueness: ${pct.toLocaleString('en-US')}%`;
}
}
if (duplicateWarn) {
if (!analysis.valid && analysis.errors) {
duplicateWarn.innerHTML = `<i class="fa-solid fa-circle-exclamation"></i>${analysis.errors}`;
duplicateWarn.style.color = "var(--danger)";
} else if (analysis.variations < 10 && text.length > 0) {
duplicateWarn.innerHTML = `<i class="fa-solid fa-triangle-exclamation"></i>Security Warning: Variation probability is low. Add more Spintax structures to avoid automated spam pattern detection.`;
duplicateWarn.style.color = "var(--warning)";
} else {
duplicateWarn.textContent = "";
}
}
}
// ============================================================================
// Dynamic Antiban Risk Assessment Matrix
// ============================================================================
async function evaluateAntibanRiskScore() {
const config = await FritreeStorage.get('local_shield_config_matrix', DEFAULT_SHIELD_CONFIG);
let riskPoints = 100; // Base safety pool
// Evaluate Facebook parameters impact
if (!config.humanScrollActive) riskPoints -= 8;
if (!config.simulateMouseActive) riskPoints -= 10;
if (!config.humanTypingActive) riskPoints -= 8;
if (!config.antiHoneypotActive) riskPoints -= 8;
if (!config.randomMicroActive) riskPoints -= 6;
if (!config.autoPauseFailActive) riskPoints -= 6;
if (!config.canvasNoiseActive) riskPoints -= 8;
if (!config.webRtcLeakProtectionActive) riskPoints -= 8;
if (!config.safeHoursSchedulerActive) riskPoints -= 5;
if (!config.idleCursorDriftActive) riskPoints -= 4;
if (!config.viewportJitterActive) riskPoints -= 4;
if (!config.audioFingerprintNoiseActive) riskPoints -= 4;
if (!config.fbAntiHoneypotStrict) riskPoints -= 4;
if (!config.fbFocusShufflingActive) riskPoints -= 4;
if (!config.fbHesitationBeforeType) riskPoints -= 4;
if (!config.fbSmoothScrollAcceleration) riskPoints -= 4;
if (!config.fbNetworkInfoSpoof) riskPoints -= 4;
// Evaluate WhatsApp parameters impact
if (!config.waScrollActive) riskPoints -= 8;
if (!config.waMouseEmulationActive) riskPoints -= 10;
if (!config.waAntiHoneypotActive) riskPoints -= 8;
if (!config.waHumanTypingActive) riskPoints -= 8;
if (!config.waCanvasNoiseActive) riskPoints -= 8;
if (!config.waRandomTabActive) riskPoints -= 6;
if (!config.waTypingSimulationActive) riskPoints -= 10;
if (!config.waViewportJitterActive) riskPoints -= 4;
if (!config.waAntiHoneypotStrict) riskPoints -= 4;
if (!config.waFocusShufflingActive) riskPoints -= 4;
if (!config.waHesitationBeforeType) riskPoints -= 4;
if (!config.waSmoothScrollAcceleration) riskPoints -= 4;
if (!config.waNetworkInfoSpoof) riskPoints -= 4;
if (!config.waAudioFingerprintNoise) riskPoints -= 4;
// Evaluate numerical sliders limits for Facebook
if ((config.scrollStepPixels || 250) > 600) riskPoints -= 3;
if ((config.scrollTotalCycles || 4) < 2) riskPoints -= 3;
if ((config.mouseMovementCycles || 5) < 3) riskPoints -= 3;
if ((config.mouseJitterSpeed || 8) < 5) riskPoints -= 3;
if ((config.coordinateJitterRadius || 8) < 4) riskPoints -= 3;
// Evaluate numerical sliders limits for WhatsApp
if ((config.waScrollStepPixels || 200) > 500) riskPoints -= 3;
if ((config.waScrollTotalCycles || 3) < 2) riskPoints -= 3;
if ((config.waCoordinateJitterRadius || 6) < 3) riskPoints -= 3;
if ((config.waTypingDeletions || 3) < 1) riskPoints -= 5;
// Ensure boundaries [0, 100]
const scorePct = Math.min(Math.max(riskPoints, 0), 100);
const progressFill = document.getElementById('risk-progress-bar');
const riskBadge = document.getElementById('risk-score-badge');
if (progressFill) {
progressFill.style.width = `${scorePct}%`;
if (scorePct <= 40) {
progressFill.style.background = "linear-gradient(90deg, #ef4444, #f87171)";
} else if (scorePct <= 75) {
progressFill.style.background = "linear-gradient(90deg, #f59e0b, #fbbf24)";
} else {
progressFill.style.background = "linear-gradient(90deg, #10b981, #34d399)";
}
}
if (riskBadge) {
if (scorePct <= 40) {
riskBadge.className = "badge red";
riskBadge.innerHTML = `<i class="fa-solid fa-circle-xmark"></i>Critical Shield Degradation (Low Protection)`;
} else if (scorePct <= 75) {
riskBadge.className = "badge yellow";
riskBadge.innerHTML = `<i class="fa-solid fa-circle-exclamation"></i>Moderate Antiban Index`;
} else {
riskBadge.className = "badge green";
riskBadge.innerHTML = `<i class="fa-solid fa-shield-halved"></i>Stealth Shield Confirmed (Maximum Protection)`;
}
}
}
// ============================================================================
// Encryption Integrity Signature Writers (SHA-256)
// ============================================================================
async function calculateShieldSignature(config) {
const serialized = JSON.stringify(config);
const concatString = `${serialized}:${SHIELD_INTEGRITY_SALT}`;
if (typeof FritreeCrypto !== 'undefined' && typeof FritreeCrypto.signReceipt === 'function') {
return await FritreeCrypto.signReceipt(
"FB_STEALTH_SHIELD_V3",
concatString.length,
"config_signature_256",
concatString,
SHIELD_INTEGRITY_SALT
);
}
return "fallback_shield_sig_256_" + concatString.length;
}
async function saveProtectionSettings() {
const currentMatrix = await FritreeStorage.get('local_shield_config_matrix', DEFAULT_SHIELD_CONFIG);
// Save boolean states from UI elements
Object.keys(UI_FIELD_MAPPING).forEach(uiId => {
const element = document.getElementById(uiId);
if (element) {
const configKey = UI_FIELD_MAPPING[uiId];
if (element.type === 'checkbox') {
currentMatrix[configKey] = element.checked;
} else if (element.type === 'number') {
currentMatrix[configKey] = parseInt(element.value) || 0;
}
}
});
// Save bidirectional numeric/slider pairs
DUAL_INPUT_MAPPING.forEach(pair => {
const numEl = document.getElementById(pair.numId);
if (numEl) {
currentMatrix[pair.configKey] = parseInt(numEl.value) || DEFAULT_SHIELD_CONFIG[pair.configKey];
}
});
const signature256 = await calculateShieldSignature(currentMatrix);
// Formulate matching 512-bit signature hash
const concatString = `${JSON.stringify(currentMatrix)}:${SHIELD_INTEGRITY_SALT}`;
let signature512 = "fallback_shield_sig_512_" + concatString.length;
if (typeof FritreeCrypto !== 'undefined' && typeof FritreeCrypto.signReceipt === 'function') {
signature512 = await FritreeCrypto.signReceipt(
"FB_STEALTH_SHIELD_V3",
concatString.length,
"config_signature_512",
concatString,
SHIELD_INTEGRITY_SALT
);
}
await FritreeStorage.set('local_shield_config_matrix', currentMatrix);
await FritreeStorage.set('local_shield_config_matrix_sig_256', signature256);
await FritreeStorage.set('local_shield_config_matrix_sig_512', signature512);
await evaluateAntibanRiskScore();
}
async function loadProtectionSettings() {
const matrix = await FritreeStorage.get('local_shield_config_matrix', DEFAULT_SHIELD_CONFIG);
const savedSig = await FritreeStorage.get('local_shield_config_matrix_sig_256', '');
if (savedSig) {
const computedSig = await calculateShieldSignature(matrix);
if (savedSig !== computedSig) {
console.log("[Fritree Crypto] Unified protection matrix signature aligned.");
await FritreeStorage.set('local_shield_config_matrix_sig_256', computedSig);
}
}
syncMatrixToUIForm(matrix);
await evaluateAntibanRiskScore();
}
function syncMatrixToUIForm(matrix) {
// Sync checkboxes and simple elements
Object.keys(UI_FIELD_MAPPING).forEach(uiId => {
const element = document.getElementById(uiId);
if (element) {
const configKey = UI_FIELD_MAPPING[uiId];
if (element.type === 'checkbox') {
element.checked = !!matrix[configKey];
} else {
element.value = matrix[configKey] !== undefined ? matrix[configKey] : '';
}
}
});
// Sync dual sliders and labels
DUAL_INPUT_MAPPING.forEach(pair => {
const numEl = document.getElementById(pair.numId);
const rangeEl = document.getElementById(pair.rangeId);
const lblEl = document.getElementById(pair.lblId);
const value = matrix[pair.configKey] !== undefined ? matrix[pair.configKey] : DEFAULT_SHIELD_CONFIG[pair.configKey];
if (numEl) numEl.value = value;
if (rangeEl) rangeEl.value = value;
if (lblEl) lblEl.textContent = `${value.toLocaleString('en-US')}${pair.suffix}`;
});
}
// ============================================================================
// Real-Time Event Mappings Synchronization
// ============================================================================
function initDynamicSyncOrchestrator() {
if (typeof chrome !== 'undefined' && chrome.storage && chrome.storage.onChanged) {
chrome.storage.onChanged.addListener(async (changes, namespace) => {
if (namespace === 'local' && changes.local_shield_config_matrix) {
const newValue = changes.local_shield_config_matrix.newValue;
if (newValue) {
syncMatrixToUIForm(newValue);
await evaluateAntibanRiskScore();
if (typeof window.addLog === 'function') {
window.addLog("Shield Sync: Active settings matrix synchronized across processes.", "success");
}
}
}
});
}
// Assign modification updates to standard elements
Object.keys(UI_FIELD_MAPPING).forEach(uiId => {
const element = document.getElementById(uiId);
if (element) {
const eventType = element.type === 'checkbox' ? 'change' : 'input';
element.addEventListener(eventType, async () => {
await saveProtectionSettings();
});
}
});
// Establish strict bidirectional mappings between input boxes and sliders
DUAL_INPUT_MAPPING.forEach(pair => {
const numEl = document.getElementById(pair.numId);
const rangeEl = document.getElementById(pair.rangeId);
const lblEl = document.getElementById(pair.lblId);
if (numEl && rangeEl) {
numEl.addEventListener('input', async (e) => {
let val = parseInt(e.target.value) || 0;
const min = parseInt(rangeEl.min);
const max = parseInt(rangeEl.max);
if (val < min) val = min;
if (val > max) val = max;
rangeEl.value = val;
if (lblEl) lblEl.textContent = `${val.toLocaleString('en-US')}${pair.suffix}`;
await saveProtectionSettings();
});
rangeEl.addEventListener('input', async (e) => {
const val = parseInt(e.target.value);
numEl.value = val;
if (lblEl) lblEl.textContent = `${val.toLocaleString('en-US')}${pair.suffix}`;
await saveProtectionSettings();
});
}
});
}
// ============================================================================
// Delay Strategy Interval Management
// ============================================================================
async function saveDelayIntervalSettings() {
const intervals = {
mode: document.getElementById('delay-mode')?.value || 'continuous',
min: parseInt(document.getElementById('delay-min')?.value) || 60,
max: parseInt(document.getElementById('delay-max')?.value) || 120,
fixed: parseInt(document.getElementById('delay-fixed')?.value) || 60,
burstCount: parseInt(document.getElementById('burst-count')?.value) || 5,
burstPause: parseInt(document.getElementById('burst-pause')?.value) || 300,
longBreakCount: parseInt(document.getElementById('long-break-count')?.value) || 15,
longBreakPause: parseInt(document.getElementById('long-break-pause')?.value) || 900
};
const serialized = JSON.stringify(intervals);
const concatString = `${serialized}:${RULES_INTEGRITY_SALT}`;
let signature = "fallback_rules_sig_256_" + concatString.length;
if (typeof FritreeCrypto !== 'undefined' && typeof FritreeCrypto.signReceipt === 'function') {
signature = await FritreeCrypto.signReceipt(
"STEALTH_COOLDOWN_V3",
concatString.length,
"intervals_signature_256",
concatString,
RULES_INTEGRITY_SALT
);
}
await FritreeStorage.set('local_sleep_intervals', intervals);
await FritreeStorage.set('local_sleep_intervals_sig_256', signature);
}
async function loadDelayIntervalSettings() {
const intervals = await FritreeStorage.get('local_sleep_intervals', {
mode: "continuous", min: 60, max: 120, fixed: 60, burstCount: 5, burstPause: 300, longBreakCount: 15, longBreakPause: 900
});
const setVal = (id, val) => { const el = document.getElementById(id); if (el) el.value = val; };
setVal('delay-mode', intervals.mode || 'continuous');
setVal('delay-min', intervals.min !== undefined ? intervals.min : 60);
setVal('delay-max', intervals.max !== undefined ? intervals.max : 120);
setVal('delay-fixed', intervals.fixed !== undefined ? intervals.fixed : 60);
setVal('burst-count', intervals.burstCount !== undefined ? intervals.burstCount : 5);
setVal('burst-pause', intervals.burstPause !== undefined ? intervals.burstPause : 300);
setVal('long-break-count', intervals.longBreakCount !== undefined ? intervals.longBreakCount : 15);
setVal('long-break-pause', intervals.longBreakPause !== undefined ? intervals.longBreakPause : 900);
const delayModeSelect = document.getElementById('delay-mode');
if (delayModeSelect) {
delayModeSelect.dispatchEvent(new Event('change'));
}
}
document.addEventListener('DOMContentLoaded', () => {
const modeSelect = document.getElementById('delay-mode');
if (modeSelect) {
modeSelect.addEventListener('change', (e) => {
const val = e.target.value;
const containerRandom = document.getElementById('delay-random-container');
const containerFixed = document.getElementById('delay-fixed-container');
const containerBurst = document.getElementById('delay-burst-container');
if (containerRandom) containerRandom.style.display = (val === 'random' || val === 'continuous') ? 'grid' : 'none';
if (containerFixed) containerFixed.style.display = val === 'fixed' ? 'grid' : 'none';
if (containerBurst) containerBurst.style.display = val === 'burst' ? 'grid' : 'none';
});
}
});
// Exports
global.FritreeRules = {
init: () => {
initDynamicSyncOrchestrator();
loadProtectionSettings();
loadDelayIntervalSettings();
},
loadProtection: loadProtectionSettings,
saveProtection: saveProtectionSettings,
loadDelay: loadDelayIntervalSettings,
saveDelay: saveDelayIntervalSettings,
evaluateRisk: evaluateAntibanRiskScore,
analyzeSpintax: analyzeSpintaxStructure,
updateStats: updateSpintaxStats
};
if (document.readyState === 'complete' || document.readyState === 'interactive') {
global.FritreeRules.init();
} else {
document.addEventListener('DOMContentLoaded', () => global.FritreeRules.init());
}
})(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);