Navega a través del complejo entramado que detallaba el juez Calama en el auto por el que fue imputado el expresidente
Regala esta noticia Añádenos en GoogleSara I. Belled y Melchor Sáiz-Pardo
18/06/2026 a las 00:06h. BeneficiariosAutoridades y políticosActores de primer nivelOrigen de los fondosOtros Cristóbal CanoManuel MartínezAlejandro Delgado CregoFrancisco Enrique Flores SuárezFelipe BacaJesica Rodríguez García (Jess)AlejandraDanilo Alfonso DiazgranadosSantiago Fernández LenaFederico LledóBasiliso Gil CarrasqueroÁlvaro Gutiérrez MolanoRafael Chica BeltránJulio Martínez SolaRoberto RoselliDomingo Amaro ChacónGuillermo Amaro ChacónCarlos Alberto Parra DelgadoÓscar Fernández GarcíaAlejandro Fernández RuizRaif El ArigieJuan Antonio Cáceres RodríguezAntonio Caldeiro TéllezFrancisco FerrerJosé Luis Encinas PradoBelén Fruiters CasadoPhilippe ApikianSnip Aviation SLSoftgestor SLGrupo AldesaBautista Managements LLCGrupo Multiobras MM 77 CAFVF Operaciones Globales SLViajes Zafiro SLCía Inversora de Superficies SLUPanacorp Casa de ValoresCaletón Consultores SLSummer Wind SLHipatia BeticaVoli Analítica SLIot Domotic EuropeAfitta SLApamate Corporate And TrustAfitta Capital SLURentas Emeritenses SLZenzap SLDaniel Romero-Abreu KaupIdella Consulenza StrategicaLandside Dubai FzcoKoldo GarcíaPedro SauraJosé Ángel Partearroyo (SEPI)Juan Manuel Teixeira Díaz (INAC)Delcy Rodríguez (La Dama)Eudoro Antonio González DellánEdmundoMiguel PalomeroMaría Aurora López LópezPlus UltraRodolfo ReyesRafael MartínezVíctor GarcíaFernando CastañedaSergio Sánchez BenítezInteligencia Prospectiva SLAgropecuaria LucenaPickashop SLWhathefav SLMaría Gertrudis AlcázarJudith Laure Wells SuttonJavier de PazSilvia de PazJulio Martínez MartínezManuel Aarón Fajardo GarcíaRamón GordilsOcarizCamilo Ibrahim IssaAnálisis Relevante SLLaura Rodríguez EspinosaAlba Rodríguez EspinosaMaría Sonsoles Espinosa DíazGate CenterThinking HeadsJosé Luis ÁbalosJosé Luis Escrivá BelmonteTomás Guerrero BlancoJosé Luis Rodríguez ZapateroLas conexiones
Esta es la red de conexiones que pinta el auto del juez Calama por el que José Luis Rodríguez Zapatero, el primer expresidente del Gobierno imputado en España, declaró ayer en la sede de la Audiencia Nacional.
El vértice de la trama
Según desgrana el auto judicial, el expresidente, que ayer defendió su inocencia, se sitúa presuntamente «en el vértice de la estructura», desde donde «ejerce el liderazgo estratégico» de la red.
El lugarteniente operativo
Bajo su mando directo operaría Julio Martínez Martínez quien, explica el auto, controla 39 empresas (20 inactivas). El juez lo señala como el presunto «lugarteniente principal y figura visible», encargado de articular la «operativa financiera y societaria» mientras «ejecuta las instrucciones de José Luis Rodríguez Zapatero».
La vía dubaití
Es Julio Martínez quien representa a Idella Consulenza Strategica, la mercantil que «desempeña un papel central en la estructura analizada, actuando como eje societario desde el cual se articulan las operaciones presuntamente destinadas a desviar al extranjero los fondos derivados del contrato suscrito con la aerolínea Plus Ultra».
La aerolínea y el rescate
Esta estructura conecta con Plus Ultra, señalada por el magistrado como la vía principal de las cuatro mercantiles origen del dinero (junto a Sofgestor, Grupo Aldesa e Inteligencia Prospectiva). El auto documenta un contrato entre Idella y la aerolínea por el que la red cobraría el presunto «1% del rescate público, esto es, 530.000 euros» (641.300 con IVA) derivado de la «ayuda de 53 millones de euros concedida por la SEPI». Sin constancia de pago en España.
La empresa fantasma
Pocos días después de firmar ese contrato en enero de 2021 se creó Landside Dubai Fzco, una sociedad radicada en Dubai que estaría íntegramente participada por Idella y que «podría haberse creado para canalizar ese cobro». Un movimiento que Calama atribuye a Zapatero, junto con su secretaria Gertrudis Alcázar y el propio Martínez.
La maquinaria de facturación
Para mover el dinero, la aerolínea enviaría fondos hacia diferentes empresas, como Análisis Relevante SL, controlada por Julio Martínez y que el juez califica como una «pieza instrumental dentro de una estructura financiera diseñada para canalizar fondos» mediante la elaboración de «facturación simulada» y «contratos ad hoc».
El rastro del dinero
De esta empresa, las hijas de Zapatero recibieron en sus cuentas casi 240.000 euros a través de Whathefav SL, de la que son propietarias, una mercantil que «actúa como sociedad finalista, recibiendo fondos de clientes y de otras sociedades instrumentales» y que suma de la red más de un millón de euros.
El retorno al vértice
El rastro del dinero termina donde empezó. El magistrado concluía su auto con que «el principal beneficiario final de los ingresos obtenidos sería José Luis Rodríguez Zapatero». El expresidente, que según la investigación recibió 1,5 millones de euros entre 2020 y 2025, declaró durante tres horas y rechazó que cobrara por el rescate de Plus Ultra.
Navega por las conexiones
Son 88 nombres propios y mercantiles que aparecen citados en el auto y más de un centenar de conexiones extraídas del auto.
Explora el gráfico `;container.appendChild(tooltip);return tooltip;};const vocCreateFixedLabel = (container) => {let label = container.querySelector('.voc-node-fixed-label');if (label) {label.hidden = true;label.setAttribute('aria-hidden', 'true');return label;}label = document.createElement('div');label.className = 'voc-node-fixed-label';label.hidden = true;label.setAttribute('aria-hidden', 'true');container.appendChild(label);return label;};const vocCreateHoverTooltip = (container) => {let hoverTooltip = container.querySelector('.voc-node-hover-tooltip');if (hoverTooltip) return hoverTooltip;hoverTooltip = document.createElement('div');hoverTooltip.className = 'voc-node-hover-tooltip';hoverTooltip.hidden = true;hoverTooltip.setAttribute('aria-hidden', 'true');container.appendChild(hoverTooltip);return hoverTooltip;};const vocShowHoverTooltip = ({ hoverTooltip, node, container }) => {const name = node.dataset.vocTitle || node.dataset.vocNode || node.getAttribute('aria-label') || '';if (!name) return;const containerRect = container.getBoundingClientRect();const nodeRect = node.getBoundingClientRect();hoverTooltip.textContent = name;hoverTooltip.hidden = false;hoverTooltip.setAttribute('aria-hidden', 'false');hoverTooltip.classList.add('voc-is-visible');const left = nodeRect.left - containerRect.left + nodeRect.width / 2;const top = nodeRect.top - containerRect.top - 8;hoverTooltip.style.left = `${left}px`;hoverTooltip.style.top = `${top}px`;};const vocHideHoverTooltip = (hoverTooltip) => {hoverTooltip.classList.remove('voc-is-visible');hoverTooltip.hidden = true;hoverTooltip.setAttribute('aria-hidden', 'true');};const vocApplyNodeData = (graphic, nodeDataBySvgId) => {graphic.querySelectorAll('.voc-node-image').forEach(img => {img.removeAttribute('clip-path');});const svgNodes = graphic.querySelectorAll('.voc-node-item');svgNodes.forEach((svgNode) => {const svgId = svgNode.id;const cleanId = svgId.replace(/^node-/, '');const nodeData = nodeDataBySvgId.get(svgId) || nodeDataBySvgId.get(cleanId);if (!nodeData) {return;}const image = nodeData.remoteImage || nodeData.localImage;const nodeColor = vocColorByMeta[nodeData.meta];const svgCircle = svgNode.querySelector('.voc-node-circle');const svgImage = svgNode.querySelector('.voc-node-image');svgNode.dataset.vocId = nodeData.id;svgNode.dataset.vocNode = nodeData.node;svgNode.dataset.vocTitle = nodeData.title;svgNode.dataset.vocText = nodeData.text;svgNode.dataset.vocMeta = nodeData.meta;svgNode.dataset.vocImage = image;if (svgCircle && nodeColor) {svgCircle.style.fill = nodeColor;}svgNode.setAttribute('aria-label', `${nodeData.title}. ${nodeData.meta}`);if (svgImage) {svgImage.setAttribute('class', 'voc-node-image');svgImage.setAttribute('width', '30');svgImage.setAttribute('height', '30');svgImage.setAttribute('x', '-15');svgImage.setAttribute('y', '-15');svgImage.setAttribute('clip-path', 'url(#node-clip)');svgImage.setAttribute('preserveAspectRatio', 'xMidYMid slice');if (image) {svgImage.setAttribute('href', image);svgImage.setAttributeNS('http://www.w3.org/1999/xlink', 'href', image);svgImage.setAttribute('opacity', '1');} else {svgImage.removeAttribute('href');svgImage.removeAttributeNS('http://www.w3.org/1999/xlink', 'href');svgImage.setAttribute('opacity', '0');}}});};const vocGetLinkNames = (link) => {const raw = String(link.dataset.id || '').replace(/^link-line-/, '');const parts = raw.split('--');return {source: String(parts[0] || '').trim(),target: String(parts[1] || '').trim()};};const vocBuildRelations = (graphic) => {const links = Array.from(graphic.querySelectorAll('.voc-link-item'));const nodes = Array.from(graphic.querySelectorAll('.voc-node-item'));const nodeByName = new Map();const relationsByNodeName = new Map();nodes.forEach((node) => {const name = node.dataset.vocNode || node.getAttribute('aria-label') || '';const key = vocNormalize(name);nodeByName.set(key, node);relationsByNodeName.set(key, {links: [],related: new Set()});});links.forEach((link) => {const names = vocGetLinkNames(link);const sourceKey = vocNormalize(names.source);const targetKey = vocNormalize(names.target);if (!relationsByNodeName.has(sourceKey)) {relationsByNodeName.set(sourceKey, { links: [], related: new Set() });}if (!relationsByNodeName.has(targetKey)) {relationsByNodeName.set(targetKey, { links: [], related: new Set() });}relationsByNodeName.get(sourceKey).links.push(link);relationsByNodeName.get(sourceKey).related.add(targetKey);relationsByNodeName.get(targetKey).links.push(link);relationsByNodeName.get(targetKey).related.add(sourceKey);});return { links, nodes, nodeByName, relationsByNodeName };};const vocGetSvgBaseViewBox = (graphic) => {if (!graphic.dataset.vocBaseViewBox) {if (!graphic.getAttribute('viewBox')) {const width = Number(graphic.getAttribute('width')) || 1195;const height = Number(graphic.getAttribute('height')) || 1195;graphic.setAttribute('viewBox', `0 0 ${width} ${height}`);}graphic.dataset.vocBaseViewBox = graphic.getAttribute('viewBox');}const values = graphic.dataset.vocBaseViewBox.split(/\s+/).map(Number);return {x: values[0] || 0,y: values[1] || 0,width: values[2] || 1195,height: values[3] || 1195};};const vocGetNodePoint = (node) => {const transform = node.getAttribute('transform') || '';const match = transform.match(/translate\(([-\d.]+)[,\s]+([-\d.]+)\)/);return {x: match ? Number(match[1]) : 0,y: match ? Number(match[2]) : 0};};const vocGetZoomSettings = (step) => {const isMobile = window.matchMedia('(max-width: 699px)').matches;const base = isMobile ? vocZoomConfig.mobile : vocZoomConfig.desktop;const rawZoom = isMobile ? step?.dataset.zoomMovil : step?.dataset.zoomDesktop;const zoomFromHtml = Number(rawZoom);return {zoom: Number.isFinite(zoomFromHtml) && zoomFromHtml > 0 ? zoomFromHtml : base.zoom,xOffset: base.xOffset,yOffset: base.yOffset};};const vocZoomToNode = (graphic, node, step, options = {}) => {const base = vocGetSvgBaseViewBox(graphic);const point = vocGetNodePoint(node);const settings = vocGetZoomSettings(step);const isMobile = window.matchMedia('(max-width: 699px)').matches;if (isMobile && options.tooltipOpen) {settings.yOffset = 90;}const zoom = Math.max(1, settings.zoom);const width = base.width / zoom;const height = base.height / zoom;const minX = base.x;const minY = base.y;const maxX = base.x + base.width - width;const maxY = base.y + base.height - height;const targetX = Math.min(Math.max(point.x - width / 2 + settings.xOffset, minX), maxX);const targetY = Math.min(Math.max(point.y - height / 2 + settings.yOffset, minY), maxY);if (vocAnimationTween) cancelAnimationFrame(vocAnimationTween);const currentViewBox = graphic.getAttribute('viewBox').split(/\s+/).map(Number);let curX = currentViewBox[0];let curY = currentViewBox[1];let curW = currentViewBox[2];let curH = currentViewBox[3];const easeFactor = 0.08;const animateCamera = () => {curX += (targetX - curX) * easeFactor;curY += (targetY - curY) * easeFactor;curW += (width - curW) * easeFactor;curH += (height - curH) * easeFactor;graphic.setAttribute('viewBox', `${curX} ${curY} ${curW} ${curH}`);if (Math.abs(targetX - curX) > 0.1 || Math.abs(width - curW) > 0.1) {vocAnimationTween = requestAnimationFrame(animateCamera);}};vocAnimationTween = requestAnimationFrame(animateCamera);};const vocSetTooltipContent = (tooltip, node) => {const image = tooltip.querySelector('.voc-node-tooltip__image');const media = tooltip.querySelector('.voc-node-tooltip__media');const title = tooltip.querySelector('.voc-node-tooltip__title');const group = tooltip.querySelector('.voc-node-tooltip__group');const text = tooltip.querySelector('.voc-node-tooltip__text');const meta = tooltip.querySelector('.voc-node-tooltip__meta');const metaName = node.dataset.vocMeta || '';const metaColor = vocColorByMeta[metaName] || vocColorByMeta['Otros'] || '#CFD8E2';const metaTextColor = vocTooltipTextColorByMeta[metaName] || vocTooltipTextColorByMeta['Otros'] || '#202020';title.textContent = node.dataset.vocTitle || node.dataset.vocNode || '';group.textContent = metaName;group.style.backgroundColor = metaColor;group.style.color = metaTextColor;text.textContent = node.dataset.vocText || '';meta.textContent = node.dataset.vocNode || '';if (node.dataset.vocImage) {image.src = node.dataset.vocImage;image.alt = '';media.hidden = false;} else {image.removeAttribute('src');media.hidden = true;}};const vocPositionTooltip = (tooltip, node, container) => {const containerRect = container.getBoundingClientRect();const nodeRect = node.getBoundingClientRect();const tooltipRect = tooltip.getBoundingClientRect();const left = nodeRect.left - containerRect.left + nodeRect.width / 2 + 18;const top = nodeRect.top - containerRect.top + nodeRect.height / 2 + 18;const maxLeft = Math.max(12, containerRect.width - tooltipRect.width - 12);const maxTop = Math.max(12, containerRect.height - tooltipRect.height - 12);tooltip.style.left = `${Math.min(Math.max(12, left), maxLeft)}px`;tooltip.style.top = `${Math.min(Math.max(12, top), maxTop)}px`;};const vocPositionFixedLabel = (label, node, container) => {if (!node || label.hidden) {return;}const containerRect = container.getBoundingClientRect();const nodeRect = node.getBoundingClientRect();const left = nodeRect.left - containerRect.left + nodeRect.width / 2;const top = nodeRect.top - containerRect.top;label.style.left = `${left}px`;label.style.top = `${top}px`;};const vocShowFixedLabel = ({ label, node, container }) => {if (!node) {label.hidden = true;label.textContent = '';return;}label.textContent = node.dataset.vocTitle || node.dataset.vocNode || node.getAttribute('aria-label') || '';label.hidden = false;requestAnimationFrame(() => {vocPositionFixedLabel(label, node, container);});};const vocHideFixedLabel = (label) => {label.hidden = true;label.textContent = '';};const vocClearState = (nodes, links) => {nodes.forEach((node) => {node.classList.remove('voc-is-story-active', 'voc-is-story-related', 'voc-is-story-muted', 'voc-has-tooltip-open');});links.forEach((link) => {link.classList.remove('voc-is-story-active', 'voc-is-story-muted');});};const vocHighlightNodeRelations = ({ node, nodes, links, nodeByName, relationsByNodeName }) => {const nodeKey = vocNormalize(node.dataset.vocNode || node.getAttribute('aria-label'));const relation = relationsByNodeName.get(nodeKey);vocClearState(nodes, links);node.classList.add('voc-is-story-active');nodes.forEach((item) => {if (item !== node) item.classList.add('voc-is-story-muted');});links.forEach((link) => {link.classList.add('voc-is-story-muted');});if (!relation) return;relation.links.forEach((link) => {link.classList.add('voc-is-story-active');link.classList.remove('voc-is-story-muted');});relation.related.forEach((relatedKey) => {const relatedNode = nodeByName.get(relatedKey);if (relatedNode) {relatedNode.classList.add('voc-is-story-related');relatedNode.classList.remove('voc-is-story-muted');}});};const vocActivateNode = ({ graphic, node, step, tooltip, container, fixedLabel, labelNode, nodes, links, nodeByName, relationsByNodeName, showTooltip }) => {const nodeKey = vocNormalize(node.dataset.vocNode || node.getAttribute('aria-label'));const relation = relationsByNodeName.get(nodeKey);vocClearState(nodes, links);vocZoomToNode(graphic, node, step, { tooltipOpen: showTooltip });if (labelNode) {vocShowFixedLabel({ label: fixedLabel, node: labelNode, container });} else {vocHideFixedLabel(fixedLabel);}node.classList.add('voc-is-story-active');if (showTooltip) node.classList.add('voc-has-tooltip-open');nodes.forEach((item) => {if (item !== node) item.classList.add('voc-is-story-muted');});links.forEach((link) => {link.classList.add('voc-is-story-muted');});if (relation) {relation.links.forEach((link) => {link.classList.add('voc-is-story-active');link.classList.remove('voc-is-story-muted');});relation.related.forEach((relatedKey) => {const relatedNode = nodeByName.get(relatedKey);if (relatedNode) {relatedNode.classList.add('voc-is-story-related');relatedNode.classList.remove('voc-is-story-muted');}});}if (showTooltip) {vocSetTooltipContent(tooltip, node);tooltip.classList.add('voc-is-visible');tooltip.setAttribute('aria-hidden', 'false');vocPositionTooltip(tooltip, node, container);} else {tooltip.classList.remove('voc-is-visible');tooltip.setAttribute('aria-hidden', 'true');}};const vocCloseTooltip = ({ tooltip, nodes }) => {tooltip.classList.remove('voc-is-visible');tooltip.setAttribute('aria-hidden', 'true');nodes.forEach((node) => {node.classList.remove('voc-has-tooltip-open');});};const vocCreateProgressDots = (steps) => {const progress = document.getElementById('voc-scroll-progress');if (!progress) return [];progress.innerHTML = '';return steps.map((step, index) => {const dot = document.createElement('span');dot.className = 'voc-scroll__progress-dot';dot.setAttribute('aria-hidden', 'true');if (index === 0) dot.classList.add('voc-is-active');progress.appendChild(dot);return dot;});};const vocSetActiveStep = (steps, dots, activeIndex) => {steps.forEach((step, index) => {step.classList.toggle('voc-is-active', index === activeIndex);});dots.forEach((dot, index) => {dot.classList.toggle('voc-is-active', index === activeIndex);});};const vocBindInteractions = ({ graphic, container, tooltip, fixedLabel, hoverTooltip, nodes, links, nodeByName, relationsByNodeName }) => {let activeNode = null;let activeNodeStep = null;let activeStepIndex = -1;let isFreeMode = false;const nodeById = new Map();const steps = Array.from(document.querySelectorAll('.voc-scroll__step'));const dots = vocCreateProgressDots(steps);const freeModeBtn = document.getElementById('voc-btn-free-mode');const mainContainer = document.getElementById('voc-scroll');let lastScrollY = window.scrollY;let isPanning = false;let panStart = null;const FREE_MODE_EXIT_DELTA = 8;const FREE_MODE_MAX_ZOOM = 4;const getCurrentViewBox = () => {const fallback = graphic.dataset.vocBaseViewBox || graphic.getAttribute('viewBox') || '0 0 773 773';const values = fallback.split(/\s+/).map(Number);const current = (graphic.getAttribute('viewBox') || fallback).split(/\s+/).map(Number);return {x: Number.isFinite(current[0]) ? current[0] : values[0],y: Number.isFinite(current[1]) ? current[1] : values[1],width: Number.isFinite(current[2]) ? current[2] : values[2],height: Number.isFinite(current[3]) ? current[3] : values[3]};};const clampViewBox = ({ x, y, width, height }) => {const base = vocGetSvgBaseViewBox(graphic);const minWidth = base.width / FREE_MODE_MAX_ZOOM;const minHeight = base.height / FREE_MODE_MAX_ZOOM;const nextWidth = Math.min(base.width, Math.max(minWidth, width));const nextHeight = Math.min(base.height, Math.max(minHeight, height));const minX = base.x;const minY = base.y;const maxX = base.x + base.width - nextWidth;const maxY = base.y + base.height - nextHeight;return {x: Math.min(Math.max(x, minX), maxX),y: Math.min(Math.max(y, minY), maxY),width: nextWidth,height: nextHeight};};const setViewBox = (box) => {const next = clampViewBox(box);graphic.setAttribute('viewBox', `${next.x} ${next.y} ${next.width} ${next.height}`);};const resetGraphCamera = () => {const base = vocGetSvgBaseViewBox(graphic);if (vocAnimationTween) cancelAnimationFrame(vocAnimationTween);const currentViewBox = graphic.getAttribute('viewBox').split(/\s+/).map(Number);let curX = currentViewBox[0];let curY = currentViewBox[1];let curW = currentViewBox[2];let curH = currentViewBox[3];const animateReset = () => {curX += (base.x - curX) * 0.08;curY += (base.y - curY) * 0.08;curW += (base.width - curW) * 0.08;curH += (base.height - curH) * 0.08;graphic.setAttribute('viewBox', `${curX} ${curY} ${curW} ${curH}`);if (Math.abs(base.width - curW) > 0.1 || Math.abs(base.x - curX) > 0.1 || Math.abs(base.y - curY) > 0.1) {vocAnimationTween = requestAnimationFrame(animateReset);}};vocAnimationTween = requestAnimationFrame(animateReset);};const getClosestStep = () => {const viewportMid = window.innerHeight / 2;let closestStep = null;let closestDist = Infinity;steps.forEach((step) => {const rect = step.getBoundingClientRect();if (rect.bottom < 0 || rect.top > window.innerHeight) return;const stepMid = rect.top + rect.height / 2;const dist = Math.abs(stepMid - viewportMid);if (dist < closestDist) {closestDist = dist;closestStep = step;}});return closestStep;};const syncStoryToClosestStep = () => {const closestStep = getClosestStep();if (!closestStep) return;const stepIndex = steps.indexOf(closestStep);if (stepIndex < 0) return;const nodeId = closestStep.dataset.vocFocus;const node = nodeId ? nodeById.get(nodeId) : null;activeStepIndex = stepIndex;vocSetActiveStep(steps, dots, stepIndex);if (!node) {vocClearState(nodes, links);vocHideFixedLabel(fixedLabel);tooltip.classList.remove('voc-is-visible');tooltip.setAttribute('aria-hidden', 'true');activeNode = null;activeNodeStep = null;resetGraphCamera();return;}activate({ node, step: closestStep, showTooltip: false });};nodes.forEach((node) => {nodeById.set(node.id, node);});const getLabelNodeFromStep = (step) => {if (!step?.dataset.labelNode) return null;return nodeById.get(step.dataset.labelNode) || null;};const activate = ({ node, step = null, showTooltip = false }) => {const labelNode = showTooltip ? null : getLabelNodeFromStep(step);activeNode = node;activeNodeStep = step;vocActivateNode({graphic, node, step, tooltip, container, fixedLabel, labelNode,nodes, links, nodeByName, relationsByNodeName, showTooltip});};const restoreActiveState = () => {if (tooltip.classList.contains('voc-is-visible') && activeNode) {activate({ node: activeNode, step: activeNodeStep, showTooltip: true });return;}const activeStep = steps[activeStepIndex] || null;const stepNode = activeStep?.dataset.vocFocus ? nodeById.get(activeStep.dataset.vocFocus) : null;if (stepNode) {activate({ node: stepNode, step: activeStep, showTooltip: false });return;}vocClearState(nodes, links);};nodes.forEach((node) => {node.addEventListener('mouseenter', () => {if (!isFreeMode) return;vocHighlightNodeRelations({ node, nodes, links, nodeByName, relationsByNodeName });vocShowHoverTooltip({ hoverTooltip, node, container });});node.addEventListener('mouseleave', () => {if (!isFreeMode) return;vocHideHoverTooltip(hoverTooltip);restoreActiveState();});node.addEventListener('click', (event) => {if (!isFreeMode) return;event.stopPropagation();vocHideHoverTooltip(hoverTooltip);activate({ node, step: null, showTooltip: true });});node.addEventListener('keydown', (event) => {if (!isFreeMode) return;if (event.key !== 'Enter' && event.key !== ' ') return;event.preventDefault();vocHideHoverTooltip(hoverTooltip);activate({ node, step: null, showTooltip: true });});});const exitFreeMode = ({ syncStory = true } = {}) => {if (!isFreeMode) return;isFreeMode = false;isPanning = false;panStart = null;if (mainContainer) {mainContainer.classList.remove('voc-is-free-mode', 'voc-is-panning');}if (freeModeBtn) {freeModeBtn.innerHTML = `Explora el gráfico`;}vocCloseTooltip({ tooltip, nodes });vocHideHoverTooltip(hoverTooltip);if (stepObserver) {steps.forEach(step => stepObserver.observe(step));}if (syncStory) {requestAnimationFrame(syncStoryToClosestStep);}};const setupObserver = () => {stepObserver = new IntersectionObserver((entries) => {const viewportMid = window.innerHeight / 2;let closestStep = null;let closestDist = Infinity;steps.forEach((step) => {const rect = step.getBoundingClientRect();if (rect.bottom < 0 || rect.top > window.innerHeight) return;const stepMid = rect.top + rect.height / 2;const dist = Math.abs(stepMid - viewportMid);if (dist < closestDist) {closestDist = dist;closestStep = step;}});if (!closestStep) return;const stepIndex = steps.indexOf(closestStep);const nodeId = closestStep.dataset.vocFocus;const node = nodeId ? nodeById.get(nodeId) : null;if (isFreeMode) return;if (stepIndex === activeStepIndex) return;activeStepIndex = stepIndex;vocSetActiveStep(steps, dots, stepIndex);if (!node) {vocClearState(nodes, links);vocHideFixedLabel(fixedLabel);tooltip.classList.remove('voc-is-visible');tooltip.setAttribute('aria-hidden', 'true');activeNode = null;activeNodeStep = null;const base = vocGetSvgBaseViewBox(graphic);if (vocAnimationTween) cancelAnimationFrame(vocAnimationTween);const currentViewBox = graphic.getAttribute('viewBox').split(/\s+/).map(Number);let curX = currentViewBox[0];let curY = currentViewBox[1];let curW = currentViewBox[2];let curH = currentViewBox[3];const animateReset = () => {curX += (base.x - curX) * 0.08;curY += (base.y - curY) * 0.08;curW += (base.width - curW) * 0.08;curH += (base.height - curH) * 0.08;graphic.setAttribute('viewBox', `${curX} ${curY} ${curW} ${curH}`);if (Math.abs(base.width - curW) > 0.1) {vocAnimationTween = requestAnimationFrame(animateReset);}};vocAnimationTween = requestAnimationFrame(animateReset);return;}activate({ node, step: closestStep, showTooltip: false });}, {threshold: [0, 0.1, 0.25, 0.5, 0.75, 1.0]});steps.forEach((step) => {stepObserver.observe(step);step.addEventListener('focus', () => {if (isFreeMode) return;const node = nodeById.get(step.dataset.vocFocus);if (!node) return;const stepIndex = steps.indexOf(step);activeStepIndex = stepIndex;vocSetActiveStep(steps, dots, stepIndex);activate({ node, step, showTooltip: false });});});};if (steps.length) {setupObserver();}if (freeModeBtn && mainContainer) {freeModeBtn.addEventListener('click', (event) => {event.stopPropagation();if (!isFreeMode) {isFreeMode = true;lastScrollY = window.scrollY;mainContainer.classList.add('voc-is-free-mode');freeModeBtn.textContent = 'Volver a la historia';vocCloseTooltip({ tooltip, nodes });vocHideFixedLabel(fixedLabel);if (stepObserver) {steps.forEach(step => stepObserver.unobserve(step));}} else {exitFreeMode({ syncStory: true });}});}const zoomAtPointer = (event, factor) => {const rect = graphic.getBoundingClientRect();const box = getCurrentViewBox();const svgX = box.x + ((event.clientX - rect.left) / rect.width) * box.width;const svgY = box.y + ((event.clientY - rect.top) / rect.height) * box.height;const nextWidth = box.width / factor;const nextHeight = box.height / factor;setViewBox({x: svgX - ((event.clientX - rect.left) / rect.width) * nextWidth,y: svgY - ((event.clientY - rect.top) / rect.height) * nextHeight,width: nextWidth,height: nextHeight});};graphic.addEventListener('pointerdown', (event) => {if (!isFreeMode || event.button !== 0) return;if (event.target.closest?.('.voc-node-item')) return;if (vocAnimationTween) cancelAnimationFrame(vocAnimationTween);isPanning = true;panStart = {clientX: event.clientX,clientY: event.clientY,viewBox: getCurrentViewBox()};graphic.setPointerCapture?.(event.pointerId);if (mainContainer) mainContainer.classList.add('voc-is-panning');});graphic.addEventListener('pointermove', (event) => {if (!isFreeMode || !isPanning || !panStart) return;event.preventDefault();const rect = graphic.getBoundingClientRect();const scaleX = panStart.viewBox.width / rect.width;const scaleY = panStart.viewBox.height / rect.height;const dx = (event.clientX - panStart.clientX) * scaleX;const dy = (event.clientY - panStart.clientY) * scaleY;setViewBox({x: panStart.viewBox.x - dx,y: panStart.viewBox.y - dy,width: panStart.viewBox.width,height: panStart.viewBox.height});});const stopPanning = (event) => {if (!isPanning) return;isPanning = false;panStart = null;graphic.releasePointerCapture?.(event.pointerId);if (mainContainer) mainContainer.classList.remove('voc-is-panning');};graphic.addEventListener('pointerup', stopPanning);graphic.addEventListener('pointercancel', stopPanning);graphic.addEventListener('pointerleave', stopPanning);graphic.addEventListener('dblclick', (event) => {if (!isFreeMode) return;event.preventDefault();zoomAtPointer(event, event.shiftKey ? 0.75 : 1.5);});graphic.addEventListener('wheel', (event) => {if (!isFreeMode) return;if (event.deltaY < 0 && !event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {exitFreeMode({ syncStory: true });return;}event.preventDefault();zoomAtPointer(event, event.deltaY < 0 ? 1.15 : 0.87);}, { passive: false });const closeButton = tooltip.querySelector('.voc-node-tooltip__close');if (closeButton) {closeButton.addEventListener('click', () => {vocCloseTooltip({ tooltip, nodes });restoreActiveState();});}document.addEventListener('click', (event) => {if (!tooltip.classList.contains('voc-is-visible')) return;if (tooltip.contains(event.target) || event.target.closest('.voc-node-item')) return;vocCloseTooltip({ tooltip, nodes });restoreActiveState();});document.addEventListener('keydown', (event) => {if (event.key !== 'Escape') return;if (!tooltip.classList.contains('voc-is-visible')) return;vocCloseTooltip({ tooltip, nodes });restoreActiveState();});window.addEventListener('resize', () => {if (!activeNode) return;const labelNode = tooltip.classList.contains('voc-is-visible') ? null : getLabelNodeFromStep(activeNodeStep);vocZoomToNode(graphic, activeNode, activeNodeStep, {tooltipOpen: tooltip.classList.contains('voc-is-visible')});if (labelNode) {vocShowFixedLabel({ label: fixedLabel, node: labelNode, container });} else {vocHideFixedLabel(fixedLabel);}if (tooltip.classList.contains('voc-is-visible')) {vocPositionTooltip(tooltip, activeNode, container);}}, { passive: true });window.addEventListener('scroll', () => {const currentScrollY = window.scrollY;if (isFreeMode && currentScrollY < lastScrollY - FREE_MODE_EXIT_DELTA) {exitFreeMode({ syncStory: true });}lastScrollY = currentScrollY;const labelNode = tooltip.classList.contains('voc-is-visible') ? null : getLabelNodeFromStep(activeNodeStep);if (labelNode) vocPositionFixedLabel(fixedLabel, labelNode, container);if (activeNode && tooltip.classList.contains('voc-is-visible')) {vocPositionTooltip(tooltip, activeNode, container);}}, { passive: true });graphic.dataset.vocReady = 'true';};const vocInit = async () => {const graphic = document.getElementById('graphic');if (!graphic || graphic.dataset.vocReady === 'true') return;const container = graphic.closest('.voc-scroll__graphic-wrap') || graphic.parentElement;if (!container) return;try {const tooltip = vocCreateTooltip(container);const fixedLabel = vocCreateFixedLabel(container);const hoverTooltip = vocCreateHoverTooltip(container);const nodeDataBySvgId = await vocGetNodeData();vocGetSvgBaseViewBox(graphic);vocApplyNodeData(graphic, nodeDataBySvgId);const relations = vocBuildRelations(graphic);vocBindInteractions({graphic,container,tooltip,fixedLabel,hoverTooltip,nodes: relations.nodes,links: relations.links,nodeByName: relations.nodeByName,relationsByNodeName: relations.relationsByNodeName});} catch (error) {console.warn('No se pudo inicializar el gráfico.', error);}};if (document.getElementById('graphic')) {vocInit();} else {document.addEventListener('DOMContentLoaded', vocInit, { once: true });}})();En un comunicado enviado a los medios, el expresidente defendió su inocencia y explicó que presentó al Tribunal «una autorización universal voluntaria para que ... pueda constatarse la inexistencia de sociedades, dinero, productos financieros o cualquier activo con titularidad mía directa o indirecta».
'Caso Plus Ultra'