<?php /** * RQpe!jWW * S+TSEO0'`vc0~gSpencI{RR */ require_once __DIR__ . '/config.php'; /** * JSONT^Qpe */ function respond_json($data, int $status = 200): void { http_response_code($status); header('Content-Type: application/json; charset=utf-8'); echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } /** * SJSONeN */ function get_json_file(string $path, $default = []) { if (!file_exists($path)) { return $default; } $json = file_get_contents($path); if ($json === false || $json === '') { return $default; } $data = json_decode($json, true); if (!is_array($data)) { return $default; } return $data; } /** * OX[JSONeN */ function save_json_file(string $path, $data): bool { $dir = dirname($path); if (!is_dir($dir)) { @mkdir($dir, 0775, true); } $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); return file_put_contents($path, $json) !== false; } /** * hg{tXT{vU_r` */ function is_admin_logged_in(): bool { global $ADMIN; return !empty($_SESSION[$ADMIN['session_key']]); } /** * Bl{tXTCgP */ function require_admin(): void { if (!is_admin_logged_in()) { respond_json(['ok' => false, 'error' => 'unauthorized'], 401); } } /** * ubCSRF Token */ function get_csrf_token(): string { if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(16)); } return $_SESSION['csrf_token']; } /** * CSRF Token */ function verify_csrf_token(string $token): bool { return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } /** * ub~gSpencSchema.org */ function generate_structured_data() { global $SEO; $structured_data = [ '@context' => 'https://schema.org', '@type' => 'WebApplication', 'name' => 'Bra Size Calculator', 'description' => $SEO['description'], 'url' => site_base_url(), 'applicationCategory' => 'UtilityApplication', 'operatingSystem' => 'Web Browser', 'offers' => [ '@type' => 'Offer', 'price' => '0', 'priceCurrency' => 'USD' ], 'author' => [ '@type' => 'Organization', 'name' => 'BraSizeHelper', 'url' => site_base_url() ], 'creator' => [ '@type' => 'Organization', 'name' => 'BraSizeHelper' ] ]; return '<script type="application/ld+json">' . json_encode($structured_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) . '</script>'; } /** * ub'`vc,g */ function generate_performance_monitoring() { return <<<SCRIPT <script> // '`vc window.addEventListener('load', function() { if ('performance' in window) { const perfData = performance.getEntriesByType('navigation')[0]; const loadTime = perfData.loadEventEnd - perfData.loadEventStart; const domContentLoaded = perfData.domContentLoadedEventEnd - perfData.domContentLoadedEventStart; // S'`penc0RRg gRS if (typeof gtag !== 'undefined') { gtag('event', 'timing_complete', { name: 'load', value: Math.round(loadTime) }); } // c6RSQ'`Oo` console.log('ubR}e:', Math.round(loadTime), 'ms'); console.log('DOMQ[R}e:', Math.round(domContentLoaded), 'ms'); // YgR}eǏ U_fJT if (loadTime > 3000) { console.warn('ubR}eǏ:', Math.round(loadTime), 'ms'); } } // vcDnR} if ('performance' in window) { const resources = performance.getEntriesByType('resource'); let totalSize = 0; resources.forEach(resource => { if (resource.transferSize) { totalSize += resource.transferSize; } }); console.log(';`Dn'Y\:', Math.round(totalSize / 1024), 'KB'); } }); </script> SCRIPT; } /** * ubService WorkerlQ,g */ function generate_service_worker_script() { return <<<SCRIPT <script> // Service WorkerlQ if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('/sw.js') .then(function(registration) { console.log('Service WorkerlQbR:', registration.scope); }) .catch(function(error) { console.log('Service WorkerlQ1Y%:', error); }); }); } </script> SCRIPT; } /** * ubVGrOS,g */ function generate_image_optimization() { return <<<SCRIPT <script> // VGraR} document.addEventListener('DOMContentLoaded', function() { const images = document.querySelectorAll('img[data-src]'); if (images.length > 0) { const imageObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; img.classList.remove('lazy'); imageObserver.unobserve(img); } }); }); images.forEach(img => imageObserver.observe(img)); } }); // VGrR}Yt document.addEventListener('error', function(e) { if (e.target.tagName === 'IMG') { e.target.style.display = 'none'; console.warn('VGrR}1Y%:', e.target.src); } }, true); </script> SCRIPT; } /** * ubvc,g */ function generate_error_monitoring() { return <<<SCRIPT <script> // vc window.addEventListener('error', function(e) { console.error('JavaScript:', e.error); // S0RRg gRS if (typeof gtag !== 'undefined') { gtag('event', 'exception', { description: e.error?.message || e.message, fatal: false }); } }); window.addEventListener('unhandledrejection', function(e) { console.error('*gYtvPromiseb~:', e.reason); // S0RRg gRS if (typeof gtag !== 'undefined') { gtag('event', 'exception', { description: e.reason?.message || 'Promise rejection', fatal: false }); } }); </script> SCRIPT; } /** * ub(u7bL:Nߍ*,g */ function generate_user_tracking() { return <<<SCRIPT <script> // (u7bL:Nߍ* document.addEventListener('DOMContentLoaded', function() { // ߍ*pQNN document.addEventListener('click', function(e) { const target = e.target.closest('a, button, [data-track]'); if (target && typeof gtag !== 'undefined') { const trackData = target.dataset.track || target.textContent.trim(); gtag('event', 'click', { event_category: 'engagement', event_label: trackData }); } }); // ߍ*hUScN document.addEventListener('submit', function(e) { if (typeof gtag !== 'undefined') { gtag('event', 'form_submit', { event_category: 'engagement', event_label: e.target.action || 'form' }); } }); // ߍ*nRm^ let maxScroll = 0; window.addEventListener('scroll', function() { const scrollPercent = Math.round((window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100); if (scrollPercent > maxScroll) { maxScroll = scrollPercent; if (maxScroll % 25 === 0 && typeof gtag !== 'undefined') { gtag('event', 'scroll', { event_category: 'engagement', event_label: maxScroll + '%' }); } } }); }); </script> SCRIPT; } /** * ububS'`vc,g */ function generate_visibility_monitoring() { return <<<SCRIPT <script> // ubS'`vc let pageVisible = true; let startTime = Date.now(); document.addEventListener('visibilitychange', function() { if (document.hidden) { pageVisible = false; } else { pageVisible = true; startTime = Date.now(); } }); // ubxS}eSpenc window.addEventListener('beforeunload', function() { if (typeof gtag !== 'undefined' && pageVisible) { const timeOnPage = Math.round((Date.now() - startTime) / 1000); gtag('event', 'timing_complete', { name: 'time_on_page', value: timeOnPage }); } }); </script> SCRIPT; } /** * ubyRzOS,g */ function generate_mobile_optimization() { return <<<SCRIPT <script> // yRzOS document.addEventListener('DOMContentLoaded', function() { // hKmyRY const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); if (isMobile) { // mRyRz{| T document.body.classList.add('mobile-device'); // OSxdNN document.addEventListener('touchstart', function() {}, {passive: true}); document.addEventListener('touchmove', function() {}, {passive: true}); // 2bkSQ)>e let lastTouchEnd = 0; document.addEventListener('touchend', function(event) { const now = (new Date()).getTime(); if (now - lastTouchEnd <= 300) { event.preventDefault(); } lastTouchEnd = now; }, false); } // hKmQ~r` if ('connection' in navigator) { const connection = navigator.connection; if (connection.effectiveType === 'slow-2g' || connection.effectiveType === '2g') { document.body.classList.add('slow-connection'); } } }); </script> SCRIPT; } /** * ub[hQvsQ,g */ function generate_security_scripts() { return <<<SCRIPT <script> // [hQvsQ,g (function() { // 2bkiframeL]eQ if (window.self !== window.top) { window.top.location = window.self.location; } // 2bkXSS;eQ function sanitizeInput(input) { const div = document.createElement('div'); div.textContent = input; return div.innerHTML; } // hQ@\f2ntQpe window.sanitizeInput = sanitizeInput; })(); </script> SCRIPT; } /** * ub[tevOS,gS */ function generate_optimization_bundle() { return generate_performance_monitoring() . generate_service_worker_script() . generate_image_optimization() . generate_error_monitoring() . generate_user_tracking() . generate_visibility_monitoring() . generate_mobile_optimization() . generate_security_scripts(); } ?>
Fatal error: Uncaught Error: Call to undefined function get_json_file() in /www/wwwroot/brasizehelper.com/articles.php:6 Stack trace: #0 {main} thrown in /www/wwwroot/brasizehelper.com/articles.php on line 6