1 2<!doctype html> 3<html lang="es"> 4 <head> 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <meta name="description" content="M Software Solutions - Forjando el futuro digital con ingenierÃa de precisión, seguridad cognitiva y arquitecturas escalables." /> 8 <meta name="theme-color" content="#050505" /> 9 10 <!-- PWA iOS Support --> 11 <link rel="apple-touch-icon" href="/favicon-64.svg" /> 12 <meta name="apple-mobile-web-app-capable" content="yes" /> 13 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 14 15 <!-- Open Graph / Facebook --> 16 <meta property="og:type" content="website" /> 17 <meta property="og:url" content="https://msoftwaresolutions.net/" /> 18 <meta property="og:title" content="M Software Solutions | Seguridad Cognitiva & Arquitecturas Escalables" /> 19 <meta property="og:description" content="Forjando el futuro digital con ingenierÃa de precisión, seguridad cognitiva y arquitecturas escalables." /> 20 <meta property="og:image" content="https://msoftwaresolutions.net/og-image.png" /> 21 22 <!-- Twitter --> 23 <meta property="twitter:card" content="summary_large_image" /> 24 <meta property="twitter:url" content="https://msoftwaresolutions.net/" /> 25 <meta property="twitter:title" content="M Software Solutions | Seguridad Cognitiva & Arquitecturas Escalables" /> 26 <meta property="twitter:description" content="Forjando el futuro digital con ingenierÃa de precisión, seguridad cognitiva y arquitecturas escalables." /> 27 <meta property="twitter:image" content="https://msoftwaresolutions.net/og-image.png" /> 28 29 <!-- Performance Optimizations --> 30 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 31 <link rel="alternate icon" href="/favicon-64.svg" /> 32 33 <!-- Font Preloading --> 34 <link rel="preconnect" href="https://fonts.googleapis.com" /> 35 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 36 <link rel="dns-prefetch" href="https://ipapi.co" /> 37 <link 38 rel="stylesheet" 39 href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" 40 media="print" 41 onload="this.media='all'" 42 /> 43 <noscript> 44 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" /> 45 </noscript> 46 47 <title>M Software Solutions | Seguridad Cognitiva & Arquitecturas Escalables</title> 48
48<script type="module" crossorigin src="/assets/index-33680efc.js"></script>
48 49 <link rel="modulepreload" crossorigin href="/assets/vendor-react-c28adb65.js"> 50 <link rel="modulepreload" crossorigin href="/assets/vendor-framer-3515f164.js"> 51 <link rel="modulepreload" crossorigin href="/assets/vendor-ui-938df96e.js"> 52 <link rel="stylesheet" href="/assets/index-c2d50a6f.css"> 53
53<script type="module"> 54window.onerror = (message, source, lineno, colno, errorObj) => { 55 const errorDetails = errorObj ? JSON.stringify({ 56 name: errorObj.name, 57 message: errorObj.message, 58 stack: errorObj.stack, 59 source, 60 lineno, 61 colno, 62 }) : null; 63 64 window.parent.postMessage({ 65 type: 'horizons-runtime-error', 66 message, 67 error: errorDetails 68 }, '*'); 69}; 70</script>
70 71
71<script type="module"> 72const observer = new MutationObserver((mutations) => { 73 for (const mutation of mutations) { 74 for (const addedNode of mutation.addedNodes) { 75 if ( 76 addedNode.nodeType === Node.ELEMENT_NODE && 77 ( 78 addedNode.tagName?.toLowerCase() === 'vite-error-overlay' || 79 addedNode.classList?.contains('backdrop') 80 ) 81 ) { 82 handleViteOverlay(addedNode); 83 } 84 } 85 } 86}); 87 88observer.observe(document.documentElement, { 89 childList: true, 90 subtree: true 91}); 92 93function handleViteOverlay(node) { 94 if (!node.shadowRoot) { 95 return; 96 } 97 98 const backdrop = node.shadowRoot.querySelector('.backdrop'); 99 100 if (backdrop) { 101 const overlayHtml = backdrop.outerHTML; 102 const parser = new DOMParser(); 103 const doc = parser.parseFromString(overlayHtml, 'text/html'); 104 const messageBodyElement = doc.querySelector('.message-body'); 105 const fileElement = doc.querySelector('.file'); 106 const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : ''; 107 const fileText = fileElement ? fileElement.textContent.trim() : ''; 108 const error = messageText + (fileText ? ' File:' + fileText : ''); 109 110 window.parent.postMessage({ 111 type: 'horizons-vite-error', 112 error, 113 }, '*'); 114 } 115} 116</script>
116 117
117<script type="module"> 118const originalConsoleError = console.error; 119console.error = function(...args) { 120 originalConsoleError.apply(console, args); 121 122 let errorString = ''; 123 124 for (let i = 0; i < args.length; i++) { 125 const arg = args[i]; 126 if (arg instanceof Error) { 127 errorString = arg.stack || `${arg.name}: ${arg.message}`; 128 break; 129 } 130 } 131 132 if (!errorString) { 133 errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' '); 134 } 135 136 window.parent.postMessage({ 137 type: 'horizons-console-error', 138 error: errorString 139 }, '*'); 140}; 141</script>
141 142
142<script type="module"> 143const originalFetch = window.fetch; 144 145window.fetch = function(...args) { 146 const url = args[0] instanceof Request ? args[0].url : args[0]; 147 148 // Skip WebSocket URLs 149 if (url.startsWith('ws:') || url.startsWith('wss:')) { 150 return originalFetch.apply(this, args); 151 } 152 153 return originalFetch.apply(this, args) 154 .then(async response => { 155 const contentType = response.headers.get('Content-Type') || ''; 156 157 // Exclude HTML document responses 158 const isDocumentResponse = 159 contentType.includes('text/html') || 160 contentType.includes('application/xhtml+xml'); 161 162 if (!response.ok && !isDocumentResponse) { 163 const responseClone = response.clone(); 164 const errorFromRes = await responseClone.text(); 165 const requestUrl = response.url; 166 console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`); 167 } 168 169 return response; 170 }) 171 .catch(error => { 172 if (!url.match(/.html?$/i)) { 173 console.error(error); 174 } 175 176 throw error; 177 }); 178}; 179</script>
179 180
180<script type="module"> 181if (window.navigation && window.self !== window.top) { 182 window.navigation.addEventListener('navigate', (event) => { 183 const url = event.destination.url; 184 185 try { 186 const destinationUrl = new URL(url); 187 const destinationOrigin = destinationUrl.origin; 188 const currentOrigin = window.location.origin; 189 190 if (destinationOrigin === currentOrigin) { 191 return; 192 } 193 } catch (error) { 194 return; 195 } 196 197 window.parent.postMessage({ 198 type: 'horizons-navigation-error', 199 url, 200 }, '*'); 201 }); 202} 203</script>
203 204 <link rel="sitemap" type="application/xml" title="Sitemap" href="/sitemap.xml"> 205 <link rel="manifest" href="/manifest.webmanifest">
205<script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script>
205</head> 206 <body> 207 <div id="root"></div> 208 209 </body> 210</html>
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.