Ačkoliv Vladimir Putin v poslední době mluví o možném ukončení války na Ukrajině, podle vojenských odborníků se spíše připravuje na letní ofenzivu
K mírovým rozhovorům by ale Rusko mohla dotlačit nepříznivá ekonomická situace země, která se navíc stále zhoršuje
Válečné hospodářství trápí především klesající průmyslová produkce, nízké spotřebitelské výdaje a levná ropa
Válka na Ukrajině trvá už více než tři roky, a ani přes deklarované úsilí nového amerického prezidenta Donalda Trumpa se zatím nezdá, že by v dohledné době mohla skončit. Ruské vedení totiž zatím projevilo jen malou ochotu k jakýmkoliv jednáním s Ukrajinci – ostatně i proto se mnozí domnívají, že se vůdce Vladimir Putin možná jen snaží svůj americký protějšek takříkajíc uchlácholit.
Server CNBC pak dokonce s odkazem na některé vojenské experty hovoří o tom, že Moskva plánuje uskutečnit další letní ofenzivu, jejímž cílem bude navýšit územní zisky v jižní a východní části Ukrajiny. Pokud by byl tento krok úspěšný, mohlo by to Rusku poskytnout lepší vyjednávací pozici v případných budoucích mírových rozhovorech.
Outstream Placeholder
Ty přitom dříve či později přijdou, jelikož ani geograficky největší země světa si zkrátka a dobře nemůže dovolit, aby současná válka pokračovala věčně. „Moskva se bude snažit zintenzivnit útočné operace, aby během jednání vyvíjela tlak, ale tento tlak nezvládne udržovat donekonečna,“ uvedl Jack Watling, vedoucí výzkumný pracovník pro pozemní válku v britském Královském institutu ozbrojených sil (RUSI).
Dochází technika i lidé
Problémů, které brání Putinovi v mnohaletém pokračování války na Ukrajině, je celá řada. Z vojenského hlediska představuje zásadní komplikaci například fakt, že ruské zásoby armádní techniky ze sovětské éry se podle Watlinga do poloviny podzimu vyčerpají. Týká se to tanků, dělostřelectva i bojových vozidel pěchoty, v důsledku čehož začne být Moskva zcela závislá na tom, co dokáže aktuálně vyrobit. Je přitom jasné, že současná vojenská produkce aktuální armádní potřeby pokrýt nezvládá.
Dalším důležitým aspektem pak je skutečnost, že Rusko nemá na žádné větší ofenzivy dostatek vojáků, přičemž bez mobilizace je pravděpodobně nesežene. Je ale otázkou, zda k ní země přistoupí, protože tento krok by byl finančně velmi nákladný, a zároveň by mohl vzbudit odpor u nemalé části obyvatel. „Útočné operace v roce 2026 budou pravděpodobně vyžadovat další nucenou mobilizaci, což je politicky i ekonomicky velmi náročné,“ shrnul Watling.
Ekonomika rychle klesá
Ještě závažnější komplikací pro ruské vedení je zhoršující se stav tamní ekonomiky. Tu stále více ovlivňují různé faktory spojené právě s válkou na Ukrajině, jako je například vysoká inflace, která se v dubnu vyšplhala na 10,2 procenta. Dlouhodobě rostoucí ceny potravin a zboží trápí mnoho Rusů, přičemž i sám Putin už současnou situaci označil za „alarmující“.
Ruská centrální banka se snaží nevyhovující stav řešit vysokými úrokovými sazbami ve výši 21 procent. I tato instituce ale přiznává, že návrat inflace k cílové hodnotě čtyř procent bude skutečně velmi obtížný a bude vyžadovat „delší období přísné měnové politiky“.
V souvislosti s vysokou inflací dochází rovněž k výraznému poklesu ruské ekonomiky, který je dokonce tak velký, že překvapil i mnohé analytiky. „Značné zpomalení růstu ruského hrubého domácího produktu z 4,5 procenta ve čtvrtém čtvrtletí loňského roku na 1,4 procenta v prvním letošním čtvrtletí je v souladu s prudkým poklesem produkce a naznačuje, že hospodářství může směřovat k mnohem tvrdšímu přistání, než jsme očekávali,“ vysvětlil Liam Peach, hlavní ekonom pro rozvíjející se trhy ve společnosti Capital Economics.
Podobně pak situaci vnímá i Alexandr Kolyandr z Centra pro analýzu evropské politiky: „Po třech letech militarizace země se ruská ekonomika ochlazuje. Tento pokles se přitom snadno může stát pádem. Špatná rozhodnutí politiků, další pokles cen ropy nebo nedbalost s inflací, a Rusko by se mohlo ocitnout v problémech.“
Příjmy z ropy a plynu budou o čtvrtinu nižší
Kromě výše zmíněného poškozují ruskou válečnou ekonomiku čím dál tím více i faktory, na něž Moskva nemá až takový vliv. Týká se to hlavně příjmů z prodeje zmíněné ropy, které omezují třeba stále přísnější sankce vůči ruské „stínové flotile“, což jsou plavidla, jež tuto surovinu nelegálně přepravují do zahraničí.
Ještě závažnější je ale pro Kreml celosvětový pokles cen černého zlata v důsledku Trumpovy globální celní politiky, která omezuje poptávku. Zatímco na začátku roku 2025 se ropa Brent obchodovala za 74,6 dolaru za barel, aktuálně je zhruba o deset dolarů levnější. I kvůli tomu ruské ministerstvo financí v dubnu uvedlo, že letošní příjmy z ropy a plynu budou ve srovnání s loňskem zhruba o čtvrtinu nižší, což se samozřejmě odrazí v možnostech země dále financovat válku na Ukrajině.
Jinými slovy, experti se shodují, že pokud současné faktory nějakou dobu vydrží, mohlo by to Putina konečně přimět k tomu, aby začal brát mírová jednání vážně. „Jestliže západní spojenci dokáží udržet úsilí o degradaci ruské ekonomiky a ukrajinské síly zabrání Rusku v dosažení hranic Doněcké oblasti do letošních Vánoc, Moskva bude čelit těžkým rozhodnutím ohledně nákladů, které je ochotna vynaložit na pokračování války. Za takových podmínek už by Rusové mohli přejít od Potěmkinových jednání k samotnému vyjednávání,“ uzavřel Watling.
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
\n<\/ins>\n-->
';
document.getElementById('outstream-iframe').onload = function () {
setupIframe();
}
replayScreen = document.getElementById('iinfoOutstreamReplay');
iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition');
outstreamContainer = document.getElementsByClassName('outstream-container')[0];
setupReplayScreen();
}
function setupIframe() {
outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document;
let el = outstreamDocument.createElement('style');
outstreamDocument.head.appendChild(el);
el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}";
videoContent = outstreamDocument.getElementById('contentElement');
videoContent.style.display = 'none';
videoContent.volume = 1;
videoContent.muted = false;
if (
location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 ||
location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 ||
location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1)
{
outstreamDirectPlayed = true;
soundAllowed = true;
iinfoVastUrlIndex = 0;
}
if (!outstreamDirectPlayed) {
console.log('OUTSTREAM direct');
setUpIMA(true);
} else {
if (soundAllowed) {
const playPromise = videoContent.play();
if (playPromise !== undefined) {
playPromise.then(function () {
console.log('OUTSTREAM sound allowed');
setUpIMA(false);
}).catch(function () {
console.log('OUTSTREAM sound forbidden');
renderBanner();
});
}
} else {
renderBanner();
}
}
}
function getWrapper() {
let articleWrapper = document.querySelector('.rs-outstream-placeholder');
// Outstream Placeholder from RedSys manipulation
if (articleWrapper && articleWrapper.style.display !== 'block') {
articleWrapper.innerHTML = "";
articleWrapper.style.display = 'block';
}
// Don't render OutStream on homepages
if (articleWrapper === null) {
if (document.querySelector('body.p-index')) {
return null;
}
}
if (articleWrapper === null) {
articleWrapper = document.getElementById('iinfo-outstream');
}
if (articleWrapper === null) {
articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)');
}
if (articleWrapper === null) { // Euro, Autobible, Zdravi
articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)');
}
if (articleWrapper === null) {
articleWrapper = document.getElementById('sidebar');
}
if (!articleWrapper) {
console.error("Outstream wrapper of article was not found.");
}
return articleWrapper;
}
function setupDimensions() {
outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480);
outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320);
}
/**
* Sets up IMA ad display container, ads loader, and makes an ad request.
*/
function setUpIMA(direct) {
google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true);
google.ima.settings.setLocale('cs');
google.ima.settings.setNumRedirects(10);
// Create the ad display container.
createAdDisplayContainer();
// Create ads loader.
adsLoader = new google.ima.AdsLoader(adDisplayContainer);
// Listen and respond to ads loaded and error events.
adsLoader.addEventListener(
google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
onAdsManagerLoaded, false);
adsLoader.addEventListener(
google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false);
// An event listener to tell the SDK that our content video
// is completed so the SDK can play any post-roll ads.
const contentEndedListener = function () {
adsLoader.contentComplete();
};
videoContent.onended = contentEndedListener;
// Request video ads.
const adsRequest = new google.ima.AdsRequest();
if (direct) {
adsRequest.adTagUrl = directVast;
console.log('Outstream DIRECT CAMPAING advert: ' + directVast);
videoContent.muted = true;
videoContent.volume = 0;
outstreamDirectPlayed = true;
} else {
adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex];
console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]);
videoContent.muted = false;
videoContent.volume = 1;
}
// Specify the linear and nonlinear slot sizes. This helps the SDK to
// select the correct creative if multiple are returned.
// adsRequest.linearAdSlotWidth = outstreamWidth;
// adsRequest.linearAdSlotHeight = outstreamHeight;
adsRequest.nonLinearAdSlotWidth = 0;
adsRequest.nonLinearAdSlotHeight = 0;
adsLoader.requestAds(adsRequest);
}
function setupReplayScreen() {
replayScreen.addEventListener('click', function () {
iinfoOutstreamPosition.remove();
iinfoVastUrlIndex = 0;
outstreamInit();
});
}
/**
* Sets the 'adContainer' div as the IMA ad display container.
*/
function createAdDisplayContainer() {
// We assume the adContainer is the DOM id of the element that will house
// the ads.
outstreamDocument.getElementById('videoContent').style.display = 'none';
adDisplayContainer = new google.ima.AdDisplayContainer(
outstreamDocument.getElementById('adContainer'), videoContent);
}
function unmuteAdvert() {
adVolume = !adVolume;
if (adVolume) {
adsManager.setVolume(0.3);
outstreamDocument.getElementById('adMuteBtn').innerHTML = '';
} else {
adsManager.setVolume(0);
outstreamDocument.getElementById('adMuteBtn').innerHTML = '';
}
}
/**
* Loads the video content and initializes IMA ad playback.
*/
function playAds() {
// Initialize the container. Must be done through a user action on mobile
// devices.
videoContent.load();
adDisplayContainer.initialize();
// setupDimensions();
try {
// Initialize the ads manager. Ad rules playlist will start at this time.
adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL);
// Call play to start showing the ad. Single video and overlay ads will
// start at this time; the call will be ignored for ad rules.
adsManager.start();
// window.addEventListener('resize', function (event) {
// if (adsManager) {
// setupDimensions();
// adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL);
// }
// });
} catch (adError) {
// An error may be thrown if there was a problem with the VAST response.
// videoContent.play();
}
}
/**
* Handles the ad manager loading and sets ad event listeners.
* @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent
*/
function onAdsManagerLoaded(adsManagerLoadedEvent) {
// Get the ads manager.
const adsRenderingSettings = new google.ima.AdsRenderingSettings();
adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;
adsRenderingSettings.loadVideoTimeout = 12000;
// videoContent should be set to the content video element.
adsManager =
adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings);
// Add listeners to the required events.
adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError);
adsManager.addEventListener(
google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested);
adsManager.addEventListener(
google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,
onContentResumeRequested);
adsManager.addEventListener(
google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent);
// Listen to any additional events, if necessary.
adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent);
adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent);
adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent);
playAds();
}
/**
* Handles actions taken in response to ad events.
* @param { !google.ima.AdEvent } adEvent
*/
function onAdEvent(adEvent) {
// Retrieve the ad from the event. Some events (for example,
// ALL_ADS_COMPLETED) don't have ad object associated.
const ad = adEvent.getAd();
console.log('Outstream event: ' + adEvent.type);
switch (adEvent.type) {
case google.ima.AdEvent.Type.LOADED:
// This is the first event sent for an ad - it is possible to
// determine whether the ad is a video ad or an overlay.
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay.
// Use ad.width and ad.height.
videoContent.play();
}
outstreamDocument.getElementById('adContainer').style.width = '100%';
outstreamDocument.getElementById('adContainer').style.maxWidth = '640px';
outstreamDocument.getElementById('adContainer').style.height = '360px';
break;
case google.ima.AdEvent.Type.STARTED:
window.addEventListener('scroll', onActiveView);
// This event indicates the ad has started - the video player
// can adjust the UI, for example display a pause button and
// remaining time.
if (ad.isLinear()) {
// For a linear ad, a timer can be started to poll for
// the remaining time.
intervalTimer = setInterval(
function () {
// Example: const remainingTime = adsManager.getRemainingTime();
// adsManager.pause();
},
300); // every 300ms
}
outstreamDocument.getElementById('adMuteBtn').style.display = 'block';
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
if (ad.isLinear()) {
clearInterval(intervalTimer);
}
if (outstreamLastError === 303) {
if (isBanner) {
renderBanner();
} else {
replayScreen.style.display = 'flex';
}
}
break;
case google.ima.AdEvent.Type.COMPLETE:
// This event indicates the ad has finished - the video player
// can perform appropriate UI actions, such as removing the timer for
// remaining time detection.
if (ad.isLinear()) {
clearInterval(intervalTimer);
}
if (isBanner) {
renderBanner();
} else {
replayScreen.style.display = 'flex';
}
break;
}
}
/**
* Handles ad errors.
* @param { !google.ima.AdErrorEvent } adErrorEvent
*/
function onAdError(adErrorEvent) {
// Handle the error logging.
console.log(adErrorEvent.getError());
outstreamLastError = adErrorEvent.getError().getErrorCode();
if (!loadNext()) {
renderBanner();
}
}
function renderBanner() {
if (isBanner) {
console.log('Outstream: Render Banner');
iinfoOutstreamPosition.innerHTML = "";
iinfoOutstreamPosition.style.height = "330px";
iinfoOutstreamPosition.appendChild(bannerDiv);
} else {
console.log('Outstream: Banner is not set');
}
}
function loadNext() {
iinfoVastUrlIndex++;
if (iinfoVastUrlIndex < iinfoVastUrls.length) {
iinfoOutstreamPosition.remove();
outstreamInit();
} else {
return false;
}
adVolume = 1;
return true;
}
/**
* Pauses video content and sets up ad UI.
*/
function onContentPauseRequested() {
videoContent.pause();
// This function is where you should setup UI for showing ads (for example,
// display ad timer countdown, disable seeking and more.)
// setupUIForAds();
}
/**
* Resumes video content and removes ad UI.
*/
function onContentResumeRequested() {
videoContent.play();
// This function is where you should ensure that your UI is ready
// to play content. It is the responsibility of the Publisher to
// implement this function when necessary.
// setupUIForContent();
}
function onActiveView() {
if (outstreamContainer) {
const containerOffset = outstreamContainer.getBoundingClientRect();
const windowHeight = window.innerHeight;
if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) {
if (outstreamPaused) {
adsManager.resume();
outstreamPaused = false;
}
return true;
} else {
if (!outstreamPaused) {
adsManager.pause();
outstreamPaused = true;
}
}
}
return false;
}
let outstreamInitInterval;
if (typeof cpexPackage !== "undefined") {
outstreamInitInterval = setInterval(tryToInitializeOutstream, 100);
} else {
const wrapper = getWrapper();
if (wrapper) {
let outstreamInitialized = false;
window.addEventListener('scroll', () => {
if (!outstreamInitialized) {
const containerOffset = wrapper.getBoundingClientRect();
const windowHeight = window.innerHeight;
if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) {
outstreamInit();
outstreamInitialized = true;
}
}
});
}
}
function tryToInitializeOutstream() {
const wrapper = getWrapper();
if (wrapper) {
const containerOffset = wrapper.getBoundingClientRect();
const windowHeight = window.innerHeight;
if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) {
if (cpexPackage.adserver.displayed) {
clearInterval(outstreamInitInterval);
outstreamInit();
}
}
} else {
clearInterval(outstreamInitInterval);
}
}
}