The following has evaluated to null or missing: ==> FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale ) [in template "252001#252047#252845" at line 128, column 37] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: dMTJsonObject = FrontendService.media... [in template "252001#252047#252845" at line 128, column 21] ----
1<#-- used @ Veranstaltung-Detailseite Intro
2 used @ Publikation-Detailseite Intro
3-->
4
5<#--
6Web content templates to display teaser on thema detail page
7
8Generic template for detail pages Intro / Teaser element
9-->
10<#--
11Display the current page title
12-->
13<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
14<#include "${fullTemplatesPath}/macros/debugging.ftl" />
15
16<#include "${fullTemplatesPath}/macros/page-modules/PMIntro.ftl" />
17<#include "${fullTemplatesPath}/macros/atomic-modules/AMPublicationCarousel.ftl" />
18<#include "${fullTemplatesPath}/macros/atomic-modules/AMMetadata.ftl" />
19<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
20
21
22<#--
23 renders the Intro for nearly all Pages
24 TODO: remove Share? (was in the designs, but not anymore?)
25 TODO: check if languageSelect/filter are working (js)
26
27 - portletId
28 - data = {
29 "media": string (src from image),
30 "category": string,
31 "title": string,
32 "author": string,
33 "subheadline": string,
34 "copy": string,
35 "filter": {
36 "id": string,
37 "name": string,
38 "entries": Array<Object> ({key:value}),
39 },
40 "languageSelect": {
41 "id": string,
42 "name": string,
43 "entries": Array<Object> ({key:value}),
44 },
45 "meta": {
46 "pos"; string (top/bottom)
47 "date": string,
48 "hash": string,
49 "info": string, (url)
50 },
51 "share" : {
52 "login": string,
53 "print": string,
54 "mail": string,
55 "multishare": string?? (tbd)
56 }
57 - AMMetadata: macro
58 - position: String ("top") -> defines wether the meta-data should be rendered above or below the intro-content
59 }
60-->
61
62<#assign
63 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
64
65 ServiceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
66 DLAPP = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
67
68 themeDisplay = ServiceContext.getThemeDisplay()
69 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
70
71 languageId = themeDisplay.getLocale()
72 groupId = themeDisplay.getScopeGroupId()
73 currentUrl = themeDisplay.getURLCurrent()
74
75 layout = themeDisplay.getLayout()
76 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
77/>
78
79<#setting locale="${languageId}">
80
81<#-- get article from url -->
82
83<#assign entry = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
84
85
86<#if entry?has_content>
87
88 <#if entry.resourcePrimKey??>
89 <#assign primaryKey = entry.resourcePrimKey?number >
90 <#elseif entry.classPK??>
91 <#assign primaryKey = entry.classPK?number >
92 </#if>
93
94 <#assign
95 jsonString = FrontendService.article.getWebcontent(primaryKey)
96 json = FrontendService.json.parseAsJson(jsonString)
97 availablelanguages = FrontendService.article.getAssetEntryToUrl(primaryKey).getAvailableLanguageIds()
98
99 title = entry.getTitle(languageId)
100 data = {
101 "title": title
102 }
103 />
104 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
105
106 <#if hasContent('untertitel', languageId, json)>
107 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
108 </#if>
109
110 <#if hasContent('beschreibung', languageId, json)>
111 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
112 </#if>
113
114 <#-- fill meta data -->
115 <#assign meta = {} />
116
117 <#-- PUBLIKATIONEN DETAIL -->
118 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
119
120 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
121 <#assign
122 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
123 />
124
125 <#if coverBildString?has_content>
126 <#assign
127 coverBild = FrontendService.json.parseAsJson(coverBildString)
128 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
129 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
130 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
131 />
132 <#if dMTJsonObject.altText?? >
133 <#assign data = data + {"alt" : dMTJsonObject.altText} />
134 </#if>
135 <#if dMTJsonObject.quelle??>
136 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
137 </#if>
138 </#if>
139 <#-- uncomment to display pdf cover as Intro Image
140 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
141 <#assign
142 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
143 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
144 <#if fileEntry?has_content>
145 <#assign
146 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
147 data = data + { "media": linkToThumbnail }
148 />
149 </#if>
150 -->
151 </#if>
152
153 <#assign
154 meta = meta + { "orderInfo": "true" }
155 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
156 />
157
158
159
160 <#if hasContent('erscheinungsdatum', languageId, json)>
161 <#assign
162 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
163 />
164 <#if erscheinungsdatum?has_content >
165 <#assign
166 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
167 meta = meta + { "date": erscheinungsdatumFormatted }
168 />
169 </#if>
170 </#if>
171
172 <#if verbundJournalArticle?has_content>
173 <#assign
174 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
175 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
176 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
177 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
178 />
179 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
180 <#assign meta = meta + { "laufendenummer": laufendenummer } >
181
182 <#if coverImg?has_content && coverImg.url?has_content >
183 <#assign meta = meta + { "coverImg": coverImg.url } >
184 </#if>
185 </#if>
186
187
188 <#if meta?has_content>
189 <#assign data = data + {"meta": meta } >
190 </#if>
191
192 </#if>
193 <#-- PUBLIKATIONEN DETAIL END -->
194
195
196 <#-- VERANSTALTUNGEN DETAIL -->
197 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
198 <#assign
199 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
200 links = []
201 />
202 <#if availablelanguages?has_content && friendlyUrl?has_content>
203 <#if (availablelanguages?size > 1) >
204 <#list availablelanguages as language>
205 <#assign
206 defaultLanguage = "de_DE"
207 defaultLocale = FrontendService.language.getLocaleByKey(defaultLanguage)
208 linkLocale = (FrontendService.language.getLocaleByKey(language))!defaultLocale
209 langFriendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, linkLocale, groupId)
210
211 link = {
212 "key": language!defaultLanguage,
213 "value": linkLocale.getDisplayLanguage(languageId),
214 "url": "/c/portal/update_language?p_l_id=" +
215 layout.plid + "&redirect=" + langFriendlyUrl +
216 "&languageId=" + language
217 }
218 />
219 <#if language == languageId>
220 <#assign link = link + { "selected": "true" } >
221 </#if>
222 <#assign links = links + [link]>
223 </#list>
224 <#assign
225 data = data + {
226 "languageSelect": {
227 "id": "languageSelectRedirect",
228 "name": "languageselectRedirect",
229 "entries": links,
230 "label": languageUtil.get(languageId, "diese.veranstaltung.ist.in.weiteren.sprachen.verfuegbar")
231 }
232 }
233 />
234 </#if>
235 </#if>
236 </#if>
237
238 <#if hasContent('erscheinungsdatum', languageId, json)>
239 <#assign
240 startdate = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
241 meta = meta + { "start": startdate?date.iso, "end": "" }
242 />
243 </#if>
244
245 <#if hasContent('startdatum', languageId, json)>
246 <#assign
247 startdate = getValueForLanguage('startdatum', languageId, json, "first")
248 meta = meta + { "start": startdate?date.iso, "end": "" }
249 />
250 </#if>
251
252 <#if hasValue('einfuehrungText', locale, json)>
253 <#assign data = data + { "einfuehrungText" : getValueForLanguage('einfuehrungText', locale, json, "first") } >
254 <#elseif hasValue(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first")>
255 <#assign data = data + { "einfuehrungText" : getValueForLanguage(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first") } >
256 </#if>
257
258 <#if hasContent('endedatum', languageId, json)>
259 <#assign
260 enddate = getValueForLanguage('endedatum', languageId, json, "first")
261 meta = meta + { "end": enddate?date.iso }
262 />
263 </#if>
264
265 <#if hasContent('startzeit', languageId, json)>
266 <#assign
267 startzeit = getValueForLanguage('startzeit', languageId, json, "first")
268 />
269 <#if startzeit?has_content >
270 <#assign meta = meta + { "startzeit": startzeit } />
271 </#if>
272 </#if>
273
274 <#if hasContent('endezeit', languageId, json)>
275 <#assign
276 endezeit = getValueForLanguage('endezeit', languageId, json, "first")
277 meta = meta + { "endezeit": endezeit }
278 />
279 </#if>
280
281 <#if hasContent('ortWCSKASDEORT', languageId, json)>
282 <#assign
283 ortWCSKASDEORT = FrontendService.json.parseAsJson(getValueForLanguage('ortWCSKASDEORT', languageId, json, "first"))
284 ortWCSKASDEORTPrimaryKey = ortWCSKASDEORT.classPK?number
285 ortWCSKASDEORTWebContent = FrontendService.article.getWebcontentByPk(ortWCSKASDEORTPrimaryKey)!""
286 />
287 <#if ortWCSKASDEORTWebContent?has_content >
288 <#assign
289 ortWCSKASDEORTTitle = ortWCSKASDEORTWebContent.getTitle(languageId)!""
290 />
291 <#if ortWCSKASDEORTTitle?has_content >
292 <#assign
293 meta = meta + { "ortWCSKASDEORT": ortWCSKASDEORTTitle }
294 />
295 </#if>
296 </#if>
297 </#if>
298
299
300 <#if hasContent('veranstaltungsnummer', languageId, json)>
301 <#assign
302 verauuid = getValueForLanguage('veranstaltungsnummer', languageId, json, "first")
303 meta = meta + { "verauuid": verauuid }
304 />
305 </#if>
306
307
308 <#if (data.meta)?has_content >
309 <#assign meta = data.meta />
310 </#if>
311
312 <#if !(data.media)?has_content && hasContent('mediumDMTKASDEMEDIUM', languageId, json)>
313 <#assign
314 medium = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, json, "first")
315 mediaData = getRelatedMediaObject(medium, themeDisplay, languageId, FrontendService, "hd-resolution")
316 />
317 <#assign data = data + { "media": mediaData.url , "meta" : mediaData.meta} >
318
319
320 <#if mediaData.meta?? && mediaData.meta.quelle??>
321 <#assign meta = meta + data.meta + { "quelle": mediaData.meta.quelle } />
322 </#if>
323 </#if>
324
325
326 <#if meta?has_content>
327 <#assign data = data + {"meta": meta } >
328 </#if>
329
330 <#-- END fill meta data -->
331
332 <#if hasContentForSequence('autorenWCSKASDEPERSON', languageId, json)>
333 <#assign
334 journalArticles = getValueForLanguageAnsprechpartner('autorenWCSKASDEPERSON', languageId, json)
335 authors = []
336 />
337 <#list journalArticles as articleString>
338 <#assign article = FrontendService.json.parseAsJson(articleString) />
339 <#if article?has_content && article?is_hash && article.classPK??>
340 <#assign articleDereferenced = FrontendService.person.resolveContactInstanceToPerson(article, languageId)!"" />
341 <#if articleDereferenced?has_content >
342 <#assign
343 author = ""
344 articlePrimaryKey = articleDereferenced.classPK?number
345 articleJsonString = FrontendService.article.getWebcontent(articlePrimaryKey)
346 articleJson = FrontendService.json.parseAsJson(articleJsonString)
347 />
348 <@debugJsonString articleJsonString "ADT_KASDE_DYNAMIC_INTRO-autorenWCSKASDEPERSON" />
349 <#if hasValue('anredetitel', languageId, articleJson)>
350 <#assign author = author + getValueForLanguage('anredetitel', languageId, articleJson, " ") + " ">
351 </#if>
352 <#if hasValue('vorname', languageId, articleJson)>
353 <#assign author = author + getValueForLanguage('vorname', languageId, articleJson, " ") + " ">
354 </#if>
355 <#if hasValue('nachname', languageId, articleJson)>
356 <#assign author = author + getValueForLanguage('nachname', languageId, articleJson, " ") + " ">
357 </#if>
358
359 <#attempt>
360 <#assign href = FrontendService.article.getFriendlyUrl(articlePrimaryKey, languageId, groupId)!"#" >
361 <#recover>
362 <#assign href = "#" >
363 </#attempt>
364 <#if href?has_content && href != "#" && href != "/_404">
365 <#assign author = '<a href="' + href + '">' + author?trim + '</a>'>
366 </#if>
367
368 <#assign authors = authors + [author?trim]>
369 </#if>
370 </#if>
371 </#list>
372 <#if authors?has_content>
373 <#assign data = data + { "author": authors?join(", ") } >
374 </#if>
375 </#if>
376
377 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL") >
378 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "VERANSTALTUNGSTYP")! >
379 <#if categories?has_content && categories[0]?has_content >
380 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
381 </#if>
382
383 <#if hasContent('ausgebucht', languageId, json)>
384 <#assign data = data + { "ausgebucht" : getValueForLanguage('ausgebucht', languageId, json, "first") }>
385 </#if>
386
387 <#if hasContent('storniert', languageId, json)>
388 <#assign data = data + { "storniert" : getValueForLanguage('storniert', languageId, json, "first") }>
389 </#if>
390
391 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL") >
392 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "PUBLIKATIONSREIHE")! >
393 <#if categories?has_content && categories[0]?has_content >
394 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
395 </#if>
396 <#else>
397 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "THEMA")! >
398 <#if categories?has_content && categories[0]?has_content >
399 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
400 </#if>
401 </#if>
402
403
404 <#assign
405 languages = []
406 />
407
408 <#attempt>
409 <#if json["document_pdfDMTBASICDOCUMENT"]?? >
410 <#if availablelanguages?has_content>
411 <#list availablelanguages as pdf_language>
412 <#assign
413 docRefJson = getValueForLanguage('document_pdfDMTBASICDOCUMENT', pdf_language, json, "first")
414 docRef = FrontendService.json.parseAsJson(docRefJson)
415 />
416 <#if docRef?is_hash && pdf_language != languageId >
417 <#assign
418 lang = FrontendService.language.getLocaleByKey(pdf_language)!""
419 docGroupId = docRef["groupId"]?number
420 docUuid = docRef["uuid"]
421 dMTJsonObject = FrontendService.media.getDMTJsonObject( docGroupId, docUuid, locale )
422 dMTLink = FrontendService.media.getLinkToDMT( dMTJsonObject )
423 />
424 <#if lang?has_content>
425 <#assign
426 languages = languages + [
427 {
428 "key": pdf_language,
429 "value": FrontendService.language.getLocaleByKey(pdf_language).getDisplayLanguage(),
430 "url": dMTLink
431 }]
432 />
433 </#if>
434 </#if>
435 </#list>
436 </#if>
437 </#if>
438 <#recover>
439 </#attempt>
440
441 <#if (languages?size > 0)>
442 <#attempt>
443 <#assign
444 data = data + { "languageSelect": {
445 "id": "languageSelect",
446 "name": "languageselect",
447 "entries": languages,
448 "documents": "",
449 "button": "true"
450 }}
451 />
452 <#recover>
453 </#attempt>
454 </#if>
455
456 <@PMIntro "ADT_KASDE_DYNAMIC_INTRO" data AMMetadata AMDatetime "bottom" />
457 ${FrontendService.article.getEditArticleHtml(primaryKey, themeDisplay)}
458
459 <#if data.meta?has_content>
460 <#if data.meta.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
461 <div>
462 <div id="publicationVerbundPagination">
463 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
464 </div>
465 </div>
466 </#if>
467 </#if>
468
469<#elseif (editmode?? && editmode)>
470 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
471</#if>
Wahlergebnis und Analyse
Nach Auszählung von 99,99 Prozent der Wahllokale gaben die Wahlbehörden folgendes vorläufige Ergebnis bekannt:
Kandidat | Ergebnis % | Wählerstimmen |
Gustavo Petro | 40,32 % | 8.527.183 |
Rodolfo Hernández | 28.15 % | 5.953.160 |
Federico Gutiérrez | 23, 91 % | 5.057.981 |
Sergio Fajardo | 4,20 % | 888.537 |
John Milton Rodríguez | 1,29 % | 274.235 |
Enrique Gómez Martínez | 0,23 % | 50.533 |
Ingrid Betancourt | 0,07 % | 14.877 |
Luis Pérez | 0,05 % | 12.425 |
Trotz der landesweiten Sozialproteste im vergangenen Jahr, der Unzufriedenheit mit der sozialen Lage und der enormen politischen Polarisierung im Wahlkampf nahmen nur knapp 22 Millionen Wählerinnen und Wählern an den Wahlen teil. Die Wahlbeteiligung lag bei rund 55 Prozent und verharrte damit auf ähnlichem Niveau wie in der Vergangenheit. Gustavo Petro, Senator und ehemaliger Bürgermeister von Bogotá, verfehlte zwar sein erklärtes Ziel eines Wahlsieges mit absoluter Mehrheit im ersten Wahlgang, erzielte für die Linke aber ein historisches Wahlergebnis. Mit über 8,5 Mio. Stimmen übertraf er bereits im ersten Wahlgang sein Ergebnis in der Stichwahl gegen Präsident Duque 2018 (8.04 Mio. Stimmen) deutlich. Noch nie ist es einem linken Präsidentschaftskandidaten in Kolumbien gelungen, so viele Wähler hinter sich zu versammeln.
Heimlicher Wahlgewinner ist jedoch der 77jährige Unternehmer und ehemalige Bürgermeister von Bucaramanga, Rodolfo Hernández, der in den letzten Umfragen zehn Tage vor den Wahlen noch fünf Prozentpunkte hinter Federico Gutiérrez lag. Mitte Mai hatte Hernández noch abgeschlagen unter 15 Prozent gelegen. Die letzten Umfragen bescheinigten ihm zwar einen deutlichen Aufwärtstrend, doch die Mehrheit der Analysten und politischen Beobachter hatte mit einem Einzug von Federico Gutierrez in die Stichwahl gerechnet. Der Überraschungscoup von Hernández und der Wahlerfolg von Petro sind Ausdruck einer gnadenlosen Abrechnung des Wählers mit dem traditionellen politischen Establishment und der Regierung Duque, die historisch schlechte Zustimmungswerte verzeichnet.
Die Regierungspartei Centro Democrático (Demokratisches Zentrum) von Expräsident Uribe und Präsident Duque hatte zwar ihren eigenen chancenlosen Präsidentschaftskandidaten, den ehemaligen Uribe-Minister Ivan Zuluaga, frühzeitig aus dem Rennen genommen und stillschweigend die Kandidatur von Gutiérrez unterstützt. Dem ehemaligen Bürgermeister von Medellín gelang es aber nicht, ein eigenes starkes Profil und Strahlkraft über seine Heimatregion Antioquia hinaus zu entwickeln. Seine Bemühungen, sich als unabhängigen Kandidaten der Mitte zu präsentieren, verfingen beim Wähler nicht. Stattdessen stand er in den Augen der zahlreichen Regierungskritiker als Repräsentant der traditionellen politischen Elite für Kontinuität und ein „Weiter so“.
Petro und Hernández verkörperten dagegen in ihrem Wahlkampf die Wechselstimmung in der Bevölkerung. Hernández sprach dabei vor allem die Wähler an, die dem traditionellen Mitte-Rechts-Lager kritisch gegenüberstanden, die sich aber auch von der linken Rhetorik Petros und seiner Vizepräsidentschaftskandidatin Francia Márquez abgeschreckt fühlten. Im Zuge der zunehmenden Polarisierung zwischen dem linken und rechten politischen Lager entfaltete seine Kandidatur immer stärkere Zugkraft, angetrieben durch ein geschicktes politisches Marketing und eine Low-Budget-Kampagne, die stark auf soziale Netzwerke, insbesondere Tictoc, setzte. Bemerkenswert ist der Erfolg von Hernández auch deshalb, weil er bis zum Wahltag nur 70 Prozent der Kolumbianer überhaupt bekannt war. Als ehemaliger Bürgermeister von Bucaramanga, der Hauptstadt der Region Santander, hatte er in der nationalen Politik bis zu seiner Kandidatur keine Rolle gespielt und gehörte auch keiner Partei an, die seine Kampgange hätte unterstützen können. Überregionale Bekanntheit erlangte der Unternehmer, als er als Bürgermeister vor laufenden Kameras einen Stadtrat in seinem Büro ohrfeigte und dafür von seinem Amt suspendiert wurde. Mit volksnaher Sprache und oft polemischen Äußerungen wetterte Hernández gegen die Korruption und die gesamte politische Klasse des Landes und traf damit offenbar bei vielen Wählern den richtigen Nerv. Dass er wegen fragwürdiger Vergabe öffentlicher Aufträge als Bürgermeister selbst in einen Korruptionsprozess verwickelt ist, konnte den Hype um Hernández nicht bremsen. Im Endspurt des Wahlkampfes entzog sich der Unternehmer den Kandidatendebatten und verbreitete stattdessen über die sozialen Netzwerke kostspielige Wahlkampfversprechen. Finanziert würden diese durch den Stopp von Korruption und öffentlicher Geldverschwendung unter seiner Regierung, so Hernández.
Mit populistischen Heilsversprechen gelang es Petro und Hernández, den stark ausgeprägten Wechselwillen in der Bevölkerung und die Wut auf die traditionellen politischen Eliten aufzufangen und in Wählerstimmen umzumünzen. Neben Fico Gutiérrez, dem vermeintlichen Vertreter des politischen Establishments, erlitt auch Sergio Fajardo, ehemaliger Bürgermeister von Medellín, ehemaliger Gouverneur von Antioquia und Präsidentschaftskandidat 2021 ein verheerendes Wahldebakel. Nachdem Fajardo 2018 als aussichtsreicher Kandidat noch knapp die Stichwahl verpasst hatte, erzielte er diesmal nur 4,2 Prozent der Wählerstimmen und lag damit nur geringfügig über der wichtigen 4-Prozent-Hürde, die zur staatlichen Rückerstattung der Wahlkampfkosten berechtigt. Die anderen Kandidaten spielten keine Rolle. Ingrid Betancourt, die internationale Bekanntheit erlangte, als sie als Präsidentschaftskandidatin 2002 von den FARC entführt und bis zu ihrer Befreiung 2008 im Dschungel als Geisel gehalten wurde, stand zwar noch auf dem Wahlzettel. Doch sie hatte ihre Kandidatur wenige Tage vor dem Wahltag zurückgezogen und ihre Unterstützung für Hernández erklärt.
Kolumbien hat für einen radikalen Politikwechsel und gegen das politische Establishment gestimmt und folgt damit einer Tendenz in der Region. Ein gradueller Wandel, wie ihn Federico Gutiérrez oder Sergio Fajardo vorgeschlagen hatten, überzeugte die Wähler nicht. Kurioserweise liegt für Gustavo Petro in der Stunde seines größten Triumpfes bereits der bittere Beigeschmack einer möglichen Niederlage. Denn der heimliche Gewinner des Abends, Rodolfo Hernández, geht aufgrund der wahrscheinlichen Wahlallianzen nun als Favorit in die Stichwahl.
Reaktionen und Ausblick auf die Stichwahl
Nachdem die Auszählungen so weit fortgeschrittenen waren, dass die von der Wahlbehörde veröffentlichten Ergebnisse als gesichert gelten konnten, wandte sich Rodolfo Hernández als erster an die Öffentlichkeit und blieb auch dabei seinem Kommunikationsstil treu. Im charakteristischen gelben Hemd verlas er per Facebookübertragung aus der Küche seines Hauses eine Erklärung vom Blatt, in der er seinen Unterstützern dankte und ein Ende der Korruption unter seiner Regierung ankündigte. Heute hätten die verloren, die glaubten, ewig regieren zu können, so Hernández. Die nüchterne Videobotschaft stand im krassen Gegensatz zu den spontanen Straßenfesten und Auto- und Motorradkorsos in Bucaramanga, die den Wahlerfolg des „Ingenieurs“ – wie seine Anhänger Hernández nennen – bejubelten. Wenig später trat Frederico Gutiérrez in Bogotá vor die Kameras, gestand seine Wahlniederlage ein und erklärte seinen Unterstützern, dass er zwar noch nicht mit Hernández gesprochen habe, dass er aber, um Freiheit und Demokratie in Kolumbien zu schützen, diesen unterstützen werde. Der Wahlsieger des ersten Wahlgangs, Gustavo Petro, trat erst am späten Abend vor seine Anhänger und die Medien. Denn der überraschende Wahlerfolg von Hernández stellte seine bisherige Wahlkampstrategie auf den Kopf. Die eigene Inszenierung als Kandidat des Wandels gegen einen Kandidaten des verkrusteten, politischen Establishments und der Kontinuität, die auf Gutiérrez gemünzt war, läuft gegen das Phänomen Hernández ins Leere. In seiner Ansprache dankte Petro seinen Unterstützern, verwies auf den historischen Wahlerfolg seines Wahlbündnisses und setzte erste Attacken auf den unerwarteten Konkurrenten. Korruption bekämpfe man nicht mit Phrasen auf Tictoc, so Petro. Er und seine politischen Wegbegleiter hätten ihr Leben riskiert, um Korruption aufzudecken und zu bekämpfen. Petro verwies zudem auf das laufende Korruptionsverfahren gegen Hernández. Doch so richtig überzeugend wirkte der bisherige Wahlfavorit nicht. Die Bilder vom verhaltenen Jubel bei Petros Anhängern im Saal einerseits sowie die spontanen Straßenpartys und Jubelszenen in Bucaramanga andererseits standen sinnbildlich für die neuen Kräfteverhältnisse auf der Zielgeraden der Präsidentschaftswahlen.
Petro und seine Wahlkampfstrategen wissen, dass die Chancen in einer Stichwahl mit Hernández schlechter stehen als in dem ursprünglich erwarteten Duell mit Gutiérrez. Nun ist es plötzlich Petro, der sich als seriöser Gegenentwurf zu einem Populisten präsentieren muss, der politisch-ideologisch kaum greifbar ist und der dem lange eingeübten Wahlkampfnarrativ Petros wenig Angriffsfläche bietet. Ein Strategiewechsel könnte darin bestehen, sich künftig als Garanten eines realen und verantwortungsvollen Wandels zu präsentieren, und Hernández Vorschläge als unverantwortlich und nicht umsetzbar zu kritisieren, um damit wieder die alleinige Deutungshoheit über das Zauberwort dieses Wahlkampfes „cambio“ (Wechsel) zu gewinnen. Angesichts der erklärten Unterstützung von Fico Gutierrez für Hernández dürfte Petro zudem versuchen, diesen als Kandidaten von Uribe und der politischen Rechten zu brandmarken. Ob diese Rechnung aufgeht, ist fraglich. Denn der ehemalige Bürgermeister von Bucaramanga gilt als echter Self-made-Politiker ohne Verbindungen in die traditionelle politische Klasse des Landes. Seine Berater werden ihm ohnehin von einem offenen Schulterschluss mit dem Mitte-Rechts-Lager abraten, um seine Unabhängigkeit nicht zu gefährden.
Jenseits offener Wahlallianzen dürfte die überwältigende Mehrheit des Mitte-Rechts-Lagers im zweiten Wahlgang den Unternehmer aus Bucaramanga unterstützen, um Petro zu verhindern. Hernández und Gutiérrez vereinigten im ersten Wahlgang 52 Prozent und 11 Millionen Stimmen auf sich. Experten halten Petros Potential für Zugewinne in der Stichwahl in dieser Konstellation für sehr beschränkt. Selbst wenn Petro die 4 Prozent und 888.000 Stimmen von Fajardo für sich gewinnen könnte, bliebe er weit von einer Mehrheit entfernt. Er müsste zusätzliche Stimmen aus dem Lager der Nichtwähler sowie von Gutiérrez und Hernández anziehen. Derzeit erscheint es wahrscheinlicher, dass sich nicht nur die Petrokritiker aus dem rechten Lager hinter Hernández versammeln, sondern dass auch wichtige Figuren aus der Mitte-Links-Allianz von Sergio Fajardo ins Lager des Unternehmers wandern. Einflussreiche Politiker wie die Senatorin Angélica Lonzano oder der ehemalige Gouverneur von Boyacá, Carlos Amaya, haben sich bereits entsprechend geäußert.
Auch wenn das Momentum und die Wahlarithmetik in der Stichwahl am 19. Juni für Hernández zu sprechen scheinen, bleibt das Rennen offen. Hinter den Kulissen wird in den künftigen Tagen eifrig verhandelt, um offene oder heimliche Allianzen und Unterstützung zu sichern. Spannend bleibt die Frage, ob es Petro gelingen kann, Hernández in einer offenen Debatte zu stellen und dessen Unkenntnis in vielen Politikfeldern und fehlende programmatische Tiefe vorzuführen, oder ob Hernández sich einer öffentlichen Debatte weiter entzieht. Jetzt, wo der einstige Außenseiter im Rampenlicht steht, könnten ihm seine fehlende Sachkenntnis und sein impulsives Naturell zum Nachteil werden.
Fazit
Der Linkspopulist Petro erzielt im ersten Wahlgang ein historisches Stimmergebnis und droht dennoch in der Stichwahl an Überraschungsgegner Hernández zu scheitern. Die überwältigende Mehrheit der Kolumbianer wählt den radikalen Wechsel und beendet die Ära Uribe. Traditionelle politische Parteien und Eliten sowie die Regierung Duque werden abgestraft und bringen keinen eigenen Kandidaten in die Stichwahl. Die im Nachgang zu den Kongresswahlen wegen zahlreicher Fehler stark kritisierten Wahlbehörden haben für einen transparenten Wahlprozess und die zügige Veröffentlichung der Wahlergebnisse gesorgt und damit wichtiges Vertrauenskapital wiederhergestellt. Die Wahlergebnisse wurden noch am Wahlabend von den Hauptakteuren akzeptiert und nicht in Frage gestellt. Der Wahltag verlief weitgehend ohne Zwischenfälle. Angriffe auf Repräsentanten der Wahlkampagnen oder Mitglieder von Polizei und Sicherheitskräften wurden am Wahltag nicht gemeldet. Mit dem Wahldebakel für die traditionelle politische Elite und der Stichwahl zwischen zwei erklärten Gegnern des politischen Establishments folgt Kolumbien einem regionalen Trend. In der Stichwahl am 19. Juni könnte mit Rodolfo Hernández erstmals ein politischer Außenseiter ohne Parteizugehörigkeit ins Präsidentenamt gewählt werden.