PageSourceSearch

https://msoftwaresolutions.net/

html msoftwaresolutions.net collected 2026-10-02 02:01:39 UTC 6,844 bytes, 210 lines download raw bytes

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.