Compare commits

..

26 commits

Author SHA1 Message Date
Franziska Kunsmann
bfbdda8ffe
Merge pull request #70 from MaZderMind/t4at-2024-motn-fixes
t4at 2024 motn fixes
2024-11-21 20:11:48 +01:00
Peter Körner
21a8e014ef make-apple-motion: replace xml.sax.saxutils.xmlescape with custom routine, which also escapes quotes
xml.sax.saxutils.xmlescape is only a str.replace in a trencoat anyways.
2024-11-21 19:37:35 +01:00
Peter Körner
a9cbfc5eb3 make-apple-motion: add --snapshot-sec to automatically generate a snapshot of the final clip for inspection or as thumbnail 2024-11-21 19:37:33 +01:00
Peter Körner
41db29d24b make-apple-motion: add --setting-path flag and auto-detect absolute path to default .compressorsetting file 2024-11-21 19:37:08 +01:00
Peter Körner
40eb76b968 make-apple-motion: add --no-cleanup flag 2024-11-21 19:37:03 +01:00
Lukas Schauer
5661e690de
god2024 changes 2024-11-12 12:43:11 +01:00
Lukas Schauer
d8c198f984
god2024 2024-11-12 11:38:27 +01:00
Jannik Beyerstedt
b3fb07a6e3 Merge branch 'feat/refactor-make-ffmpeg' 2024-11-03 21:35:20 +01:00
Jannik Beyerstedt
2451c0f25f bump some versions in requirements.txt
- lxml 5 works
- svg.path has no breaking changes according to change log
- cssutils has a v2, but didn't find a changelog
2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
ca224b9d84 make-ffmpeg: Remove fontfamily option as it doesn't work 2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
8933550f31 make-ffmpeg: Combine with make-ffmpeg-fade 2024-11-03 21:32:53 +01:00
Jannik Beyerstedt
31f01ca386 make-ffmpeg: Use fit_text from make-ffmpeg-fade (break into lines array) 2024-11-03 21:32:51 +01:00
Jannik Beyerstedt
6876f2cf44 make-ffmpeg: Rework config file 2024-11-03 21:25:16 +01:00
Jannik Beyerstedt
526ef6231a make-ffmpeg: add border option 2024-11-02 20:57:55 +01:00
Jannik Beyerstedt
9210d36248 make-ffmpeg: Properly escape special characters 2024-11-02 20:57:55 +01:00
Jannik Beyerstedt
0bb26d6b25 make-ffmpeg: Refactor code 2024-11-02 20:57:48 +01:00
Franziska Kunsmann
26c660a135
vcfb24 switch to make-ffmpeg-fade 2024-10-19 11:00:23 +02:00
Franziska Kunsmann
8ca5d334cb
vcfb24 fix imports 2024-10-19 10:45:29 +02:00
Franziska Kunsmann
367e8ea094
re-add jugendhackt source gimp file 2024-10-19 10:33:17 +02:00
Franziska Kunsmann
c94b840807
vcfb24 2024-10-19 10:31:32 +02:00
Jannik Beyerstedt
471e0c38b7 Merge remote-tracking branch 'github/master' 2024-09-21 22:36:33 +02:00
Jannik Beyerstedt
848b72b113 schedulelib: Ignore missing track field
According to the XML schema, the "track" field of an event is not mandatory. So we should replace it with an empty string if not existing like we do for other fields.
2024-09-01 16:36:15 +02:00
derpeter
3ae90b87c0 added osmodevcon24 2024-05-03 11:53:27 +02:00
Sophie Schiller
1893beda4d
Merge pull request #64 from fkusei/master
fix make-ffmpeg-fade
2024-04-04 08:30:06 +02:00
Franziska Kunsmann
ec29473d53 make-ffmpeg-fade: use better algorythm for determining lines 2024-03-18 14:19:36 +01:00
Franziska Kunsmann
96f410ba6a make-ffmpeg-fade: fix missing import 2024-03-18 14:19:08 +01:00
36 changed files with 36158 additions and 3567 deletions

View file

@ -1,15 +1,13 @@
[default]
[meta]
schedule = https://pretalx.c3voc.de/camp2023/schedule/export/schedule.xml
template = intro.mp4
alpha = false
prores = false
fontfile = true
inout = t
inout_type = t
[title]
in = 16
out = 24
fontfamily = BeonRegular
fontfile = saira.ttf
fontsize = 100
fontcolor = #FB48C4
@ -19,7 +17,6 @@ y = 100
[speaker]
in = 16
out = 24
fontfamily = BeonRegular
fontfile = saira.ttf
fontsize = 70
fontcolor = #3FFF21
@ -29,11 +26,10 @@ y = 800
[text]
in = 16
out = 24
fontfamily = BeonRegular
fontfile = saira.ttf
fontsize = 45
fontcolor = #FB48C4
x = (w-text_w)/2
y = 1000
text = 'Chaos Communication Camp 2023'
text = Chaos Communication Camp 2023

View file

@ -1,15 +1,13 @@
[default]
[meta]
schedule = https://fahrplan.events.ccc.de/camp/2019/Fahrplan/schedule.xml
template = cccamp19_talks_intro_1080p.mov
alpha = true
prores = true
fontfile = true
inout = n
inout_type = n
[title]
in = 193
out = 324
fontfamily =
fontfile = Marvel-Bold.ttf
fontsize = 120
fontcolor = #c68100
@ -19,7 +17,6 @@ y = 480
[speaker]
in = 233
out = 324
fontfamily =
fontfile = Marvel-Regular.ttf
fontsize = 70
fontcolor = #c68100
@ -29,11 +26,10 @@ y = 845
[text]
in = 242
out = 324
fontfamily =
fontfile = Marvel-Regular.ttf
fontsize = 45
fontcolor = #c68100
x = (w-text_w)/2
y = 927
text = 'chaos communication camp 2019'
text = chaos communication camp 2019

View file

@ -1,15 +1,13 @@
[default]
[meta]
schedule = https://pretalx.denog.de/denog11/schedule/export/schedule.xml
template = denog11_intro_template.ts
alpha = false
prores = false
fontfile = true
inout = n
inout_type = n
[title]
in = 1
out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf
fontsize = 100
fontcolor = #f9cc12
@ -19,7 +17,6 @@ y = 200
[speaker]
in = 2
out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf
fontsize = 60
fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 900
[text]
in = 3
out = 6.5
fontfamily =
fontfile = DejaVuSans.ttf
fontsize = 45
fontcolor = #ffffff
x = 640
y = 1000
text = ''
; text =

View file

@ -1,109 +0,0 @@
#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://pretalx.linuxtage.at/glt24/schedule.xml'
#scheduleUrl = 'file:/home/sophie/coding/voc/intro-outro-generator/glt24/schedule__2024-03-25_16-57-04.xml'
def introFrames(args):
#fade in tux and set other opacities to 0
frames = 1*fps
for i in range(0, frames):
yield (
('tux', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
('title', 'style', 'opacity', 0),
('persons', 'style', 'opacity', 0),
)
#fade in title and persons
frames = 2*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
('persons', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
)
#show whole image for 5 seconds
frames = 5*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', 1),
('persons', 'style', 'opacity', 1),
)
def outroFrames(args):
#fadein outro graphics
frames = 3*fps
for i in range(0, frames):
yield(
('tux', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
('cctext', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
('logo', 'style', 'opacity', easeInQuad(i, 0.01, 1, frames)),
)
frames = 3*fps
for i in range(0, frames):
yield(
('tux', 'style', 'opacity', 1),
('cctext', 'style', 'opacity', 1),
('logo', 'style', 'opacity', 1),
)
def debug():
render(
'intro.svg',
'../intro.ts',
introFrames,
{
'$title': " Fully declarative Homelab on NixOS ❄️",
'$persons': 'Long Name of Dr. Dr. Prof. Dr. Long Long'
}
)
#render('outro.svg',
# '../outro.ts',
# outroFrames
#)
def tasks(queue, args, idlist, skiplist):
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl):
if event['room'] not in ('HS i1', 'HS i2', 'HS i7'):
print("skipping room %s (%s)" % (event['room'], event['title']))
continue
if event['day'] not in ('2'):
print("skipping day %s" % (event['day']))
continue
if not (idlist==[]):
if 000000 in idlist:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
if int(event['id']) not in idlist:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
# generate a task description and put it into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id'])+".ts",
sequence = introFrames,
parameters = {
'$title': event['title'],
'$persons': event['personnames']
}
))
# place a task for the outro into the queue
if not "out" in skiplist:
queue.put(Rendertask(
infile = 'outro.svg',
outfile = 'outro.ts',
sequence = outroFrames
))

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 56 KiB

View file

@ -1,714 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1920"
height="1080"
viewBox="0 0 1920 1080"
id="svg2"
version="1.1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="outro.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title4199">Intro GLT Talk $id</title>
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4215">
<rect
style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1"
id="rect4217"
width="598.23157"
height="820.54736"
x="1321.2684"
y="111.3658" />
</clipPath>
<linearGradient
inkscape:collect="always"
id="linearGradient4313">
<stop
style="stop-color:#ffdf00;stop-opacity:1"
offset="0"
id="stop4315" />
<stop
style="stop-color:#e1ecff;stop-opacity:0"
offset="1"
id="stop4317" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4313"
id="linearGradient4159"
x1="1157.7411"
y1="845.13428"
x2="1019.1442"
y2="-16.928713"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.111049,0,0,1.7357139,42.487372,-407.41737)" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4215-3">
<rect
style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1"
id="rect4217-6"
width="598.23157"
height="820.54736"
x="1321.2684"
y="111.3658" />
</clipPath>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4796"
x="-0.049440418"
width="1.0988808"
y="-0.16957685"
height="1.3391537">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="11.131234"
id="feGaussianBlur4798" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4960"
x="-0.36060125"
width="1.7212025"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4962" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4964"
x="-0.30700116"
width="1.614199"
y="-0.1355156"
height="1.2710312">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4966" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4968"
x="-0.28789104"
width="1.5756436"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4970" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4972"
x="-0.37996282"
width="1.7267602"
y="-0.13578054"
height="1.2715611">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4974" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4976"
x="-0.31503033"
width="1.629559"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4978" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4980"
x="-0.30618454"
width="1.6123691"
y="-0.13404269"
height="1.2680854">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4982" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4984"
x="-0.28443687"
width="1.5688737"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4986" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4988"
x="-1.2896075"
width="3.579215"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4990" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4992"
x="-0.4079725"
width="1.815945"
y="-0.13578601"
height="1.271572">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.7383836"
id="feGaussianBlur4994" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5630"
x="-1.1136467"
width="3.2324538"
y="-0.62079014"
height="2.2415803">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5632" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5634"
x="-0.72607727"
width="2.4521545"
y="-0.60484332"
height="2.2096866">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5636" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5638"
x="-0.8303261"
width="2.6606522"
y="-0.63392233"
height="2.2678447">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5640" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5642"
x="-0.81392521"
width="2.6278504"
y="-0.60595519"
height="2.2119104">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5644" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5646"
x="-1.1136475"
width="3.2324552"
y="-0.62079014"
height="2.2415803">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5648" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter5650"
x="-0.60153228"
width="2.2030646"
y="-0.45593307"
height="1.9118661">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="6.613574"
id="feGaussianBlur5652" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.52480581"
inkscape:cx="989.88996"
inkscape:cy="326.78754"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1916"
inkscape:window-height="1040"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Intro GLT Talk $id</dc:title>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:creator>
<cc:Agent>
<dc:title>meisterluk</dc:title>
</cc:Agent>
</dc:creator>
<dc:identifier>$id</dc:identifier>
<dc:language>$language</dc:language>
<dc:rights>
<cc:Agent>
<dc:title>CC-BY AT 4.0</dc:title>
</cc:Agent>
</dc:rights>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,27.63784)">
<rect
style="opacity:1;fill:#dd9640;fill-opacity:1;stroke:none;stroke-width:0.99601775;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.99601775, 2.98805323;stroke-dashoffset:0;stroke-opacity:1"
id="rect4332"
width="1920"
height="1080"
x="0"
y="-27.63784" />
<g
transform="matrix(0.83983181,0,0,0.83983181,767.53662,66.962691)"
style="display:inline"
id="tux">
<path
id="path5578"
style="fill:#ffffff;stroke:#ffffff;stroke-width:32;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="m 302.39927,158.25906 c 4.95972,27.22874 1.0154,56.17731 12.50548,82.12068 12.59936,23.52316 26.6976,46.41063 44.72227,66.66421 18.80391,23.2771 30.30057,51.16114 34.63712,80.04146 3.47677,15.36121 5.54615,34.0451 -7.98699,45.84849 4.09204,7.00434 16.02765,8.84112 14.42729,17.32327 -0.41492,17.07705 16.61211,27.42692 30.17191,35.50021 7.89896,3.73334 12.48974,14.81843 4.0584,20.44735 -13.07656,10.07265 -28.28654,16.91132 -43.49079,23.55278 -14.42168,6.89378 -25.88389,17.63719 -37.27092,28.16718 -13.11299,10.23041 -32.50543,9.0026 -47.64415,3.95549 -8.57147,-3.09835 -11.09801,-11.99098 -16.7305,-17.72675 -31.55954,-2.45964 -72.48996,-4.3004 -100.05912,0.39664 -15.33226,2.0838 -23.87824,16.07462 -37.54869,21.0067 -16.41847,2.61149 -31.4464,-7.03163 -46.48659,-11.75918 -25.212812,-9.97879 -53.01561,-11.32554 -78.712766,-19.6238 -8.948525,-2.81699 -9.394291,-12.89251 -5.401021,-19.61121 5.498182,-10.94002 5.315258,-23.5007 0.521375,-34.61977 -2.867591,-8.78669 -0.938595,-23.05432 11.278204,-23.61968 11.239188,-0.26876 26.6409,2.21336 32.639358,-9.47048 3.083812,-4.48378 2.938329,-11.16296 7.389143,-14.5755 7.395926,-1.93238 2.729126,-14.92366 2.413592,-22.80524 -0.674048,-16.83673 12.886852,-29.82931 18.52497,-44.98683 9.515295,-19.95436 14.430415,-42.30263 30.252535,-59.09709 12.15921,-14.84682 23.07189,-30.60364 34.03076,-46.20927 3.34849,-10.50708 -0.47655,-21.85396 0.0335,-32.70971 -0.79498,-16.30099 -1.42519,-33.0826 -2.02144,-47.75136 l 2.95966,-17.54244 c -16.6897,-7.27789 -34.24246,-33.56744 -16.44443,-47.03439 14.09142,-3.16724 20.77367,-4.84393 23.76492,-20.642574 3.99544,-21.10253 13.82487,-43.1248 32.08351,-57.09464 18.07979,-9.5916 20.26033,28.01404 32.68472,4.33361 15.25333,-21.43753 39.38222,-6.61056 44.05893,14.89553 -10.87707,-29.023396 8.70854,-14.810027 6.69365,-36.934081 32.14094,-3.075196 68.01,6.11296 88.88342,30.52034 -20.17114,16.186215 -39.78936,33.59352 -55.32554,53.818925 -11.27302,10.09573 0.98494,15.06509 0.98494,15.06509 7.73205,16.87569 -4.16878,26.43789 -14.59671,40.15604 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccccscccccccscccccccc" />
<path
inkscape:connector-curvature="0"
id="path5580"
d="m 190.64953,200.73493 c 21.1249,-9.68557 44.52455,2.23507 64.79428,8.53199 11.09401,2.35619 19.02666,7.39285 18.75785,18.69403 0.12067,14.13474 -28.98641,17.28417 -38.96944,28.16856 -17.73072,12.14113 -43.33213,10.63659 -57.96702,-5.22547 -19.47628,-10.91984 -13.79198,-34.68293 4.60816,-43.5826 2.88288,-2.24519 5.81977,-4.42807 8.77617,-6.5865"
style="display:inline;fill:#f8c200;fill-rule:evenodd;stroke:none" />
<path
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 201.03939,203.38446 c -3.58171,-1.49763 -12.58395,1.40768 -7.94981,5.61535 3.46697,-0.18093 5.10755,-5.15101 7.94981,-5.61535 z"
id="path5582"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 215.94525,203.9193 c 2.08632,4.09932 14.28325,3.45115 6.9563,-0.93603 -1.66897,0.47167 -6.71314,-0.88117 -6.9563,0.93603 z"
id="path5584"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 169.0979,230.25872 c 9.53709,2.48878 11.38486,14.93391 22.24539,15.03042 21.61843,1.60545 42.1343,-6.95013 61.7959,-14.22809 1.4348,-3.5524 8.35574,-7.95405 8.94367,-1.6045 -5.91924,7.19895 -17.39371,7.67049 -25.85587,11.36253 -13.15975,5.7875 -27.03515,12.36695 -42.08843,9.78535 -2.60893,-0.13323 -14.5588,-2.29892 -8.24728,3.1651 7.03153,7.39136 18.01397,10.58315 28.06661,7.10743 14.12696,-4.44006 27.45763,-11.10186 40.72346,-17.13058 8.36013,-0.51548 2.53243,7.95095 -2.3938,8.57356 -15.08193,5.38056 -27.85293,15.17646 -40.03327,24.86877 -9.09713,4.49169 -20.6032,1.87351 -26.12102,-6.41779 -6.05872,-5.12938 -7.79844,-14.55251 -15.47364,-17.64888 -1.79367,-7.96162 -6.986,-20.85113 -1.56172,-22.86332 z"
id="path5586"
sodipodi:nodetypes="cccccccccccccc" />
<path
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccscccccscccccccccccccc"
transform="translate(-145.68882,-239.1525)"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 511.40907,651.8895 c -3.81532,-4.78934 -10.13414,-7.11259 -15.33744,-9.59965 2.30202,-12.52248 7.01262,-25.1968 5.04847,-38.21511 -2.16137,-21.87 -14.32051,-41.98289 -28.7453,-58.79093 -2.62421,-2.73048 -8.73719,-8.77742 -11.65136,-6.88161 16.30392,21.65596 32.70499,45.24438 34.57979,72.52686 0.46573,11.74421 0.49787,27.39 -11.7241,34.03495 -5.99389,1.66394 -16.81296,2.78663 -16.60946,-5.74921 -0.34464,-22.43388 1.25476,-46.35207 -11.30802,-66.49236 -7.14168,-13.26959 -16.17872,-25.8642 -18.64585,-40.87166 -3.55964,-12.66517 -10.26702,-24.16753 -18.88096,-34.36185 -7.3109,-8.72912 -4.60929,-19.97448 -1.07232,-29.52283 3.52499,-8.08996 -5.22804,-13.36139 -12.58437,-14.41397 -9.89629,-3.24322 -25.40292,-5.92182 -26.09246,-18.10164 -1.38142,-8.83584 5.53151,-20.02158 16.2918,-17.11791 10.57919,0.79152 14.70046,12.21226 10.48644,20.40447 -3.95905,4.89468 0.27693,10.14486 6.2866,9.46086 7.8762,-2.04071 6.63047,-12.50202 6.11653,-18.63027 -2.20963,-10.70274 -4.98628,-25.62682 -18.88095,-27.543 -8.96236,-2.3978 -20.12449,-1.44896 -24.73445,7.34389 -6.36375,8.62749 -6.45662,19.61884 -5.21939,29.55824 -6.05912,-0.78781 -13.09034,-2.58248 -19.73284,-1.73815 -4.83073,-2.75032 -0.86227,-9.95548 -2.83908,-14.43988 -0.23034,-9.68585 -8.05088,-22.08609 -19.965,-18.56056 -14.68354,4.59163 -14.1766,21.98042 -11.65851,33.69818 1.20292,4.1656 2.40446,13.11421 8.62568,11.87048 5.49701,-4.21628 3.43643,-7.56077 -1.84549,-10.16128 -4.81923,-7.05191 -5.70263,-20.871 6.10434,-21.79373 8.8868,-0.0196 13.2223,10.89843 12.39516,18.01787 -1.23073,7.68368 -11.1149,9.62965 -15.60772,15.41161 -6.15392,3.52876 -14.73413,11.07513 -9.42209,18.17991 2.33156,8.90786 4.84784,17.94697 1.56172,22.86332 -3.05798,13.5649 -11.40017,25.50586 -17.31921,38.10568 -3.79561,8.87603 -0.36666,18.54331 -2.56326,27.45343 -12.32734,16.53359 -21.2438,35.58022 -25.64701,55.38046 -2.407,12.51354 -2.67412,25.25507 -2.59557,37.90035 -1.7857,6.93255 -9.541,-0.40385 -12.06678,-3.34265 -11.19452,-11.76883 -6.38251,-28.69017 -4.11671,-42.38406 -5.64115,3.30146 -6.16939,12.12181 -7.17578,18.17347 -2.02742,16.26902 6.61987,32.00041 20.11585,41.85477 16.96278,15.38569 35.75518,28.82623 53.81464,42.95462 8.16682,5.91339 10.25021,18.87535 0.50626,24.43148 -4.06382,2.71521 -9.48369,4.31218 -8.83669,7.32459 0.2421,1.12723 1.33369,2.45265 3.6637,4.10901 l -11.72975,-9.53528 c -1.62155,-2.39931 -3.29406,-4.72669 -4.94523,-6.96896 -16.40404,-22.13097 -30.3375,-46.58884 -51.80142,-64.85118 -6.28565,-5.58611 -15.33608,-4.94951 -22.28782,-0.93605 -6.72477,0.16472 -4.54697,-11.28231 -4.6406,-13.46061 -0.73683,-17.14153 13.12175,-30.37303 18.86265,-45.80686 9.68875,-20.31807 14.69346,-43.07372 30.80398,-60.1743 12.38084,-15.11746 23.49244,-31.16149 34.65109,-47.05157 3.40953,-10.69862 -0.48525,-22.25233 0.0341,-33.30596 -0.81189,-16.20257 -1.39425,-32.4135 -2.05831,-48.62178 h 2e-5 c -0.56641,-24.19405 2.77653,-52.95259 25.77385,-67.8525 21.59677,-12.67894 49.32924,-12.32766 73.24689,-6.41186 25.82378,6.60253 46.98823,27.93022 49.38305,53.43286 5.05013,27.72506 1.0339,57.2013 12.73343,83.61757 12.82902,23.95195 27.18424,47.25661 45.53748,67.87937 19.14667,23.70141 30.8529,52.09373 35.26849,81.50047 3.54015,15.64122 5.64725,34.66568 -8.13258,46.68421 z"
id="path5588"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cccccccccccccc"
transform="translate(-145.68882,-239.1525)"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 326.56973,781.34152 c 13.02664,-6.78672 10.0856,-25.268 -0.80527,-32.54657 -2.9699,-6.336 7.89961,-2.5876 9.55567,0.69945 13.12158,10.92111 32.22597,6.97917 48.12175,6.02246 17.60208,-1.3639 34.9205,-9.5678 44.10169,-24.17183 2.27383,-3.69641 9.71717,-7.52753 10.73933,-0.98391 2.73802,15.13733 -10.47328,29.82698 -4.98608,44.82643 2.96954,2.67573 4.74315,1.94565 5.67297,0.0729 2.9245,4.91899 0.79588,8.95917 0.11902,13.25183 -0.72831,-0.95628 -1.66576,-2.04363 -2.49901,-2.89216 -10.38716,-2.80837 -21.8866,-1.29462 -32.719,-1.95363 -23.02775,0.67509 -46.41921,-1.75934 -69.16402,2.3575 -4.30191,0.58468 -8.07914,2.08994 -11.58544,4.06914 z"
id="path5590"
inkscape:connector-curvature="0" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#ffffff;stroke:none"
d="m 446.051,494.82468 c -2.02429,-0.36568 -9.25652,-7.47605 -10.9217,-10.73764 -1.63059,-3.19389 -1.84902,-7.39086 -0.41209,-7.91766 0.61922,-0.227 1.87261,0.48668 3.51511,2.00148 1.4041,1.29485 4.65893,3.27294 7.23304,4.39579 5.70256,2.48751 6.94106,3.98717 6.35833,7.69929 -0.28474,1.81431 -0.89185,2.97493 -1.98602,3.79716 -0.86667,0.65129 -1.74502,1.14836 -1.9519,1.10462 -0.20681,-0.0438 -1.03247,-0.1981 -1.83477,-0.34304 z"
id="path5592" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#ffffff;stroke:none"
d="m 261.36105,572.40414 c 0,-0.60552 1.23622,-2.53546 2.74712,-4.28876 1.51094,-1.75332 2.91993,-4.08304 3.13114,-5.17721 0.47513,-2.4616 1.83159,-4.61745 2.90532,-4.61745 1.26985,0 2.83161,1.99025 2.83161,3.60844 0,1.65786 -2.34634,4.98157 -6.29802,8.92149 -2.82271,2.8144 -5.31717,3.54316 -5.31717,1.55349 z"
id="path5594" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 392.15582,423.95204 c 5.89646,0.85476 5.43298,8.60913 8.3758,11.09749 5.43472,-3.01937 0.67143,-12.60031 -5.12545,-13.71153 -2.44009,-1.89797 -8.17716,1.40675 -3.25035,2.61404 z"
id="path5596" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 329.69284,422.61503 c -5.35938,2.55745 3.54968,6.4248 2.69712,10.56252 0.96421,8.11847 5.73813,-1.36523 2.09524,-4.76233 -0.70141,-1.84312 -2.07474,-6.71607 -4.79236,-5.80019 z"
id="path5598" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#ffffff;stroke:none"
d="m 399.13738,432.31981 c -2.58114,-6.06398 -3.30178,-7.03323 -6.19548,-8.33266 -2.67498,-1.20124 -2.78093,-1.33265 -1.68874,-2.0956 1.60706,-1.12259 3.13158,-1.02048 5.74946,0.38514 4.12866,2.21675 6.72843,7.91442 5.01049,10.98095 -1.01432,1.81065 -1.81728,1.54878 -2.87567,-0.93783 z"
id="path5600" />
<path
transform="translate(-145.68882,-239.1525)"
inkscape:connector-curvature="0"
style="display:inline;fill:#ffffff;stroke:none"
d="m 332.59333,433.0656 c -0.33934,-1.47634 -1.53458,-3.97448 -2.65605,-5.55142 -1.80813,-2.54245 -1.89302,-3.00684 -0.74861,-4.10011 1.13262,-1.082 1.43038,-1.08489 2.43298,-0.0235 2.19051,2.31894 4.27234,8.0774 3.70328,10.24338 -0.7639,2.90767 -1.99139,2.65233 -2.7316,-0.56831 z"
id="path5602" />
<path
inkscape:connector-curvature="0"
id="path5604"
d="m 107.47335,426.57322 c 16.97018,16.80535 38.91986,44.13651 51.95284,65.39796 11.23055,18.32105 23.73527,35.55008 12.88255,53.92275 -2.43239,22.90516 -30.47675,14.42756 -46.28163,11.31035 -29.58883,-7.78398 -59.32627,-15.1352 -89.01179,-22.58147 -4.60691,-3.17663 -17.9842,-2.25449 -15.82797,-8.59183 2.74572,-9.46094 7.49606,-18.93996 9.03988,-28.39006 -2.94161,-11.05345 -10.69462,-21.57622 -8.88773,-33.20719 8.81448,-10.20366 26.32568,0.0121 37.75431,-7.6135 8.55049,-0.5412 6.7685,-9.76499 9.25162,-15.40471 2.23193,-9.54402 1.939408,-16.91009 12.368675,-21.67403 8.491568,-3.87883 21.041475,0.60647 26.759245,6.83173 z"
style="display:inline;fill:#f8c200;fill-rule:evenodd;stroke:none"
sodipodi:nodetypes="csccccccccsc" />
<path
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 177.43252,550.94063 c -9.21814,5.20334 -16.5637,13.68233 -26.6477,17.32047 -16.71775,2.65909 -32.0196,-7.1598 -47.33396,-11.97351 -25.67239,-10.1607 -53.98199,-11.532 -80.14755,-19.9815 -9.11164,-2.86836 -9.56553,-13.12754 -5.49947,-19.96869 5.59839,-11.13944 5.41215,-23.9291 0.53088,-35.25084 -2.91987,-8.94684 -0.95571,-23.47456 11.48378,-24.05022 11.44406,-0.27366 27.12651,2.25372 33.23432,-9.64311 3.14003,-4.56551 2.99189,-11.36642 7.52382,-14.84117 3.84319,7.36363 -0.68436,16.75103 -4.40071,23.66571 -8.80585,10.73778 -24.35547,4.77617 -36.31344,5.303 -9.6553,1.11194 -6.50756,12.04903 -3.00832,17.42406 7.12515,11.88369 9.35132,28.10752 -1.42127,38.77655 -5.76834,4.4693 -3.60748,12.33492 4.15886,12.60579 35.4094,8.49526 70.89049,16.90418 106.51262,24.47934 12.12974,2.44969 26.5556,-2.21826 30.28201,-14.32198 4.96342,-11.2195 4.50071,-24.9346 -0.65234,-36.29023 -1.15911,-2.5543 -4.279,-8.03783 -6.63133,-12.86335 l 9.33634,13.75224 c 7.76099,10.51045 22.17757,28.75139 14.03745,41.7217 -1.39471,2.22231 -3.07735,3.11656 -5.04399,4.13574 z"
id="path5606"
sodipodi:nodetypes="ccccccccccccccccsccsc" />
<path
inkscape:connector-curvature="0"
id="path5608"
d="m 403.42269,445.86199 c -0.0791,7.6043 -0.15834,15.20863 -0.23752,22.81295 10.15616,6.92292 21.45557,12.89719 30.90745,20.4045 9.50928,9.90014 3.576,18.3032 -8.86782,22.98162 -15.88865,6.63518 -30.67103,15.01808 -44.24564,25.23572 -9.35623,5.95675 -18.12228,13.41929 -27.83705,18.46124 -12.05285,0.86765 -24.10571,1.73532 -36.15857,2.60298 -5.63667,-9.79681 -12.91585,-19.20212 -17.53297,-29.24196 1.17409,-31.33085 2.34817,-62.66169 3.52227,-93.99254 7.63652,-4.02219 13.91036,-12.46791 23.55796,-9.96174 20.30327,-0.95476 38.88471,9.25625 59.05053,9.16864 7.13716,1.08705 16.82329,3.47534 17.84136,11.52857 z"
style="display:inline;fill:#f8c200;fill-rule:evenodd;stroke:none" />
<path
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 293.11001,536.27895 c 1.26709,-2.55201 1.28471,-7.5434 1.80927,-10.1122 4.87353,-23.27603 4.1822,-47.14156 4.44316,-70.74223 -0.27022,-9.99394 -2.93767,-25.00712 9.5676,-29.42379 4.86683,-0.58759 13.63422,-3.26946 16.04178,2.00538 -3.7037,5.45766 -14.24357,0.39989 -17.23497,7.70243 -5.17962,10.87427 -3.61455,23.68757 -1.84403,35.1868 4.20685,15.26633 5.23332,31.1349 1.70421,46.62065 -2.5576,11.22504 -2.02896,24.89298 9.14163,31.94692 13.38949,9.79666 32.67077,4.22297 43.39965,-6.5753 13.27213,-10.55679 28.06845,-19.76448 45.25684,-23.37087 12.01199,-4.0197 27.47823,-7.8082 32.15208,-20.38031 -0.0651,-9.88956 -13.51058,-11.96057 -21.52644,-13.7957 -15.29895,-3.74589 -19.26448,-21.4007 -18.15172,-34.31073 -0.27716,-7.75082 7.5891,-8.80695 5.95958,-0.17019 -0.42248,17.38833 16.91492,27.92686 30.72188,36.14731 8.04297,3.8014 12.71743,15.08855 4.1324,20.82005 -13.31493,10.25627 -28.80215,17.21959 -44.28357,23.98214 -14.68454,7.01943 -26.35569,17.95867 -37.9503,28.68059 -13.35202,10.4169 -33.09793,9.16671 -48.51262,4.02759 -7.45967,-2.69646 -10.42284,-9.70298 -14.70741,-15.32867"
id="path5610" />
<path
inkscape:connector-curvature="0"
style="display:inline;fill:#000000;fill-rule:nonzero;stroke:none"
d="m 389.13838,433.22076 c -12.16955,11.55576 -26.89029,26.89709 -45.99538,23.79918 -14.82985,-4.78899 -24.76624,-20.97397 -22.85602,-35.43151 3.46121,-12.90886 21.15219,-13.92849 32.55537,-11.47442 3.25291,-0.0697 14.44936,7.93863 12.8779,2.62299 10.58873,0.64418 18.90024,6.34883 23.41813,20.48376 z"
id="path5612"
sodipodi:nodetypes="cccccc" />
<path
sodipodi:nodetypes="ccccssccsc"
inkscape:connector-curvature="0"
id="path5614"
d="m 289.88849,103.24784 c 24.9636,-0.49799 36.64782,21.81701 21.99644,42.53264 -12.79239,20.09626 -40.6322,20.42579 -62.60862,23.36844 -29.88638,1.73177 -61.55246,3.27129 -89.66445,-7.97371 -16.6897,-7.27789 -37.15611,-38.71843 -16.44443,-47.03439 21.89678,-8.79179 20.77367,-4.84393 23.76492,-20.642574 3.99544,-21.10253 13.82487,-43.1248 32.08351,-57.09464 18.07979,-9.5916 20.26033,28.01404 32.68472,4.33361 15.25333,-21.43753 39.38222,-6.61056 44.05893,14.89553 3.52927,16.22952 9.92567,31.62192 14.12898,47.615094 z"
style="display:inline;fill:#006c34;fill-rule:evenodd;stroke:#000000;stroke-width:6.57600021;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5616"
d="m 139.46118,117.14937 c 33.62867,45.49425 159.89149,33.56521 178.34525,2.84522"
style="display:inline;fill:none;stroke:#000000;stroke-width:6.57633829;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="ccsccc"
inkscape:connector-curvature="0"
id="path5618"
d="m 159.54841,106.89551 c 37.36717,10.26274 79.3151,17.18779 116.77335,3.58875 9.47785,-3.23766 16.34199,-14.762433 16.75462,4.34473 0.24653,11.41565 8.53529,19.30305 1.69723,22.65883 -40.44952,15.93698 -101.9237,15.01864 -136.25135,-1.80879 -5.15636,-6.86691 0.7629,-20.13781 1.02615,-28.78352 z"
style="display:inline;fill:#000000;fill-rule:evenodd;stroke:none" />
<g
transform="translate(-145.68882,-239.1525)"
style="display:inline"
id="g5620">
<path
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:6.57633829;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="m 517.02542,288.78824 c -28.76116,23.07925 -56.39823,48.64105 -72.6807,81.31492 -18.78146,-0.49478 -11.03643,-18.05637 -11.64245,-30.61129 0.69491,-27.13576 -0.96154,-54.29894 -4.56026,-81.22397 32.14094,-3.0752 68.01,6.11296 88.88341,30.52034 z"
id="path5622"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:6.57633829;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="m 430.45667,278.97813 c 24.11568,4.78447 47.03876,11.62624 68.3531,23.44545 -19.27943,17.39006 -32.80723,34.21969 -32.80723,34.21969 -12.89435,-11.14801 -32.50544,-13.91412 -32.50544,-13.91412 0,0 -2.30645,-33.34508 -3.04043,-43.75102 z"
id="path5624"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
</g>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="959.36597"
y="677.32166"
id="cctext"><tspan
sodipodi:role="line"
id="tspan5631"
x="959.36597"
y="677.32166"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1">Content released under CC-BY AT 3.0</tspan></text>
<g
id="logo"
transform="translate(209.24617,40)">
<rect
style="display:inline;opacity:0.5;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:14.74640846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4796)"
id="rect5522"
width="689.47974"
height="201.01898"
x="406.01398"
y="687.32812"
inkscape:export-filename="/home/flo/Documents/projects/linuxtage/gltgit/glt12/grafiken/shirts/linuxtage2012-hinten_10jahre_v2.png"
inkscape:export-xdpi="80.963211"
inkscape:export-ydpi="80.963211" />
<path
sodipodi:nodetypes="ccccccc"
d="M 529.0372,834.41418 H 498.25177 V 721.50906 H 484.3564 v 134.24459 h 44.6808 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4992)"
id="path5524"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccc"
d="M 558.84478,855.75365 V 721.50906 h -14.13495 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4988)"
id="path5526"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="m 591.61606,855.75365 v -110.5772 h 1.67703 l 25.2752,110.5772 h 23.11902 V 721.50906 h -14.13495 v 110.57719 h -1.67703 L 601.19908,721.50906 H 577.6009 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4984)"
id="path5528"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccsssccsscc"
d="m 674.18158,721.50906 h -14.01516 v 90.98369 c 0,31.81516 9.10389,45.00685 29.70735,45.00685 20.84303,0 29.82713,-13.19169 29.82713,-45.00685 v -90.98369 h -14.01516 v 90.98369 c 0,16.87755 -5.03109,23.2794 -15.81197,23.2794 -10.6611,0 -15.69219,-6.20786 -15.69219,-23.2794 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4980)"
id="path5530"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="m 731.50374,721.50906 23.11902,67.70427 -23.11902,66.54032 h 15.69218 l 16.17133,-50.24473 16.05155,50.24473 h 15.69219 l -22.75966,-66.54032 22.75966,-67.70427 H 779.4188 l -16.05155,51.2147 -16.17133,-51.2147 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4976)"
id="path5532"
inkscape:connector-curvature="0" />
<path
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4972)"
d="m 809.81806,721.50709 -7.375,21.9375 h 17.84375 v 112.3125 h 13.875 v -112.3125 h 20.84375 v -21.9375 z"
id="path5534"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
sodipodi:nodetypes="cccccccccccccc"
d="m 873.50641,855.75365 4.07278,-26.77132 h 28.86883 l 4.55193,26.77132 h 14.13494 L 905.6095,721.50906 h -26.47307 l -19.76497,134.24459 z m 20.96284,-114.26311 9.34344,66.34632 H 880.4541 l 9.7028,-66.34632 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4968)"
id="path5536"
inkscape:connector-curvature="0" />
<path
d="m 966.35098,799.76297 h 13.34345 v 35.42719 c -0.11979,0 -7.06748,1.35797 -11.73919,1.35797 -15.33281,0 -19.04624,-13.96767 -19.04624,-48.11078 0,-35.11307 4.55193,-47.72279 19.40559,-47.72279 9.94238,0 25.38098,0.0342 25.38098,0.0342 l -0.0283,-19.33797 c 0,0 -15.76972,-0.0356 -27.38911,-0.0356 -23.47837,0 -31.86353,20.50347 -31.86353,67.06223 0,44.23084 7.66644,67.45024 32.34268,67.45024 9.46321,0 26.83243,-0.24407 26.83243,-0.24407 l 0.20101,-76.79701 h -27.23881"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4964)"
id="path5538"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccsssccsssccc" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="m 1060.7439,855.75365 v -20.95147 h -36.655 v -35.50111 h 29.4677 v -20.36948 h -29.4677 v -36.47106 h 36.655 v -20.95147 h -50.5504 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';display:inline;opacity:0.4;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4960)"
id="path5540"
inkscape:connector-curvature="0" />
<g
transform="translate(0,-80)"
id="g5654">
<path
inkscape:connector-curvature="0"
id="path5544"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5650)"
d="m -609.9432,74.185678 h 4.8178 v 16.092469 c -0.39737,0.132449 -0.97683,0.281453 -1.73838,0.447013 -0.72849,0.165561 -1.58941,0.331121 -2.58274,0.496681 -0.96028,0.165561 -2.01986,0.298009 -3.17876,0.397345 -1.15894,0.132448 -2.33442,0.198672 -3.52644,0.198673 -2.41719,-10e-7 -4.61915,-0.397345 -6.60586,-1.192035 -1.98673,-0.794688 -3.692,-1.95361 -5.11581,-3.476768 -1.42383,-1.52315 -2.53308,-3.39398 -3.32776,-5.612497 -0.76159,-2.218497 -1.14237,-4.768124 -1.14237,-7.648889 0,-2.880731 0.43045,-5.430358 1.29137,-7.64889 0.89402,-2.251594 2.08605,-4.13898 3.5761,-5.662165 1.49004,-1.523123 3.22842,-2.682045 5.21516,-3.476768 2.01982,-0.794655 4.1721,-1.191999 6.45685,-1.192034 1.55625,3.5e-5 2.9304,0.09937 4.12245,0.298008 1.22513,0.198707 2.26816,0.430492 3.12909,0.695354 0.86089,0.26493 1.55624,0.529827 2.08607,0.79469 0.56287,0.264929 0.94366,0.463602 1.14236,0.596017 l -1.53971,4.023117 c -0.96028,-0.6291 -2.23509,-1.142336 -3.82444,-1.539711 -1.58941,-0.430426 -3.2119,-0.645655 -4.86748,-0.645686 -1.75496,3.1e-5 -3.36089,0.314596 -4.81781,0.943694 -1.42383,0.629159 -2.64897,1.53974 -3.67544,2.731747 -0.99337,1.192061 -1.7715,2.64899 -2.3344,4.370794 -0.56291,1.688737 -0.84436,3.592679 -0.84436,5.711833 0,2.052964 0.23178,3.923794 0.69536,5.612497 0.49667,1.688725 1.22513,3.145655 2.18539,4.370794 0.99336,1.19204 2.20194,2.119178 3.62578,2.781414 1.45691,0.662245 3.16218,0.993366 5.11581,0.993362 1.39069,4e-6 2.56617,-0.06622 3.52644,-0.198672 0.99334,-0.165557 1.70525,-0.314561 2.13573,-0.447013 V 74.185678"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
<path
inkscape:connector-curvature="0"
id="path5546"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5646)"
d="m -588.14976,64.748737 c 0.39733,2.6e-5 0.84434,0.03314 1.34104,0.09934 0.52977,0.03314 1.04301,0.09936 1.53971,0.198672 0.49666,0.06625 0.94367,0.149031 1.34104,0.248341 0.43043,0.06625 0.745,0.132474 0.94369,0.198673 l -0.79469,4.023117 c -0.36425,-0.132427 -0.97682,-0.281431 -1.83772,-0.447013 -0.82782,-0.198651 -1.90396,-0.297987 -3.22843,-0.298009 -0.86092,2.2e-5 -1.72184,0.09936 -2.58274,0.298009 -0.82781,0.165582 -1.37416,0.281474 -1.63905,0.347676 v 21.704966 h -4.61913 v -24.73472 c 1.09269,-0.39732 2.45029,-0.761553 4.07278,-1.092699 1.62249,-0.364207 3.44365,-0.546323 5.4635,-0.546349"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
<path
inkscape:connector-curvature="0"
id="path5548"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5642)"
d="m -569.54285,87.794742 c 1.09269,3e-6 2.05294,-0.01655 2.88075,-0.04967 0.8609,-0.06622 1.57281,-0.165556 2.13573,-0.298008 v -7.698558 c -0.33114,-0.165549 -0.87748,-0.297997 -1.63904,-0.397345 -0.72849,-0.132436 -1.62251,-0.19866 -2.68208,-0.198672 -0.69537,1.2e-5 -1.44039,0.04968 -2.23507,0.149004 -0.76159,0.09935 -1.4735,0.314576 -2.13573,0.645686 -0.62913,0.298019 -1.15893,0.728476 -1.58938,1.291371 -0.43046,0.529802 -0.64569,1.241711 -0.64568,2.135728 -10e-6,1.65561 0.52978,2.814532 1.58938,3.476768 1.05957,0.629133 2.49995,0.943698 4.32112,0.943695 M -569.94019,64.6494 c 1.85426,2.6e-5 3.41053,0.248366 4.6688,0.745021 1.29135,0.463595 2.31783,1.142391 3.07942,2.036393 0.79467,0.860937 1.35758,1.903966 1.68872,3.129091 0.3311,1.192054 0.49666,2.516536 0.49668,3.973449 v 16.142137 c -0.39737,0.06622 -0.96027,0.165561 -1.68871,0.298009 -0.69538,0.09934 -1.49007,0.198672 -2.38407,0.298009 -0.89405,0.09934 -1.87085,0.182116 -2.93042,0.24834 -1.02649,0.09934 -2.05296,0.149004 -3.07943,0.149004 -1.45694,0 -2.79798,-0.149004 -4.02311,-0.447013 -1.22516,-0.298008 -2.28474,-0.761577 -3.17876,-1.390707 -0.89403,-0.662239 -1.58939,-1.523152 -2.08606,-2.582742 -0.49669,-1.059581 -0.74503,-2.334395 -0.74502,-3.824444 -10e-6,-1.423811 0.28145,-2.648956 0.84435,-3.675441 0.59602,-1.026462 1.39071,-1.854263 2.38407,-2.483406 0.99336,-0.629114 2.15228,-1.092683 3.47677,-1.390707 1.32447,-0.297993 2.71518,-0.446997 4.17212,-0.447013 0.46356,1.6e-5 0.94368,0.03313 1.44038,0.09934 0.49666,0.03313 0.96023,0.09935 1.3907,0.198673 0.46356,0.06624 0.8609,0.132464 1.19204,0.198672 0.3311,0.06624 0.56289,0.115908 0.69535,0.149005 v -1.291371 c -10e-6,-0.761561 -0.0828,-1.506582 -0.24834,-2.235065 -0.16558,-0.761559 -0.46358,-1.4238 -0.89402,-1.986725 -0.43048,-0.595996 -1.02649,-1.059565 -1.78806,-1.390707 -0.72848,-0.364211 -1.68872,-0.546327 -2.88075,-0.546349 -1.52316,2.2e-5 -2.8642,0.115914 -4.02311,0.347676 -1.12582,0.198695 -1.97018,0.413923 -2.53308,0.645686 l -0.54635,-3.824445 c 0.59602,-0.264871 1.58938,-0.513211 2.98009,-0.745022 1.3907,-0.26487 2.8973,-0.397318 4.5198,-0.397344"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
<path
inkscape:connector-curvature="0"
id="path5550"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5638)"
d="m -535.05377,68.771854 c -0.69537,0.761599 -1.62251,1.837741 -2.78141,3.228427 -1.12583,1.390725 -2.35098,2.930435 -3.67544,4.619135 -1.29139,1.688729 -2.59931,3.460223 -3.92379,5.314488 -1.29138,1.854284 -2.43374,3.625778 -3.4271,5.314488 h 14.20509 v 3.874113 h -19.71825 v -3.079423 c 0.79469,-1.456927 1.7715,-3.062861 2.93042,-4.817807 1.15892,-1.75493 2.36751,-3.493312 3.62577,-5.215152 1.29137,-1.754925 2.53307,-3.393971 3.72511,-4.917143 1.22514,-1.556248 2.28472,-2.864174 3.17876,-3.923781 h -12.7647 v -3.874113 h 18.62554 v 3.476768"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
<path
inkscape:connector-curvature="0"
id="path5552"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5634)"
d="m -531.02678,78.258464 c 0,-2.284718 0.33112,-4.271441 0.99336,-5.960174 0.66224,-1.721807 1.53971,-3.145625 2.63242,-4.271458 1.09269,-1.125786 2.35094,-1.970143 3.77477,-2.533073 1.42381,-0.56288 2.88074,-0.844332 4.3708,-0.844358 3.47675,2.6e-5 6.14227,1.092723 7.99656,3.278095 1.85425,2.152306 2.78139,5.446954 2.78142,9.883955 -3e-5,0.198685 -3e-5,0.463582 0,0.79469 -3e-5,0.29802 -0.0166,0.579473 -0.0497,0.844357 H -526.209 c 0.19866,2.682088 0.9768,4.718478 2.3344,6.109178 1.35759,1.390712 3.47676,2.086065 6.35752,2.086061 1.62247,4e-6 2.98007,-0.132444 4.07278,-0.397345 1.12579,-0.298004 1.97015,-0.579457 2.53308,-0.844358 l 0.64568,3.874113 c -0.56292,0.298009 -1.55629,0.612574 -2.98008,0.943694 -1.39073,0.331121 -2.98011,0.496681 -4.76814,0.496682 -2.25164,-1e-6 -4.20525,-0.331121 -5.86084,-0.993363 -1.6225,-0.695352 -2.96354,-1.639045 -4.02312,-2.831082 -1.05959,-1.192031 -1.85428,-2.599292 -2.38407,-4.22179 -0.49668,-1.655595 -0.74502,-3.460201 -0.74502,-5.413824 m 17.73152,-2.533074 c 0.0331,-2.086043 -0.4967,-3.791314 -1.58938,-5.115816 -1.0596,-1.357573 -2.53309,-2.03637 -4.42046,-2.036392 -1.0596,2.2e-5 -2.0033,0.21525 -2.83108,0.645685 -0.79471,0.397366 -1.4735,0.927159 -2.0364,1.58938 -0.56291,0.662261 -1.00992,1.423838 -1.34104,2.284733 -0.29801,0.860931 -0.49669,1.7384 -0.59601,2.63241 h 12.81437"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
<path
inkscape:connector-curvature="0"
id="path5554"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1;filter:url(#filter5630)"
d="m -492.11181,64.748737 c 0.39733,2.6e-5 0.84435,0.03314 1.34104,0.09934 0.52978,0.03314 1.04302,0.09936 1.53971,0.198672 0.49667,0.06625 0.94368,0.149031 1.34104,0.248341 0.43044,0.06625 0.745,0.132474 0.9437,0.198673 l -0.79469,4.023117 c -0.36425,-0.132427 -0.97683,-0.281431 -1.83772,-0.447013 -0.82782,-0.198651 -1.90396,-0.297987 -3.22843,-0.298009 -0.86093,2.2e-5 -1.72184,0.09936 -2.58274,0.298009 -0.82781,0.165582 -1.37416,0.281474 -1.63905,0.347676 v 21.704966 h -4.61914 v -24.73472 c 1.0927,-0.39732 2.45029,-0.761553 4.07279,-1.092699 1.62248,-0.364207 3.44364,-0.546323 5.46349,-0.546349"
transform="matrix(0,-0.95410843,1.0480989,0,375.75386,335.47542)" />
</g>
<g
id="g2994"
style="display:inline"
transform="translate(375.75386,255.47823)">
<rect
style="display:inline;fill:none;fill-opacity:1;stroke:#f3f3f3;stroke-width:14.74640846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4170"
width="689.47974"
height="201.01898"
x="30.260132"
y="431.85269"
inkscape:export-filename="/home/flo/Documents/projects/linuxtage/gltgit/glt12/grafiken/shirts/linuxtage2012-hinten_10jahre_v2.png"
inkscape:export-xdpi="80.963211"
inkscape:export-ydpi="80.963211" />
<path
sodipodi:nodetypes="ccccccc"
d="M 153.28335,578.93876 H 122.49792 V 466.03364 h -13.89538 v 134.24459 h 44.68081 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4843"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccc"
d="M 183.09093,600.27823 V 466.03364 h -14.13495 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4845"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="m 215.86221,600.27823 v -110.5772 h 1.67703 l 25.2752,110.5772 h 23.11902 V 466.03364 h -14.13495 v 110.57719 h -1.67703 L 225.44523,466.03364 h -23.59818 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4847"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccsssccsscc"
d="m 298.42773,466.03364 h -14.01516 v 90.98369 c 0,31.81516 9.10389,45.00685 29.70735,45.00685 20.84303,0 29.82713,-13.19169 29.82713,-45.00685 v -90.98369 h -14.01516 v 90.98369 c 0,16.87755 -5.03109,23.2794 -15.81197,23.2794 -10.6611,0 -15.69219,-6.20786 -15.69219,-23.2794 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4849"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="m 355.74989,466.03364 23.11902,67.70427 -23.11902,66.54032 h 15.69218 l 16.17133,-50.24473 16.05155,50.24473 h 15.69219 l -22.75966,-66.54032 22.75966,-67.70427 h -15.69219 l -16.05155,51.2147 -16.17133,-51.2147 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4851"
inkscape:connector-curvature="0" />
<path
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
d="m 434.06421,466.03167 -7.375,21.9375 h 17.84375 v 112.3125 h 13.875 v -112.3125 h 20.84375 v -21.9375 z"
id="path4853"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
sodipodi:nodetypes="cccccccccccccc"
d="m 497.75256,600.27823 4.07278,-26.77132 h 28.86883 l 4.55193,26.77132 h 14.13494 L 529.85565,466.03364 h -26.47307 l -19.76497,134.24459 z m 20.96284,-114.26311 9.34344,66.34632 h -23.35859 l 9.7028,-66.34632 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4855"
inkscape:connector-curvature="0" />
<path
d="m 590.59713,544.28755 h 13.34345 v 35.42719 c -0.11979,0 -7.06748,1.35797 -11.73919,1.35797 -15.33281,0 -19.04624,-13.96767 -19.04624,-48.11078 0,-35.11307 4.55193,-47.72279 19.40559,-47.72279 9.94238,0 25.38098,0.0342 25.38098,0.0342 l -0.0283,-19.33797 c 0,0 -15.76972,-0.0356 -27.38911,-0.0356 -23.47837,0 -31.86353,20.50347 -31.86353,67.06223 0,44.23084 7.66644,67.45024 32.34268,67.45024 9.46321,0 26.83243,-0.24407 26.83243,-0.24407 l 0.20101,-76.79701 h -27.23881"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4857"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccsssccsssccc" />
<path
sodipodi:nodetypes="ccccccccccccc"
d="M 684.99002,600.27823 V 579.32676 H 648.335 v -35.50111 h 29.46776 V 523.45617 H 648.335 v -36.47106 h 36.65502 v -20.95147 h -50.5504 v 134.24459 z"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:121.95269012px;font-family:TitilliumMaps29L;-inkscape-font-specification:'TitilliumMaps29L Ultra-Bold';fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-width:8.91283321;stroke-miterlimit:4;stroke-opacity:1"
id="path4859"
inkscape:connector-curvature="0" />
<g
id="text4861"
style="font-style:normal;font-weight:normal;font-size:39.40029526px;line-height:125%;font-family:'Bitstream Vera Sans';display:inline;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
transform="matrix(0,-0.95410843,1.0480989,0,0,0)">
<path
inkscape:connector-curvature="0"
id="path2996"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -609.9432,74.185678 h 4.8178 v 16.092469 c -0.39737,0.132449 -0.97683,0.281453 -1.73838,0.447013 -0.72849,0.165561 -1.58941,0.331121 -2.58274,0.496681 -0.96028,0.165561 -2.01986,0.298009 -3.17876,0.397345 -1.15894,0.132448 -2.33442,0.198672 -3.52644,0.198673 -2.41719,-10e-7 -4.61915,-0.397345 -6.60586,-1.192035 -1.98673,-0.794688 -3.692,-1.95361 -5.11581,-3.476768 -1.42383,-1.52315 -2.53308,-3.39398 -3.32776,-5.612497 -0.76159,-2.218497 -1.14237,-4.768124 -1.14237,-7.648889 0,-2.880731 0.43045,-5.430358 1.29137,-7.64889 0.89402,-2.251594 2.08605,-4.13898 3.5761,-5.662165 1.49004,-1.523123 3.22842,-2.682045 5.21516,-3.476768 2.01982,-0.794655 4.1721,-1.191999 6.45685,-1.192034 1.55625,3.5e-5 2.9304,0.09937 4.12245,0.298008 1.22513,0.198707 2.26816,0.430492 3.12909,0.695354 0.86089,0.26493 1.55624,0.529827 2.08607,0.79469 0.56287,0.264929 0.94366,0.463602 1.14236,0.596017 l -1.53971,4.023117 c -0.96028,-0.6291 -2.23509,-1.142336 -3.82444,-1.539711 -1.58941,-0.430426 -3.2119,-0.645655 -4.86748,-0.645686 -1.75496,3.1e-5 -3.36089,0.314596 -4.81781,0.943694 -1.42383,0.629159 -2.64897,1.53974 -3.67544,2.731747 -0.99337,1.192061 -1.7715,2.64899 -2.3344,4.370794 -0.56291,1.688737 -0.84436,3.592679 -0.84436,5.711833 0,2.052964 0.23178,3.923794 0.69536,5.612497 0.49667,1.688725 1.22513,3.145655 2.18539,4.370794 0.99336,1.19204 2.20194,2.119178 3.62578,2.781414 1.45691,0.662245 3.16218,0.993366 5.11581,0.993362 1.39069,4e-6 2.56617,-0.06622 3.52644,-0.198672 0.99334,-0.165557 1.70525,-0.314561 2.13573,-0.447013 V 74.185678" />
<path
inkscape:connector-curvature="0"
id="path2998"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -588.14976,64.748737 c 0.39733,2.6e-5 0.84434,0.03314 1.34104,0.09934 0.52977,0.03314 1.04301,0.09936 1.53971,0.198672 0.49666,0.06625 0.94367,0.149031 1.34104,0.248341 0.43043,0.06625 0.745,0.132474 0.94369,0.198673 l -0.79469,4.023117 c -0.36425,-0.132427 -0.97682,-0.281431 -1.83772,-0.447013 -0.82782,-0.198651 -1.90396,-0.297987 -3.22843,-0.298009 -0.86092,2.2e-5 -1.72184,0.09936 -2.58274,0.298009 -0.82781,0.165582 -1.37416,0.281474 -1.63905,0.347676 v 21.704966 h -4.61913 v -24.73472 c 1.09269,-0.39732 2.45029,-0.761553 4.07278,-1.092699 1.62249,-0.364207 3.44365,-0.546323 5.4635,-0.546349" />
<path
inkscape:connector-curvature="0"
id="path3000"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -569.54285,87.794742 c 1.09269,3e-6 2.05294,-0.01655 2.88075,-0.04967 0.8609,-0.06622 1.57281,-0.165556 2.13573,-0.298008 v -7.698558 c -0.33114,-0.165549 -0.87748,-0.297997 -1.63904,-0.397345 -0.72849,-0.132436 -1.62251,-0.19866 -2.68208,-0.198672 -0.69537,1.2e-5 -1.44039,0.04968 -2.23507,0.149004 -0.76159,0.09935 -1.4735,0.314576 -2.13573,0.645686 -0.62913,0.298019 -1.15893,0.728476 -1.58938,1.291371 -0.43046,0.529802 -0.64569,1.241711 -0.64568,2.135728 -10e-6,1.65561 0.52978,2.814532 1.58938,3.476768 1.05957,0.629133 2.49995,0.943698 4.32112,0.943695 M -569.94019,64.6494 c 1.85426,2.6e-5 3.41053,0.248366 4.6688,0.745021 1.29135,0.463595 2.31783,1.142391 3.07942,2.036393 0.79467,0.860937 1.35758,1.903966 1.68872,3.129091 0.3311,1.192054 0.49666,2.516536 0.49668,3.973449 v 16.142137 c -0.39737,0.06622 -0.96027,0.165561 -1.68871,0.298009 -0.69538,0.09934 -1.49007,0.198672 -2.38407,0.298009 -0.89405,0.09934 -1.87085,0.182116 -2.93042,0.24834 -1.02649,0.09934 -2.05296,0.149004 -3.07943,0.149004 -1.45694,0 -2.79798,-0.149004 -4.02311,-0.447013 -1.22516,-0.298008 -2.28474,-0.761577 -3.17876,-1.390707 -0.89403,-0.662239 -1.58939,-1.523152 -2.08606,-2.582742 -0.49669,-1.059581 -0.74503,-2.334395 -0.74502,-3.824444 -10e-6,-1.423811 0.28145,-2.648956 0.84435,-3.675441 0.59602,-1.026462 1.39071,-1.854263 2.38407,-2.483406 0.99336,-0.629114 2.15228,-1.092683 3.47677,-1.390707 1.32447,-0.297993 2.71518,-0.446997 4.17212,-0.447013 0.46356,1.6e-5 0.94368,0.03313 1.44038,0.09934 0.49666,0.03313 0.96023,0.09935 1.3907,0.198673 0.46356,0.06624 0.8609,0.132464 1.19204,0.198672 0.3311,0.06624 0.56289,0.115908 0.69535,0.149005 v -1.291371 c -10e-6,-0.761561 -0.0828,-1.506582 -0.24834,-2.235065 -0.16558,-0.761559 -0.46358,-1.4238 -0.89402,-1.986725 -0.43048,-0.595996 -1.02649,-1.059565 -1.78806,-1.390707 -0.72848,-0.364211 -1.68872,-0.546327 -2.88075,-0.546349 -1.52316,2.2e-5 -2.8642,0.115914 -4.02311,0.347676 -1.12582,0.198695 -1.97018,0.413923 -2.53308,0.645686 l -0.54635,-3.824445 c 0.59602,-0.264871 1.58938,-0.513211 2.98009,-0.745022 1.3907,-0.26487 2.8973,-0.397318 4.5198,-0.397344" />
<path
inkscape:connector-curvature="0"
id="path3002"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -535.05377,68.771854 c -0.69537,0.761599 -1.62251,1.837741 -2.78141,3.228427 -1.12583,1.390725 -2.35098,2.930435 -3.67544,4.619135 -1.29139,1.688729 -2.59931,3.460223 -3.92379,5.314488 -1.29138,1.854284 -2.43374,3.625778 -3.4271,5.314488 h 14.20509 v 3.874113 h -19.71825 v -3.079423 c 0.79469,-1.456927 1.7715,-3.062861 2.93042,-4.817807 1.15892,-1.75493 2.36751,-3.493312 3.62577,-5.215152 1.29137,-1.754925 2.53307,-3.393971 3.72511,-4.917143 1.22514,-1.556248 2.28472,-2.864174 3.17876,-3.923781 h -12.7647 v -3.874113 h 18.62554 v 3.476768" />
<path
inkscape:connector-curvature="0"
id="path3004"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -531.02678,78.258464 c 0,-2.284718 0.33112,-4.271441 0.99336,-5.960174 0.66224,-1.721807 1.53971,-3.145625 2.63242,-4.271458 1.09269,-1.125786 2.35094,-1.970143 3.77477,-2.533073 1.42381,-0.56288 2.88074,-0.844332 4.3708,-0.844358 3.47675,2.6e-5 6.14227,1.092723 7.99656,3.278095 1.85425,2.152306 2.78139,5.446954 2.78142,9.883955 -3e-5,0.198685 -3e-5,0.463582 0,0.79469 -3e-5,0.29802 -0.0166,0.579473 -0.0497,0.844357 H -526.209 c 0.19866,2.682088 0.9768,4.718478 2.3344,6.109178 1.35759,1.390712 3.47676,2.086065 6.35752,2.086061 1.62247,4e-6 2.98007,-0.132444 4.07278,-0.397345 1.12579,-0.298004 1.97015,-0.579457 2.53308,-0.844358 l 0.64568,3.874113 c -0.56292,0.298009 -1.55629,0.612574 -2.98008,0.943694 -1.39073,0.331121 -2.98011,0.496681 -4.76814,0.496682 -2.25164,-1e-6 -4.20525,-0.331121 -5.86084,-0.993363 -1.6225,-0.695352 -2.96354,-1.639045 -4.02312,-2.831082 -1.05959,-1.192031 -1.85428,-2.599292 -2.38407,-4.22179 -0.49668,-1.655595 -0.74502,-3.460201 -0.74502,-5.413824 m 17.73152,-2.533074 c 0.0331,-2.086043 -0.4967,-3.791314 -1.58938,-5.115816 -1.0596,-1.357573 -2.53309,-2.03637 -4.42046,-2.036392 -1.0596,2.2e-5 -2.0033,0.21525 -2.83108,0.645685 -0.79471,0.397366 -1.4735,0.927159 -2.0364,1.58938 -0.56291,0.662261 -1.00992,1.423838 -1.34104,2.284733 -0.29801,0.860931 -0.49669,1.7384 -0.59601,2.63241 h 12.81437" />
<path
inkscape:connector-curvature="0"
id="path3006"
style="font-variant:normal;font-stretch:normal;font-size:49.66811371px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f3f3f3;fill-opacity:1;stroke:#f3f3f3;stroke-opacity:1"
d="m -492.11181,64.748737 c 0.39733,2.6e-5 0.84435,0.03314 1.34104,0.09934 0.52978,0.03314 1.04302,0.09936 1.53971,0.198672 0.49667,0.06625 0.94368,0.149031 1.34104,0.248341 0.43044,0.06625 0.745,0.132474 0.9437,0.198673 l -0.79469,4.023117 c -0.36425,-0.132427 -0.97683,-0.281431 -1.83772,-0.447013 -0.82782,-0.198651 -1.90396,-0.297987 -3.22843,-0.298009 -0.86093,2.2e-5 -1.72184,0.09936 -2.58274,0.298009 -0.82781,0.165582 -1.37416,0.281474 -1.63905,0.347676 v 21.704966 h -4.61914 v -24.73472 c 1.0927,-0.39732 2.45029,-0.761553 4.07279,-1.092699 1.62248,-0.364207 3.44364,-0.546323 5.46349,-0.546349" />
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 62 KiB

File diff suppressed because it is too large Load diff

145
god2024/__init__.py Normal file
View file

@ -0,0 +1,145 @@
#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://import.c3voc.de/schedule/god2024.xml?showall=yes'
titlemap = {
}
def introFrames(p):
givenFrame = 0
nr = p['$id'];
# 1 Sekunden nix
frames = 1*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" % 0), # nix
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
# 1 Sekunde Text Fadein
frames = 1*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
# 5 Sekunden Text
frames = 5*fps
for i in range(0, frames):
givenFrame += 1
yield (
('bg', 'attr', '{http://www.w3.org/1999/xlink}href', "given-frames/frame%04d.png" % (givenFrame)),
('layer1', 'style', 'opacity', "%.4f" %1),
# ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
)
def outroFrames(p):
xml = etree.parse('god2024/artwork/outro.svg').getroot()
frames = int(5*fps)
for i in range(0, frames):
yield ()
def pauseFrames(p):
# 1 sekunden fade in
frames = 1*fps
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
)
# 1 sekunde sehen
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % 1),
)
# 1 sekunde fadeout
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
)
# 1 sekunde bild
for i in range(0, frames):
yield (
('text1', 'style', 'opacity', "%.4f" % 0),
)
def debug():
render(
'intro.svg',
'../intro.ts',
introFrames,
{
'$id': 65,
'$title': 'OWASP Juice Shop 10th anniversary: Is it still fresh?'.upper(),
'$subtitle': '',
'$personnames': 'Jannik Hollenbach'.upper(),
#'only_render_frame': 353
'only_rerender_frames_after': 225
}
)
# render(
# 'pause.svg',
# '../pause.ts',
# pauseFrames
# )
def tasks(queue, args, id_list, skip_list):
if not 'outro' in skip_list:
# place a task for the outro into the queue
queue.put(Rendertask(
infile = 'outro.svg',
outfile = 'outro.ts',
sequence = outroFrames
))
if not 'pause' in skip_list:
# place the pause-sequence into the queue
queue.put(Rendertask(
infile = 'pause.svg',
outfile = 'pause.ts',
sequence = pauseFrames
))
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl, titlemap):
# skip events which will not be recorded
if event['room'] not in ('Da Capo',) or event['track'] == 'Nomnom':
print("skipping room %s (%s [%s])" % (event['room'], event['title'], event['id']))
continue
# when id_list is not empty, only render events which are in id_list
if id_list and int(event['id']) not in id_list:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
# generate a task description and put them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id']) + ".ts",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'].upper(),
'$subtitle': event['subtitle'],
'$personnames': event['personnames'].upper(),
}
))

101
god2024/artwork/intro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.9 MiB

131
god2024/artwork/outro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.4 MiB

78
god2024/artwork/pause.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.9 MiB

View file

@ -1,15 +1,13 @@
[default]
[meta]
schedule = https://projects.alpaka.space/media/jhber19-schedule.xml
template = intro-alpha.mov
alpha = true
prores = true
fontfile = true
inout = n
inout_type = n
[title]
in = 175
out = 260
fontfamily =
fontfile = SourceSansPro-Bold.otf
fontsize = 90
fontcolor = #ffffff
@ -19,7 +17,6 @@ y = 450
[speaker]
in = 175
out = 260
fontfamily =
fontfile = SourceSansPro-Regular.otf
fontsize = 36
fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 900
[text]
in = 200
out = 250
fontfamily =
fontfile = SourceSansPro-Regular.otf
fontsize = 45
fontcolor = #c68100
x = (w-text_w)/2
y = 927
text = ''
; text =

View file

@ -1,37 +1,35 @@
[default]
[meta]
schedule = https://releasing.c3voc.de/releases/jhjue2020/schedule-jhjue20.xml
; intro_template.ts was derived from a png which was derived from jhjue-20-intro.svg
; ffmpeg -loop 1 -i jh20-jue/jh20-jue-intro.png -ar 48000 -ac 2 -f s16le -i /dev/zero -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -intra:0 -maxrate:0 90M -c:a mp2 -b:a 384k -t 5 jh20-jue/jh20-jue_intro_template.ts
template = jh20-jue_intro_template.ts
alpha = false
prores = false
; enable using a font file
fontfile = true
; in and out time format: t for seconds, n for frame number
inout = n
; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg
;; Some font settings can have defaults, which can be overridden in the
;; 'title', 'speaker' and 'text' sections below.
[default]
;; default font
fontfile = ebisu.ttf
;; default font color
fontcolor = #ffffff
;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg
[title]
; inframe for title
in = 20
; outframe for totle
; outframe for title
out = 225
; title font (either font family or file, see default setting above)
fontfamily =
fontfile = ebisu.ttf
; title font size
fontsize = 70
; title color
fontcolor = #ffffff
; title position from upper left corner
x = 600
y = 865
[speaker]
in = 40
out = 225
fontfamily =
fontfile = ebisu.ttf
fontsize = 40
fontcolor = #eeeeee
x = 600
@ -41,13 +39,10 @@ y = 950
[text]
in = 3
out = 4
fontfamily =
fontfile = ebisu.ttf
fontsize = 45
fontcolor = #ffffff
x = 640
y = 1000
text = ''
; text =
; build intros via

View file

@ -1,15 +1,13 @@
[default]
[meta]
schedule = https://pretalx.c3voc.de/jugend-hackt-rhein-neckar-2021/schedule/export/schedule.xml
template = jh21-rn-template.ts
alpha = false
prores = false
fontfile = true
inout = t
inout_type = t
[title]
in = 1
out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 85
fontcolor = #ffffff
@ -19,7 +17,6 @@ y = 877
[speaker]
in = 2
out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 45
fontcolor = #ffffff
@ -29,11 +26,10 @@ y = 954
[text]
in = 3
out = 6.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 45
fontcolor = #ffffff
x = 1920
y = 1080
text = ''
; text =

View file

@ -1,39 +1,52 @@
[default]
[meta]
schedule = https://pretalx.c3voc.de/jhhh23/schedule/export/schedule.xml
;; path to background video
template = intro-background.ts
;; whether background video uses transparency (needs to be .mov)
alpha = false
;; whether background video is prores 4444
prores = false
fontfile = true
inout = t
;; in and out time format: t for seconds, n for frame number
inout_type = t
;; fade-in duration (seconds), leave out or set to zero to disable
;fade_duration = 0.5
;; Some font settings can have defaults, which can be overridden in the
;; 'title', 'speaker' and 'text' sections below.
[default]
;; default font
fontfile = SourceSansPro-Semibold.ttf
;; default font color
fontcolor = #ffffff
;; fields for title and speaker names are empty in the template.ts, so we'll render them in via ffmpeg
;; parameters are:
;; - in: start frame/ time
;; - out: end frame/ time
;; - fontfile: font file
;; - fontcolor: font color
;; - fontsize: font size (pixel)
;; - x: horizontal position (top left corner)
;; - y: vertical position (top left corner)
[title]
in = 1
out = 9.5
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 67
fontcolor = #ffffff
x = 400
y = 870
[speaker]
in = 2
out = 9
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 50
fontcolor = #ffffff
x = 400
y = 950
;; optional extra text, comment out "text" field to disable
[text]
in = 0
out = 0
fontfamily =
fontfile = SourceSansPro-Semibold.ttf
fontsize = 0
fontcolor = #ffffff
x = 0
y = 0
text = ''
;text = some additional text

BIN
jugendhackt/source.xcf Normal file

Binary file not shown.

View file

@ -11,8 +11,6 @@ import sys
import os
import re
from xml.sax.saxutils import escape as xmlescape
# Parse arguments
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant to use with apple Motion Files',
@ -57,6 +55,20 @@ parser.add_argument('--num-audio-streams', dest='naudio', type=int, default=1, h
number of audio-streams to generate. defaults to 1
''')
parser.add_argument('--no-cleanup', action='store_true', help='''
keep temp-dir for debugging purposes
''')
parser.add_argument('--snapshot-sec', type=int, default=3, help='''
number of seconds into the final clip when to take a snapshot (for inspection purposes or as thumbnail)
''')
parser.add_argument('--setting-path', default='hd1080p.compressorsetting', help='''
filename in the script-dir (where this python script resides),
the work-dir (where the .motn-file resides) or absolute path to
a .compressorsetting file
''')
args = parser.parse_args()
@ -101,9 +113,22 @@ def describe_event(event):
def event_print(event, message):
print("{} {}".format(describe_event(event), message))
def find_settingpath():
artwork_dir = os.path.dirname(args.motn)
setting_path = os.path.join(artwork_dir, args.setting_path)
if os.path.exists(setting_path):
return setting_path
setting_path = os.path.join(os.path.dirname(__file__), args.setting_path)
if os.path.exists(setting_path):
return setting_path
return args.setting_path
tempdir = tempfile.TemporaryDirectory()
print('working in ' + tempdir.name)
settingpath = find_settingpath()
def fmt_command(command, **kwargs):
@ -128,6 +153,13 @@ def run_output(command, **kwargs):
os.system(f'{cmd} >{t.name} 2>&1')
return t.read().decode('utf-8')
def xmlescape(xml):
xml = xml.replace("&", "&amp;")
xml = xml.replace("<", "&lt;")
xml = xml.replace(">", "&gt;")
xml = xml.replace("\"", "&quot;")
xml = xml.replace("'", "&apos;")
return xml
def enqueue_job(event):
event_id = str(event['id'])
@ -144,10 +176,11 @@ def enqueue_job(event):
fp.write(xmlstr)
compressor_info = run_output(
'/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath hd1080p.compressorsetting -locationpath {locationpath}',
'/Applications/Compressor.app/Contents/MacOS/Compressor -batchname {batchname} -jobpath {jobpath} -settingpath {settingpath} -locationpath {locationpath}',
batchname=describe_event(event),
jobpath=work_doc,
locationpath=intermediate_clip)
locationpath=intermediate_clip,
settingpath=settingpath)
match = re.search(r"<jobID ([A-Z0-9\-]+) ?\/>", compressor_info)
if not match:
@ -202,6 +235,7 @@ def finalize_job(job_id, event):
intermediate_clip = os.path.join(tempdir.name, event_id + '.mov')
final_clip = os.path.join(os.path.dirname(args.motn), event_id + '.ts')
copy_clip = os.path.join(os.path.dirname(args.motn), event_id + '.mov')
snapshot_file = os.path.join(os.path.dirname(args.motn), event_id + '.png')
shutil.copy(intermediate_clip, copy_clip)
@ -211,6 +245,11 @@ def finalize_job(job_id, event):
vcodec=args.vcodec,
acodec=args.acodec)
run('ffmpeg -y -hide_banner -loglevel error -i {input} -ss {snapshot_sec} -frames:v 1 -vf scale="iw*sar:ih" -f image2 -y -c png {output}',
input=intermediate_clip,
output=snapshot_file,
snapshot_sec=str(args.snapshot_sec))
event_print(event, "finalized intro to " + final_clip)
@ -250,5 +289,9 @@ while len(active_jobs) > 0:
finalize_job(job_id, event)
print('all done, cleaning up ' + tempdir.name)
tempdir.cleanup()
if args.no_cleanup:
print('all done, *NOT* cleaning up, *TEMPFILES REMAIN* in ' + tempdir.name)
else:
print('all done, cleaning up ' + tempdir.name)
tempdir.cleanup()

View file

@ -1,329 +1,5 @@
#!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab
import os
import sys
import subprocess
import renderlib
import argparse
import shlex
from PIL import ImageFont
from configparser import ConfigParser
import json
# Parse arguments
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
def headline(str):
print("##################################################")
print(str)
print("##################################################")
print()
def error(str):
headline(str)
parser.print_help()
sys.exit(1)
cparser = ConfigParser()
cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini'))
template = cparser['default']['template']
alpha = cparser['default']['alpha']
prores = cparser['default']['prores']
fade_duration = 0.5
title_in = float(cparser['title']['in'])
title_out = float(cparser['title']['out'])
title_duration = title_out - title_in
title_font = cparser['title']['font']
title_fontsize = int(cparser['title']['fontsize'])
title_fontcolor = cparser['title']['fontcolor']
title_x = int(cparser['title']['x'])
title_y = int(cparser['title']['y'])
speaker_in = float(cparser['speaker']['in'])
speaker_out = float(cparser['speaker']['out'])
speaker_duration = speaker_out - speaker_in
speaker_font = cparser['speaker']['font']
speaker_fontsize = int(cparser['speaker']['fontsize'])
speaker_fontcolor = cparser['speaker']['fontcolor']
speaker_x = int(cparser['speaker']['x'])
speaker_y = int(cparser['speaker']['y'])
text_in = float(cparser['text']['in'])
text_out = float(cparser['text']['out'])
text_duration = text_out - text_in
text_font = cparser['text']['font']
text_fontsize = int(cparser['text']['fontsize'])
text_fontcolor = cparser['text']['fontcolor']
text_x = int(cparser['text']['x'])
text_y = int(cparser['text']['y'])
text_text = cparser['text']['text']
font_t = os.path.join(os.path.dirname(args.project), title_font)
font_s = os.path.join(os.path.dirname(args.project), speaker_font)
font_tt = os.path.join(os.path.dirname(args.project), text_font)
fileformat = os.path.splitext(template)[1]
infile = os.path.join(os.path.dirname(args.project), template)
schedule = cparser['default']['schedule']
if not (os.path.exists(os.path.join(args.project, template))):
error("Template file {} in Project Path is missing".format(template))
for ffile in (title_font, speaker_font, text_font):
if not (os.path.exists(os.path.join(args.project, ffile))):
error("Font file {} in Project Path is missing".format(ffile))
if not (os.path.exists(os.path.join(args.project, 'config.ini'))):
error("config.ini file in Project Path is missing")
if alpha == 'true' and not fileformat == '.mov':
error("Alpha can only be rendered with .mov source files")
if not args.project:
error("The Project Path is a required argument")
if not args.debug and not schedule:
error("Either specify --debug or supply a schedule in config.ini")
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko']
events = [{
'id': 'debug',
'title': 'wallet.fail',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
else:
events = list(schedulelib.events(schedule))
def describe_event(event):
return "#{}: {}".format(event['id'], event['title'])
def event_print(event, message):
print("{} {}".format(describe_event(event), message))
def fmt_command(command, **kwargs):
args = {}
for key, value in kwargs.items():
args[key] = shlex.quote(value)
command = command.format(**args)
return shlex.split(command)
def run(command, **kwargs):
return subprocess.check_call(
fmt_command(command, **kwargs),
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL)
def fit_text(string: str, frame_width):
split_line = [x.strip() for x in string.split()]
lines = ""
w = 0
line_num = 0
line = ""
for word in split_line:
w, _ = translation_font.getsize(" ".join([line, word]))
print("{}, {}".format(w, line))
if w > (frame_width):
print("too wide, breaking")
lines += line.strip() + "\n"
line = ""
line += word + " "
lines += line.strip()
return lines
def fit_title(string: str):
global translation_font
translation_font = ImageFont.truetype(font_t, size=title_fontsize-10, encoding="unic")
title = fit_text(string, 1080)
return title
def fit_speaker(string: str):
global translation_font
translation_font = ImageFont.truetype(font_s, size=speaker_fontsize-10, encoding="unic")
speaker = fit_text(string, 1080)
return speaker
def enqueue_job(event):
event_id = str(event['id'])
if event_id in args.skip:
event_print(event, "skipping " + str(event['id']))
return
if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force:
event_print(event, "file exist, skipping " + str(event['id']))
return
event_title = str(event['title'])
event_personnames = str(event['personnames'])
event_title = event_title.replace('"', '')
event_title = event_title.replace('\'', '')
event_personnames = event_personnames.replace('"', '')
t = fit_title(event_title)
s = fit_speaker(event_personnames)
print(s)
if args.debug:
print('Title: ', t)
print('Speaker: ', s)
outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts')
videofilter = "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format(
fontfile=font_t,
fontsize=title_fontsize,
fontcolor=title_fontcolor,
x=title_x,
y=title_y,
text=t)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format(
fade_in_start_time=title_in,
fade_in_end_time=title_in + fade_duration,
fade_out_start_time=title_in + fade_duration + title_duration,
fade_out_end_time=title_in + fade_duration + title_duration + fade_duration,
fade_duration=fade_duration
)
videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text='{text}':".format(
fontfile=font_s,
fontsize=speaker_fontsize,
fontcolor=speaker_fontcolor,
x=speaker_x,
y=speaker_y,
text=s)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))',".format(
fade_in_start_time=speaker_in,
fade_in_end_time=speaker_in + fade_duration,
fade_out_start_time=speaker_in + fade_duration + speaker_duration,
fade_out_end_time=speaker_in + fade_duration + speaker_duration + fade_duration,
fade_duration=fade_duration
)
videofilter += "drawtext=fontfile={fontfile}:fontsize={fontsize}:fontcolor={fontcolor}:x={x}:y={y}:text={text}:".format(
fontfile=font_tt,
fontsize=text_fontsize,
fontcolor=text_fontcolor,
x=text_x,
y=text_y,
text=text_text)
videofilter += "alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))'".format(
fade_in_start_time=text_in,
fade_in_end_time=text_in + fade_duration,
fade_out_start_time=text_in + fade_duration + text_duration,
fade_out_end_time=text_in + fade_duration + text_duration + fade_duration,
fade_duration=fade_duration
)
if fileformat == '.mov':
if alpha == 'true':
if prores == 'true':
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile)
else:
cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -pix_fmt:v yuv420p -qscale:v 2 -qmin:v 2 -qmax:v 7 -keyint_min 0 -bf 0 -g 0 -maxrate:0 90M -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile)
if args.debug:
print(cmd)
run(cmd)
return event_id
if args.ids:
if len(args.ids) == 1:
print("enqueuing {} job".format(len(args.ids)))
else:
print("enqueuing {} jobs".format(len(args.ids)))
else:
if len(events) == 1:
print("enqueuing {} job".format(len(events)))
else:
print("enqueuing {} jobs".format(len(events)))
for event in events:
if args.ids and event['id'] not in args.ids:
continue
if args.rooms and event['room'] not in args.rooms:
print("skipping room %s (%s)" % (event['room'], event['title']))
continue
event_print(event, "enqueued as " + str(event['id']))
job_id = enqueue_job(event)
if not job_id:
event_print(event, "job was not enqueued successfully, skipping postprocessing")
continue
print('all done')
print("ERROR: The functionality of this script was added to 'make-ffmpeg.py'!")
print("Specify meta.fade_duration = 0.5 in the config.ini for the same effect.")

View file

@ -1,153 +1,165 @@
#!/usr/bin/env python3
# vim: tabstop=4 shiftwidth=4 expandtab
"""See jugendhackt/config.ini for some config file documentation."""
import os
import sys
import subprocess
import schedulelib
import argparse
import shlex
from PIL import ImageFont
from configparser import ConfigParser
import json
import platform
import ssl
from configparser import ConfigParser
from pathlib import PurePath
import platform
from PIL import ImageFont
import schedulelib
ssl._create_default_https_context = ssl._create_unverified_context
# Parse arguments
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
FRAME_WIDTH = 1920
def headline(str):
print("##################################################")
print(str)
print("##################################################")
print()
class TextConfig:
inpoint: float
outpoint: float
x: int
y: int
fontfile_path: str
fontsize: int
fontcolor: str
bordercolor: str = None # border is added, if a color is set
def uses_fontfile(self):
return self.fontfile_path is not None
def parse(self, cparser_sect, default_fontfile, default_fontcolor):
self.inpoint = cparser_sect.getfloat('in')
self.outpoint = cparser_sect.getfloat('out')
self.x = cparser_sect.getint('x')
self.y = cparser_sect.getint('y')
self.fontcolor = cparser_sect.get('fontcolor', default_fontcolor)
fontfile = cparser_sect.get('fontfile', default_fontfile)
self.fontfile_path = str(PurePath(args.project, fontfile).as_posix())
if not os.path.exists(self.fontfile_path):
error("Font file {} in Project Path is missing".format(self.fontfile_path))
self.fontsize = cparser_sect.getint('fontsize')
self.bordercolor = cparser_sect.get('bordercolor', None)
def fit_text(self, text: str) -> list[str]:
if not text:
return [""]
font = ImageFont.truetype(
self.fontfile_path, size=self.fontsize, encoding="unic")
return fit_text(text, (FRAME_WIDTH-self.x-100), font)
def get_ffmpeg_filter(self, inout_type: str, fade_time: float, text: list[str]):
if not text:
return ""
text_duration = self.outpoint - self.inpoint
filter_str = ""
for idx, line in enumerate(text):
filter_str += "drawtext=enable='between({},{},{})':x={}:y={}".format(
inout_type, self.inpoint, self.outpoint, self.x, self.y + (idx*self.fontsize))
filter_str += ":fontfile='{}':fontsize={}:fontcolor={}:text={}".format(
self.fontfile_path, self.fontsize, self.fontcolor, ffmpeg_escape_str(line))
if self.bordercolor is not None:
filter_str += ":borderw={}:bordercolor={}".format(
self.fontsize / 30, self.bordercolor)
if fade_time > 0:
filter_str += ":alpha='if(lt(t,{fade_in_start_time}),0,if(lt(t,{fade_in_end_time}),(t-{fade_in_start_time})/{fade_duration},if(lt(t,{fade_out_start_time}),1,if(lt(t,{fade_out_end_time}),({fade_duration}-(t-{fade_out_start_time}))/{fade_duration},0))))'".format(
fade_in_start_time=self.inpoint,
fade_in_end_time=self.inpoint + fade_time,
fade_out_start_time=self.inpoint + fade_time + text_duration,
fade_out_end_time=self.inpoint + fade_time + text_duration + fade_time,
fade_duration=fade_time)
filter_str += ","
return filter_str[:-1]
def error(str):
headline(str)
parser.print_help()
sys.exit(1)
class Config:
schedule: str
template_file: str # video background
alpha: bool = False
prores: bool = False
inout_type: str = "t" # in and out time format: t for seconds, n for frame number
fade_duration: float = 0 # fade duration in seconds, 0 to disable
fileext: str
title: TextConfig
speaker: TextConfig
text: TextConfig
extra_text: str = "" # additional text
cparser = ConfigParser()
cparser.read(os.path.join(os.path.dirname(args.project), 'config.ini'))
template = cparser['default']['template']
alpha = cparser['default']['alpha']
prores = cparser['default']['prores']
fontfile = cparser['default']['fontfile'] # use a font file instead of a font family
inout = cparser['default']['inout'] # in and out time format: t for seconds, n for frame number
title_in = cparser['title']['in']
title_out = cparser['title']['out']
title_fontfamily = cparser['title']['fontfamily']
title_fontfile = cparser['title']['fontfile']
title_fontsize = cparser['title']['fontsize']
title_fontcolor = cparser['title']['fontcolor']
title_x = cparser['title']['x']
title_y = cparser['title']['y']
speaker_in = cparser['speaker']['in']
speaker_out = cparser['speaker']['out']
speaker_fontfamily = cparser['speaker']['fontfamily']
speaker_fontfile = cparser['speaker']['fontfile']
speaker_fontsize = cparser['speaker']['fontsize']
speaker_fontcolor = cparser['speaker']['fontcolor']
speaker_x = cparser['speaker']['x']
speaker_y = cparser['speaker']['y']
text_in = cparser['text']['in']
text_out = cparser['text']['out']
text_fontfamily = cparser['text']['fontfamily']
text_fontfile = cparser['text']['fontfile']
text_fontsize = cparser['text']['fontsize']
text_fontcolor = cparser['text']['fontcolor']
text_x = cparser['text']['x']
text_y = cparser['text']['y']
text_text = cparser['text']['text']
font_t = os.path.join(os.path.dirname(args.project), title_fontfile)
font_s = os.path.join(os.path.dirname(args.project), speaker_fontfile)
font_tt = os.path.join(os.path.dirname(args.project), text_fontfile)
fileformat = os.path.splitext(template)[1]
infile = os.path.join(os.path.dirname(args.project), template)
schedule = cparser['default']['schedule']
if not (os.path.exists(os.path.join(args.project, template))):
error("Template file {} in Project Path is missing".format(template))
for ffile in (title_fontfile, speaker_fontfile, text_fontfile):
if not (os.path.exists(os.path.join(args.project, ffile))):
error("Font file {} in Project Path is missing".format(ffile))
if not (os.path.exists(os.path.join(args.project, 'config.ini'))):
def parse_config(filename) -> Config:
if not os.path.exists(filename):
error("config.ini file in Project Path is missing")
if alpha == 'true' and not fileformat == '.mov':
conf = Config()
cparser = ConfigParser()
cparser.read(filename)
meta = cparser['meta']
conf.schedule = meta.get('schedule')
infile = PurePath(args.project, meta.get('template'))
conf.template_file = str(infile)
conf.alpha = meta.getboolean('alpha', conf.alpha)
conf.prores = meta.getboolean('prores', conf.prores)
conf.inout_type = meta.get('inout_type', conf.inout_type)
conf.fade_duration = meta.getfloat('fade_duration', conf.fade_duration)
defaults = cparser['default']
default_fontfile = defaults.get('fontfile', None)
default_fontcolor = defaults.get('fontcolor', "#ffffff")
conf.title = TextConfig()
conf.title.parse(cparser['title'], default_fontfile, default_fontcolor)
conf.speaker = TextConfig()
conf.speaker.parse(cparser['speaker'], default_fontfile, default_fontcolor)
conf.text = TextConfig()
conf.text.parse(cparser['text'], default_fontfile, default_fontcolor)
conf.extra_text = cparser['text'].get('text', '')
conf.fileext = infile.suffix
if not os.path.exists(conf.template_file):
error("Template file {} in Project Path is missing".format(conf.template_file))
if conf.alpha and conf.fileext != '.mov':
error("Alpha can only be rendered with .mov source files")
if not args.project:
if not args.project:
error("The Project Path is a required argument")
if not args.debug and not schedule:
if not args.debug and not conf.schedule:
error("Either specify --debug or supply a schedule in config.ini")
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',]
events = [{
'id': 'debug',
'title': 'wallet.fail',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
return conf
else:
events = list(schedulelib.events(schedule))
def error(err_str):
print("##################################################")
print(err_str)
print("##################################################")
print()
parser.print_help()
sys.exit(1)
def describe_event(event):
@ -158,151 +170,172 @@ def event_print(event, message):
print("{} {}".format(describe_event(event), message))
def fmt_command(command, **kwargs):
args = {}
for key, value in kwargs.items():
args[key] = shlex.quote(value)
def fit_text(string: str, max_width: int, font: ImageFont) -> list[str]:
"""Break text into array of strings which fit certain a width (in pixels) for the specified font."""
command = command.format(**args)
return shlex.split(command)
def run(command, **kwargs):
return subprocess.check_call(
fmt_command(command, **kwargs),
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL)
def fit_text(string: str, frame_width):
split_line = [x.strip() for x in string.split()]
lines = ""
lines = []
w = 0
line_num = 0
line = ""
line = []
for word in split_line:
left, top, right, bottom = translation_font.getbbox(" ".join([line, word]))
width, height = right - left, bottom - top
if width > (frame_width - (2 * 6)):
lines += line.strip() + "\n"
line = ""
new_line = line + [word.rstrip(':')]
w = font.getlength(" ".join(new_line))
if w > max_width:
lines.append(' '.join(line))
line = []
line += word + " "
line.append(word.rstrip(':'))
if word.endswith(':'):
lines.append(' '.join(line))
line = []
if line:
lines.append(' '.join(line))
lines += line.strip()
return lines
def fit_title(string: str, fontsize: int, x_offset: int):
global translation_font
translation_font = ImageFont.truetype(
font_t, size=fontsize, encoding="unic")
title = fit_text(string, (1920-x_offset-100))
def ffmpeg_escape_str(text: str) -> str:
# Escape according to https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping
# and don't put the string in quotes afterwards!
text = text.replace(",", r"\,")
text = text.replace(':', r"\\:")
text = text.replace("'", r"\\\'")
return title
return text
def fit_speaker(string: str, fontsize: int, x_offset: int):
global translation_font
translation_font = ImageFont.truetype(
font_s, size=fontsize, encoding="unic")
speaker = fit_text(string, (1920-x_offset-100))
return speaker
def enqueue_job(event):
def enqueue_job(conf: Config, event):
event_id = str(event['id'])
outfile = str(PurePath(args.project, event_id + '.ts'))
outfile_mov = str(PurePath(args.project, event_id + '.mov'))
if event_id in args.skip:
event_print(event, "skipping " + str(event['id']))
return
if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force:
if (os.path.exists(outfile) or os.path.exists(outfile_mov)) and not args.force:
event_print(event, "file exist, skipping " + str(event['id']))
return
event_title = str(event['title'])
event_personnames = str(event['personnames'])
event_title = event_title.replace('"', '\\"')
event_title = event_title.replace('\'', '')
event_personnames = event_personnames.replace('"', '\\"')
t = fit_title(event_title, int(title_fontsize), int(title_x))
t = t.replace(':', "\:") # the ffmpeg command needs colons to be escaped
s = fit_speaker(event_personnames, int(speaker_fontsize), int(speaker_x))
title = conf.title.fit_text(event_title)
speakers = conf.speaker.fit_text(event_personnames)
extra_text = conf.text.fit_text(conf.extra_text)
if args.debug:
print('Title: ', t)
print('Speaker: ', s)
outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts')
print('Title: ', title)
print('Speaker: ', speakers)
if platform.system() == 'Windows':
ffmpeg_path = './ffmpeg.exe'
font_t_win = "/".join(font_t.split("\\"))
font_s_win = "/".join(font_s.split("\\"))
font_tt_win = "/".join(font_tt.split("\\"))
else:
ffmpeg_path = 'ffmpeg'
if fontfile == 'true':
if platform.system() == 'Windows':
videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
title_in, title_out, font_t_win, title_fontsize, title_fontcolor, title_x, title_y, t, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, font_s_win, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, font_tt_win, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
else:
videofilter = "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
title_in, title_out, font_t, title_fontsize, title_fontcolor, title_x, title_y, t, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, font_s, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':fontfile='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, font_tt, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
else:
videofilter = "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
title_in, title_out, title_fontfamily, title_fontsize, title_fontcolor, title_x, title_y, t, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(
speaker_in, speaker_out, speaker_fontfamily, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s, inout)
videofilter += "drawtext=enable='between({8},{0},{1})':font='{2}':fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}'".format(
text_in, text_out, text_fontfamily, text_fontsize, text_fontcolor, text_x, text_y, text_text, inout)
videofilter = conf.title.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, title) + ","
videofilter += conf.speaker.get_ffmpeg_filter(conf.inout_type,
conf.fade_duration, speakers) + ","
videofilter += conf.text.get_ffmpeg_filter(conf.inout_type, conf.fade_duration, extra_text)
if fileformat == '.mov':
if alpha == 'true':
if prores == 'true':
cmd = '{3} -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile, ffmpeg_path)
cmd = [ffmpeg_path, '-y', '-i', conf.template_file, '-vf', videofilter]
if conf.fileext == '.mov' and conf.alpha:
if conf.prores:
cmd += ['-vcodec', 'prores_ks', '-pix_fmt', 'yuva444p10le', '-profile:v',
'4444', '-shortest', '-movflags', 'faststart', '-f', 'mov', outfile_mov]
else:
cmd = '{3} -y -i "{0}" -vf "{1}" -shortest -c:v qtrle -movflags faststart -f mov "{2}"'.format(
infile, videofilter, outfile, ffmpeg_path)
cmd += ['-shortest', '-c:v', 'qtrle', '-movflags',
'faststart', '-f', 'mov', outfile_mov]
else:
cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile, ffmpeg_path)
else:
cmd = '{3} -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(
infile, videofilter, outfile, ffmpeg_path)
cmd += ['-map', '0:0', '-c:v', 'mpeg2video', '-q:v', '2', '-aspect', '16:9', '-map',
'0:1', '-c:a', 'mp2', '-b:a', '384k', '-shortest', '-f', 'mpegts', outfile]
if args.debug:
print(cmd)
run(cmd)
subprocess.check_call(cmd,
stderr=subprocess.STDOUT,
stdout=subprocess.DEVNULL
)
return event_id
if args.ids:
if __name__ == "__main__":
# Parse arguments
parser = argparse.ArgumentParser(
description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg',
usage="./make-ffmpeg.py yourproject/",
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('project', action="store", metavar='Project folder', type=str, help='''
Path to your project folder
''')
parser.add_argument('--debug', action="store_true", default=False, help='''
Run script in debug mode and render with placeholder texts,
not parsing or accessing a schedule.
This argument must not be used together with --id
Usage: ./make-ffmpeg.py yourproject/ --debug
''')
parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help='''
Only render the given ID(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337
''')
parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help='''
Only render the given room(s) from your projects schedule.
This argument must not be used together with --debug
Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal"
''')
parser.add_argument('--skip', nargs='+', action="store", type=str, help='''
Skip ID(s) not needed to be rendered.
Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337
''')
parser.add_argument('--force', action="store_true", default=False, help='''
Force render if file exists.
''')
args = parser.parse_args()
if (args.skip is None):
args.skip = []
config = parse_config(PurePath(args.project, 'config.ini'))
if args.debug:
persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko',]
events = [{
'id': 'debug',
'title': 'wallet.fail and the longest talk title to test if the template is big enough',
'subtitle': 'Hacking the most popular cryptocurrency hardware wallets',
'persons': persons,
'personnames': ', '.join(persons),
'room': 'Borg',
}]
else:
events = list(schedulelib.events(config.schedule))
if args.ids:
if len(args.ids) == 1:
print("enqueuing {} job".format(len(args.ids)))
else:
print("enqueuing {} jobs".format(len(args.ids)))
else:
else:
if len(events) == 1:
print("enqueuing {} job".format(len(events)))
else:
print("enqueuing {} jobs".format(len(events)))
for event in events:
for event in events:
if args.ids and event['id'] not in args.ids:
continue
@ -312,10 +345,9 @@ for event in events:
event_print(event, "enqueued as " + str(event['id']))
job_id = enqueue_job(event)
job_id = enqueue_job(config, event)
if not job_id:
event_print(event, "job was not enqueued successfully, skipping postprocessing")
continue
print('all done')
print('all done')

View file

@ -99,9 +99,7 @@ renderlib.args = args
# sys.exit(1)
cwd = os.getcwd()
def render(infile, outfile, sequence, parameters={}, workdir=os.path.join(cwd, projectname, 'artwork')):
def render(infile, outfile, sequence, parameters={}, workdir=os.path.join(projectname, 'artwork')):
task = renderlib.Rendertask(infile=infile, outfile=outfile,
sequence=sequence, parameters=parameters, workdir=workdir)
return renderlib.rendertask(task)

View file

@ -1,16 +1,14 @@
[default]
[meta]
#schedule = https://talks.mrmcd.net/2019/schedule/export/schedule.xml
schedule = file:///home/thorti/git/c3voc/intro-outro-generator/mrmcd2019/schedule.xml
template = mrmcd2019.mov
alpha = false
prores = false
fontfile = true
inout = n
inout_type = n
[title]
in = 50
out = 225
fontfamily =
fontfile = Jura-Bold.ttf
fontsize = 80
fontcolor = #47acda
@ -20,7 +18,6 @@ y = 540
[speaker]
in = 75
out = 225
fontfamily =
fontfile = Jura-Regular.ttf
fontsize = 50
fontcolor = #094762
@ -30,10 +27,9 @@ y = 950
[text]
in = 242
out = 324
fontfamily =
fontfile = Jura-Regular.ttf
fontsize = 45
fontcolor = #c68100
x = (w-text_w)/2
y = 927
text = ''
; text =

148
osmodevcon24/__init__.py Normal file
View file

@ -0,0 +1,148 @@
#!/usr/bin/python3
from renderlib import *
from schedulelib import *
from easing import *
# URL to Schedule-XML
scheduleUrl = 'https://pretalx.sysmocom.de/osmodevcon2024/schedule/export/schedule.xml'
def introFrames(args):
#fade in title
frames = 3*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
)
# fade in subtitle and names
frames = 1*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', 1),
('subtitle', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
('personnames', 'style', 'opacity', easeInQuad(i, 0, 1, frames)),
)
#show whole image for 2 seconds
frames = 2*fps
for i in range(0, frames):
yield(
('title', 'style', 'opacity', 1),
('personnames', 'style', 'opacity', 1),
('subtitle', 'style', 'opacity', 1),
)
def backgroundFrames(parameters):
frames = 5*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', 1),
)
def outroFrames(args):
frames = 2*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', 1),
('sublogo', 'style', 'opacity', 1),
('cclogo', 'style', 'opacity', 1),
)
# fade out
frames = 3*fps
for i in range(0, frames):
yield(
('logo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
('sublogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
('cclogo', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -1, frames)),
)
def pauseFrames(args):
#fade in pause
frames = 4*fps
for i in range(0, frames):
yield(
('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 0.2, 1, frames)),
)
# fade out
frames = 4*fps
for i in range(0, frames):
yield(
('pause', 'style', 'opacity', "%.4f" % easeInCubic(i, 1, -0.8, frames)),
)
def debug():
render('intro.svg',
'../intro.ts',
introFrames,
{
'$id': 7776,
'$title': 'Configuring + running GPRS/EDGE data services with OsmoPCU, OsmoSGSN and OpenGGSN',
'$subtitle': 'With some subtitle!',
'$personnames': 'Alexander Chemeris + Harald Welte'
}
)
render('outro.svg',
'../outro.ts',
outroFrames
)
render(
'background.svg',
'../background.ts',
backgroundFrames
)
render('pause.svg',
'../pause.ts',
pauseFrames
)
def tasks(queue, args, idlist, skiplist):
# iterate over all events extracted from the schedule xml-export
for event in events(scheduleUrl):
if not (idlist==[]):
if 000000 in idlist:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
if int(event['id']) not in idlist:
print("skipping id (%s [%s])" % (event['title'], event['id']))
continue
# generate a task description and put them into the queue
queue.put(Rendertask(
infile = 'intro.svg',
outfile = str(event['id'])+".ts",
sequence = introFrames,
parameters = {
'$id': event['id'],
'$title': event['title'],
'$subtitle': event['subtitle'],
'$personnames': event['personnames']
}
))
# place a task for the outro into the queue
if not "out" in skiplist:
queue.put(Rendertask(
infile = 'outro.svg',
outfile = 'outro.ts',
sequence = outroFrames
))
# place the pause-sequence into the queue
if not "pause" in skiplist:
queue.put(Rendertask(
infile = 'pause.svg',
outfile = 'pause.ts',
sequence = pauseFrames
))
# place the background-sequence into the queue
if not "bg" in skiplist:
queue.put(Rendertask(
infile = 'background.svg',
outfile = 'background.ts',
sequence = backgroundFrames
))

View file

@ -0,0 +1,946 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="508mm"
height="285.74997mm"
viewBox="0 0 1800 1012.4999"
id="svg2"
version="1.1"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="background.svg"
inkscape:export-filename="background.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs4">
<linearGradient
id="linearGradient3374-5-7-7-0">
<stop
id="stop3376-8-6-4-2"
style="stop-color:#729fcf;stop-opacity:1"
offset="0" />
<stop
id="stop3378-6-7-4-9"
style="stop-color:#729fcf;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3362-8-6-0-9">
<stop
id="stop3364-4-5-78-9"
style="stop-color:#3465a4;stop-opacity:1"
offset="0" />
<stop
id="stop3366-7-6-6-4"
style="stop-color:#3465a4;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient7101-4-9-4-1">
<stop
id="stop7103-0-4-31-0"
style="stop-color:#babdb6;stop-opacity:1"
offset="0" />
<stop
id="stop7105-6-8-4-3"
style="stop-color:#ffffff;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient6979-9-2-2-8">
<stop
id="stop6981-9-9-0-8"
style="stop-color:#888a85;stop-opacity:1"
offset="0" />
<stop
id="stop6983-0-3-6-6"
style="stop-color:#555753;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<linearGradient
id="linearGradient7131-6-1-5-7">
<stop
id="stop7133-4-5-2-6"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop7135-6-9-5-0"
style="stop-color:#d3d7cf;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<linearGradient
id="linearGradient7153-0-1-9-75">
<stop
id="stop7155-8-7-3-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop7157-5-7-7-7"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5-3"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7-2"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<linearGradient
x1="24.837126"
y1="44.528019"
x2="21.036427"
y2="21.041553"
id="linearGradient3991-3-88-5-3-4"
xlink:href="#linearGradient7101-4-9-4-1"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="39.06765"
y1="28.5"
x2="39.421204"
y2="10.934953"
id="linearGradient3993-1-9-7-2-4"
xlink:href="#linearGradient6979-9-2-2-8"
gradientUnits="userSpaceOnUse" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-3"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-7"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-4"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-7"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-4"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-0"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
r="4.5250292"
fy="8.0709476"
fx="10.28125"
cy="8.0709476"
cx="10.28125"
gradientTransform="matrix(4.9499444,0,0,4.9510321,-11.38809,35.312197)"
gradientUnits="userSpaceOnUse"
id="radialGradient3637-3"
xlink:href="#linearGradient3374-5-7-7-0"
inkscape:collect="always" />
<radialGradient
r="4.5250292"
fy="9.8424416"
fx="10.28125"
cy="9.8424416"
cx="10.28125"
gradientTransform="matrix(23.169932,0,0,7.6402677,-198.71238,8.843597)"
gradientUnits="userSpaceOnUse"
id="radialGradient3639-5"
xlink:href="#linearGradient3362-8-6-0-9"
inkscape:collect="always" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-9"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-2"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-2-2-0-9-7"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-7-7-6-1-5"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-0-0-3-2-9"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-6-60-6-9-8"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
<radialGradient
cx="10.28125"
cy="7.8249326"
r="4.5250292"
fx="10.28125"
fy="7.8249326"
id="radialGradient3995-7-4-0-9"
xlink:href="#linearGradient3374-5-7-7-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2651111,0,0,2.2923498,16.215361,52.593597)" />
<radialGradient
cx="10.28125"
cy="9.8424416"
r="4.5250292"
fx="10.28125"
fy="9.8424416"
id="radialGradient3997-3-3-4-1"
xlink:href="#linearGradient3362-8-6-0-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(15.1803,0,0,5.0647752,-116.56897,28.614297)" />
<radialGradient
cx="8.9057236"
cy="1.7286602"
r="1.9952321"
fx="8.9057236"
fy="1.7286602"
id="radialGradient3999-1-4-6-2"
xlink:href="#linearGradient7131-6-1-5-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7375073,0,0,0.7201806,2.4345312,0.6617371)" />
<radialGradient
cx="8.3046875"
cy="1.1256332"
r="2.0507698"
fx="8.3046875"
fy="1.1256332"
id="radialGradient4001-9-6-9-9"
xlink:href="#linearGradient7153-0-1-9-75"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.2943491,0,0,5.2881329,-7.02204,58.291497)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497476"
inkscape:cx="-330.66755"
inkscape:cy="386.73989"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
units="mm"
inkscape:window-width="956"
inkscape:window-height="1041"
inkscape:window-x="960"
inkscape:window-y="37"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
inkscape:measure-start="63.3968,-113.628"
inkscape:measure-end="34.3452,-129.3"
inkscape:snap-page="true"
inkscape:pagecheckerboard="true"
gridtolerance="5"
objecttolerance="10"
guidetolerance="10"
inkscape:lockguides="false">
<inkscape:grid
type="xygrid"
id="grid20483"
originx="0"
originy="-0.00012144696" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Background"
transform="translate(0,-67.5)"
style="display:inline">
<rect
style="opacity:1;fill:#1a1a1a;fill-opacity:1;stroke:none;stroke-width:1.00031257;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect20497"
width="1800"
height="1012.4999"
x="0"
y="67.5"
inkscape:label="bg color" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Text"
style="display:inline"
transform="translate(0,-67.5)">
<flowRoot
xml:space="preserve"
id="title"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(0.9375,0,0,0.9375,596.82417,403.33401)"
inkscape:label="title"
inkscape:transform-center-x="4.0178571"
inkscape:transform-center-y="-24.107143"><flowRegion
id="flowRegion20435"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"><rect
id="rect20437"
width="604.28571"
height="189.99998"
x="61.42857"
y="67.714287"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1" /></flowRegion><flowPara
id="flowPara24792"
style="font-size:192px">Pause</flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot25337"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion25339"><rect
id="rect25341"
width="14.285714"
height="90"
x="902.85712"
y="472.85715" /></flowRegion><flowPara
id="flowPara25343" /></flowRoot> <flowRoot
inkscape:transform-center-y="-24.107143"
inkscape:transform-center-x="4.0178571"
inkscape:label="title"
transform="matrix(0.9375,0,0,0.9375,604.85988,449.04839)"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="pause"
xml:space="preserve"><flowRegion
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"
id="flowRegion25395"><rect
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;font-family:'Trebuchet MS';-inkscape-font-specification:'Trebuchet MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#555555;fill-opacity:1"
y="67.714287"
x="61.42857"
height="189.99998"
width="604.28571"
id="rect25393" /></flowRegion><flowPara
style="font-size:192px"
id="flowPara25397">Pause</flowPara></flowRoot> <g
id="g441"
transform="matrix(0.84639363,0,0,0.84639363,37.064912,38.785126)">
<text
id="text3760-7"
y="243.6349"
x="277.56836"
style="font-style:normal;font-weight:normal;font-size:81.56085968px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.03902125"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:130.49736023px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';fill:#a00000;fill-opacity:1;stroke-width:2.03902125"
y="243.6349"
x="277.56836"
id="tspan3762-0"
sodipodi:role="line">o</tspan></text>
<path
inkscape:connector-curvature="0"
id="path3959-9-26-3"
d="m 221.54901,178.00783 -8.8372,15.20901 -4.0423,-6.95739 1.1988,54.79873 c 3.8707,-2.70354 5.2943,1.46986 5.3524,-0.6173 l 1.4178,-50.79232 c 3.0015,-1.56596 6.002,-2.21826 8.8729,-2.21826 5.22,0 7.2929,1.82538 7.4234,6.52328 l 0.5775,46.96519 c 3.6204,-1.02991 6.8905,0.79083 6.9055,-0.35065 l 0.6452,-48.85683 c 2.8709,-1.82699 7.1579,-4.15375 10.1592,-4.15375 5.22,0 6.2837,2.61406 6.3918,8.87693 l 0.7847,45.42003 c 2.4547,-0.3861 5.9417,1.23813 5.9736,-0.39459 l 0.9002,-45.80627 c 0.2308,-11.74253 1.3452,-17.49097 -11.7046,-17.49097 -5.3503,0 -11.6124,1.56672 -16.0494,4.04615 -2.4795,-2.60972 -6.1326,-4.04615 -11.7441,-4.04615 -1.5299,0 -2.9125,-0.0694 -4.2254,-0.15573 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:64px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Andale Mono';writing-mode:lr-tb;display:inline;fill:#a00000;fill-opacity:1;stroke:#a00000;stroke-width:2.03902125;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#e19c9c;stroke-width:10.19510746;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
id="path3981-0-4-1"
d="m 212.71081,193.21678 -9.1897,-15.80983 -9.1896,-15.80995 h 18.3793 18.3792 l -9.1896,15.80995 z" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.24006462;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3983-4-9-2"
d="M 261.34211,239.81102 V 183.28218" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.19510746;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3985-4-0-9"
d="M 236.92411,239.78722 V 199.37075" />
<path
inkscape:connector-curvature="0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:9.52051163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3951-0-4-91-2"
d="m 212.70941,240.14133 -0.022,-23.96402" />
<g
id="text5473"
style="font-style:normal;font-weight:normal;font-size:16.93333244px;line-height:125%;font-family:Sans;letter-spacing:0.03704167px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
transform="matrix(7.7065378,0,0,7.7065378,-370.09593,-1045.102)"
aria-label="Os">
<path
inkscape:connector-curvature="0"
id="path5483"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.03704167px;fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
d="m 60.829899,161.23206 c 0,4.8768 0.8636,6.1468 3.048,6.1468 2.2352,0 3.2004,-1.54094 3.2004,-6.1976 0,-4.572 -0.8128,-5.96054 -3.014133,-5.96054 -2.1844,0 -3.234267,1.50707 -3.234267,6.01134 z m 1.540934,0.33866 c 0,-3.6576 0.474133,-4.94453 1.659466,-4.94453 1.2192,0 1.557867,1.20227 1.557867,4.58893 0,3.4544 -0.423334,4.75827 -1.642533,4.75827 -1.202267,0 -1.5748,-1.25307 -1.5748,-4.40267 z" />
<path
inkscape:connector-curvature="0"
id="path5485"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.03704167px;fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
d="m 70.886976,158.59046 c -1.896533,0 -2.760133,0.8128 -2.760133,1.99813 0,0.5588 0.2032,1.1684 0.9652,1.79493 l 1.642533,1.40547 c 0.508,0.4572 0.677333,0.8636 0.677333,1.3208 0,0.67733 -0.508,1.04987 -1.371599,1.04987 -0.6604,0 -1.202267,-0.13547 -1.693334,-0.42334 -0.186266,0.3048 -0.237066,0.59267 -0.237066,0.79587 0,0.59267 0.8636,0.8636 2.065866,0.8636 1.7272,0 2.794,-0.84667 2.794,-2.35373 0,-0.84667 -0.270933,-1.40547 -0.999067,-2.11667 l -1.5748,-1.27 c -0.575733,-0.47413 -0.677333,-0.74507 -0.677333,-1.04987 0,-0.52493 0.541867,-0.8128 1.337733,-0.8128 0.643467,0 1.151467,0.13547 1.659467,0.44027 0.186267,-0.2032 0.3048,-0.47413 0.3048,-0.69427 0,-0.33866 -0.389467,-0.94826 -2.1336,-0.94826 z" />
</g>
</g>
<g
aria-label="DevCon"
transform="matrix(6.5227642,0,0,6.5227642,-489.80588,-735.6063)"
style="font-style:normal;font-weight:bold;font-size:16.93333244px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text5477">
<path
d="m 91.538186,154.66105 c -0.372533,0 -0.474133,0.11853 -0.474133,0.33867 v 11.51466 h 2.1844 c 2.286,0 3.234267,-1.99813 3.234267,-6.51933 0,-4.35187 -1.0668,-5.334 -3.318934,-5.334 z m 2.760134,5.1308 c 0,4.30107 -0.474134,4.9276 -0.999067,4.9276 h -0.338667 v -8.3312 h 0.321734 c 0.6096,0 1.016,0.37253 1.016,3.4036 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5488"
inkscape:connector-curvature="0" />
<path
d="m 100.15963,157.87838 c -1.591729,0 -2.980262,0.7112 -2.980262,4.80907 0,3.21733 1.083733,3.99627 2.624666,3.99627 1.320796,0 2.404536,-0.37254 2.404536,-1.04987 0,-0.38947 -0.0508,-0.93133 -0.1524,-1.27 -0.59267,0.28787 -1.18534,0.47413 -1.79494,0.47413 -0.812796,0 -1.049863,-0.47413 -1.100663,-1.54093 0.829734,-0.0169 2.099733,-0.0847 2.929463,-0.254 0.16934,-0.6604 0.23707,-1.59173 0.23707,-2.40453 0,-1.96427 -0.8128,-2.76014 -2.16747,-2.76014 z m -0.253996,1.64254 c 0.423336,0 0.575736,0.16933 0.575736,1.25306 0,0.27094 -0.0169,0.67734 -0.0847,0.88054 -0.254,0.11853 -0.778933,0.1524 -1.253066,0.1524 0.0508,-1.54094 0.237067,-2.286 0.762,-2.286 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5490"
inkscape:connector-curvature="0" />
<path
d="m 104.26941,165.75238 c 0.1016,0.47414 0.3048,0.84667 0.79586,0.84667 0.3556,0 0.98214,-0.0169 1.3716,-0.0847 l 1.69334,-8.46666 c -1.94734,0 -1.94734,0 -1.99814,0.37253 l -0.23706,2.06587 c -0.16934,1.45626 -0.32174,4.04706 -0.32174,4.04706 h -0.0339 c 0,0 -0.1524,-2.5908 -0.33867,-4.04706 l -0.3048,-2.4384 c -2.16747,0 -2.1844,0 -2.06587,0.5588 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5492"
inkscape:connector-curvature="0" />
<path
d="m 112.00926,154.40705 c -1.524,0 -3.38666,1.016 -3.38666,6.57013 0,4.74134 0.9144,5.7912 2.82786,5.7912 1.28694,0 2.06587,-0.4572 2.06587,-1.25306 0,-0.4064 -0.11853,-0.82974 -0.254,-1.1176 -0.32173,0.16933 -0.79587,0.254 -1.3208,0.254 -0.94827,0 -1.3208,-0.88054 -1.3208,-3.82694 0,-3.69146 0.88053,-4.572 1.84573,-4.572 0.37254,0 0.67734,0.13547 0.88054,0.28787 0.13546,-0.28787 0.27093,-0.67733 0.27093,-1.13453 0,-0.508 -0.16933,-0.99907 -1.60867,-0.99907 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5494"
inkscape:connector-curvature="0" />
<path
d="m 113.8288,162.26412 c 0,3.79306 0.84667,4.4196 2.67547,4.4196 1.8288,0 2.77707,-1.2192 2.77707,-4.48734 0,-3.42053 -0.82974,-4.318 -2.6416,-4.318 -1.79494,0 -2.81094,1.3208 -2.81094,4.38574 z m 2.0828,-0.0169 c 0,-2.40453 0.28787,-2.7432 0.6604,-2.7432 0.49107,0 0.62654,0.3048 0.62654,2.7432 0,2.60774 -0.32174,2.86174 -0.64347,2.86174 -0.42333,0 -0.64347,-0.22014 -0.64347,-2.86174 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5496"
inkscape:connector-curvature="0" />
<path
d="m 120.08673,166.51438 c 1.86266,0 1.89653,0 1.89653,-0.33866 v -6.46854 c 0.18627,-0.13546 0.42333,-0.2032 0.64347,-0.2032 0.47413,0 0.5588,0.27094 0.5588,1.15147 v 5.85893 c 1.91346,0 1.96426,0 1.96426,-0.33866 v -6.11294 c 0,-1.69333 -0.72813,-2.1844 -2.4384,-2.1844 -0.84666,0 -2.09973,0.3048 -2.62466,0.5588 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:0.26458332"
id="path5498"
inkscape:connector-curvature="0" />
</g>
<g
aria-label="2019"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:135.91038513px;line-height:101.93280029px;font-family:Galette;-inkscape-font-specification:'Galette Bold';letter-spacing:0px;word-spacing:0px;fill:#3566a5;fill-opacity:1;stroke:none;stroke-width:4.07731199px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text1093"
transform="matrix(0.84639363,0,0,0.84639363,-1098.677,81.683415)">
<path
d="m 1450.8965,383.02967 c 4.6209,-2.44639 13.4551,-4.07731 17.8042,-4.07731 4.8928,0 8.0188,2.58229 8.0188,7.20325 0,11.28056 -15.3579,23.51249 -26.7744,43.49132 -2.99,5.30051 -3.5337,7.20325 -3.5337,12.09602 0,0.40774 0,2.5823 0.5437,4.21323 h 44.8504 c 3.3978,0 3.5337,-3.12594 3.5337,-15.76561 0,0 -7.3392,1.49502 -18.6197,1.49502 h -10.0574 c 12.5037,-20.25065 27.5898,-31.80303 27.5898,-48.11228 0,-12.36785 -5.4364,-19.16336 -20.7943,-19.16336 -12.2319,0 -24.4639,3.39776 -24.4639,7.61098 0,2.31047 0.136,7.20325 1.9028,11.14465 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1095"
inkscape:connector-curvature="0" />
<path
d="m 1500.8287,405.7267 c 0,25.82298 4.2132,41.45267 24.0561,41.45267 19.5711,0 24.8716,-15.49378 24.8716,-46.48135 0,-23.78432 -7.2032,-36.28807 -24.5998,-36.28807 -17.1247,0 -24.3279,14.13468 -24.3279,41.31675 z m 16.5811,0.54364 c 0,-17.39652 1.2231,-28.54118 8.5623,-28.54118 6.2519,0 7.7469,8.42645 7.7469,22.96886 0,24.46387 -2.7182,32.89031 -8.2905,32.89031 -7.0674,0 -8.0187,-6.79552 -8.0187,-27.31799 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1097"
inkscape:connector-curvature="0" />
<path
d="m 1560.6823,381.53465 c 0,0 5.8442,-1.3591 12.9115,-1.63092 l -1.2232,51.78186 c -12.6396,0 -17.2606,0.81546 -17.2606,4.21322 0,3.53367 0.1359,6.65961 0.4078,10.05737 h 45.2581 c 3.3978,0 3.3978,-3.26185 3.3978,-14.81424 0,0 -4.0773,0.54365 -8.2906,0.54365 h -7.6109 l 1.6309,-66.46018 c -0.6796,-0.54364 -2.7182,-0.81546 -3.9414,-0.81546 -7.2033,0 -27.5898,4.62095 -27.5898,7.74689 0,3.66958 0.6795,6.5237 2.3104,9.37781 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1099"
inkscape:connector-curvature="0" />
<path
d="m 1622.7106,445.68436 c -3.3978,0 -6.9314,-0.67956 -9.6497,-1.49502 -0.8154,2.85412 -1.3591,7.47507 -1.3591,10.05737 0,4.48504 5.7083,5.84415 13.0474,5.84415 24.1921,0 33.434,-17.39653 33.8417,-53.27687 -0.6795,-34.79306 -4.0773,-43.62724 -23.6484,-43.62724 -16.3092,0 -25.5511,10.05737 -25.5511,33.9776 0,17.39653 7.6109,27.86163 18.4838,27.86163 7.7469,0 12.096,-2.31048 15.7656,-6.93143 -0.9514,14.95014 -5.0287,27.58981 -20.9302,27.58981 z m 9.9214,-34.65715 c -5.5723,0 -8.2905,-6.11597 -8.2905,-15.49379 0,-12.77557 4.621,-18.89154 10.8728,-18.89154 6.9315,0 8.8342,6.38779 8.8342,27.31799 v 0.81546 c -3.6696,4.75686 -7.4751,6.25188 -11.4165,6.25188 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#3566a5;fill-opacity:1;stroke-width:4.07731199px"
id="path1101"
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="title"
style="display:none">
<g
style="display:inline"
id="g3732-6"
transform="matrix(2.0475567,0,0,2.0475567,979.07911,-71.674635)">
<path
inkscape:connector-curvature="0"
d="m 60.69548,67.493897 c 0,11.5675 -9.48796,20.9448 -21.19195,20.9448 -11.703989,0 -21.191949,-9.3773 -21.191949,-20.9448 0,-11.5674 9.48796,-20.9447 21.191949,-20.9447 11.70399,0 21.19195,9.3773 21.19195,20.9447 z"
id="path3544-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;opacity:0.8;fill:url(#radialGradient3637-3);fill-opacity:1;stroke:url(#radialGradient3639-5);stroke-width:1.46151388;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(1.4615138,0,0,2.5218672,4.4272,31.547917)"
id="g3546-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:#000000;fill-opacity:1;stroke:none">
<path
inkscape:connector-curvature="0"
d="m 24,13 -8.1875,15.225744 c 11.445471,0 5.976697,0 16.34375,0 z m 0,4.96875 4,7.421875 h -7.953125 z"
id="path3548-79"
style="fill:url(#linearGradient3991-3-88-5);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3993-1-9-7);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
d="M 26.355979,42.522608 20,21.277828 13.644021,42.522609"
transform="matrix(1,0,0,0.57953638,4,2.7937247)"
id="path3550-2"
style="fill:none;stroke:#ffffff;stroke-width:1.31358945px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
inkscape:connector-curvature="0"
d="m 53.38791,67.493897 c 0,7.6681 -6.21625,13.8844 -13.88438,13.8844 -7.66813,0 -13.884379,-6.2163 -13.884379,-13.8844 0,-7.6681 6.216249,-13.8844 13.884379,-13.8844 7.66813,0 13.88438,6.2163 13.88438,13.8844 z"
id="path3552-0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:url(#radialGradient3995-7-4-0-2-2-0-9);fill-opacity:1;stroke:url(#radialGradient3997-3-3-4-7-7-6-1);stroke-width:1.46151388;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(3.2735609,0,0,3.2593101,-24.33091,59.292917)"
id="g3554-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:#000000;fill-opacity:1;stroke:none">
<path
inkscape:connector-curvature="0"
d="M 11,2.25 C 11,3.2164983 10.195512,4 9.203125,4 8.2107383,4 7.40625,3.2164983 7.40625,2.25 7.40625,1.2835017 8.2107383,0.5 9.203125,0.5 10.195512,0.5 11,1.2835017 11,2.25 Z"
transform="matrix(1.1130433,0,0,1.1428572,9.2565233,-0.07142864)"
id="path3556-3"
style="fill:url(#radialGradient3999-1-4-6-0-0-3-2);fill-opacity:1;stroke:#555753;stroke-width:0.39671427;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
d="M 20,1.5 C 20,1.7761424 19.776142,2 19.5,2 19.223858,2 19,1.7761424 19,1.5 19,1.2238576 19.223858,1 19.5,1 19.776142,1 20,1.2238576 20,1.5 Z"
transform="matrix(1.8125,0,0,1.8125,-16.465404,-0.9288198)"
id="path3558-7"
style="fill:#ffffff;fill-opacity:1;stroke:none" />
</g>
<path
inkscape:connector-curvature="0"
d="m 44.61882,67.441097 c 0,2.8124 -2.2902,5.0924 -5.1153,5.0924 -2.8251,0 -5.1153,-2.28 -5.1153,-5.0924 0,-2.8125 2.2902,-5.0924 5.1153,-5.0924 2.8251,0 5.1153,2.2799 5.1153,5.0924 z"
id="path3560-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:url(#radialGradient4001-9-6-9-6-60-6-9);stroke-width:1.46151364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:131.04367065px;line-height:125%;font-family:Sans;letter-spacing:0.28665793px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
x="1104.8673"
y="136.28465"
id="text3743-6-9"><tspan
sodipodi:role="line"
id="tspan3745-0-2"
x="1104.8673"
y="136.28465"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';letter-spacing:0.28665793px;fill:#a00000;fill-opacity:1;stroke-width:2.04755735"
dx="0 0">Os</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:81.90226746px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
x="1288.4238"
y="136.28465"
id="text3760-7-2"><tspan
sodipodi:role="line"
id="tspan3762-0-8"
x="1288.4238"
y="136.28465"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';fill:#a00000;fill-opacity:1;stroke-width:2.04755735">o</tspan></text>
<text
id="text4707-97"
y="137.59502"
x="1338.8434"
style="font-style:normal;font-weight:bold;font-size:131.04367065px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#a00000;fill-opacity:1;stroke:none;stroke-width:2.04755735"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';fill:#a00000;fill-opacity:1;stroke-width:2.04755735"
y="137.59502"
x="1338.8434"
id="tspan4705-36"
sodipodi:role="line">Con</tspan></text>
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:64px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Andale Mono';writing-mode:lr-tb;display:inline;fill:#a00000;fill-opacity:1;stroke:#a00000;stroke-width:2.04755735;stroke-opacity:1"
d="m 1232.1703,70.382814 -8.8741,15.272702 -4.0593,-6.9865 1.2039,55.028084 c 3.887,-2.71488 5.3164,1.47605 5.3748,-0.61985 l 1.4237,-51.004974 c 3.0141,-1.57252 6.0272,-2.227521 8.9101,-2.227521 5.2418,0 7.3232,1.833021 7.4545,6.550591 l 0.5798,47.161764 c 3.6356,-1.03422 6.9193,0.79411 6.9344,-0.35191 l 0.6478,-49.061364 c 2.883,-1.834611 7.188,-4.171091 10.202,-4.171091 5.2417,0 6.3099,2.625001 6.4185,8.914071 l 0.7878,45.610104 c 2.4651,-0.38781 5.9664,1.24339 5.9987,-0.39591 l 0.9038,-45.998034 c 0.2319,-11.791681 1.3508,-17.564192 -11.7533,-17.564192 -5.3728,0 -11.6612,1.57328 -16.1166,4.063111 -2.4899,-2.620651 -6.1586,-4.063111 -11.7935,-4.063111 -1.5361,0 -2.9245,-0.0721 -4.243,-0.15595 z"
id="path3959-9-26-3-1"
inkscape:connector-curvature="0" />
<path
d="m 1223.2952,85.655406 -9.2281,-15.875942 -9.2281,-15.876132 h 18.4562 18.4561 l -9.2281,15.876132 z"
id="path3981-0-4-1-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#e19c9c;stroke-width:10.23778343;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="M 1272.1299,132.44473 V 75.679295"
id="path3983-4-9-2-9"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.28292942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="M 1247.6099,132.4208 V 91.835136"
id="path3985-4-0-9-3"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:10.23778343;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
d="m 1223.2938,132.77645 -0.022,-24.06433"
id="path3951-0-4-91-2-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;stroke:#e19c9c;stroke-width:9.56036377;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<text
id="text4707-9"
y="138.64339"
x="1700.7795"
style="font-style:normal;font-weight:bold;font-size:131.04367065px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Yanone Kaffeesatz Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#3566a5;fill-opacity:1;stroke:none;stroke-width:2.04755735"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:131.04367065px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz Bold';text-align:end;text-anchor:end;fill:#3566a5;fill-opacity:1;stroke-width:2.04755735"
y="138.64339"
x="1700.7795"
id="tspan4705-3"
sodipodi:role="line">2018</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="subtitle"
style="display:none">
<g
style="display:inline"
id="g1750"
transform="matrix(19.592171,0,0,19.592171,-1582.9761,-2384.3012)">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.16364908px;line-height:100%;font-family:Galette;-inkscape-font-specification:'Galette Bold';letter-spacing:0px;word-spacing:0px;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:0.02372737px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="167.53929"
y="132.21951"
id="text1124"><tspan
sodipodi:role="line"
id="tspan1122"
x="167.53929"
y="132.21951"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px">0x2B || <tspan
style="letter-spacing:0px;fill:#a00000;fill-opacity:1"
id="tspan1454">!</tspan>0x2B</tspan><tspan
sodipodi:role="line"
x="167.53929"
y="135.49736"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px"
id="tspan1126">18-19 Oct. 2018</tspan><tspan
sodipodi:role="line"
x="167.53929"
y="138.77521"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';text-align:end;letter-spacing:0px;text-anchor:end;fill:#3465a4;fill-opacity:1;stroke-width:0.02372737px"
id="tspan1128">Berl n</tspan></text>
<g
transform="matrix(0.20459945,0,0,0.20459945,152.35276,113.27741)"
id="g27740">
<g
id="g28309">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:normal;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.98000004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.24451828;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 3820.6562,472.26172 c -40.3422,0 -73.1445,32.3975 -73.1445,72.32812 0,30.32091 18.9212,56.28015 45.6875,67.02735 l 1.8555,-5.95508 c -24.2644,-9.91834 -41.2988,-33.51066 -41.2988,-61.07227 0,-36.51604 29.8935,-66.08398 66.9003,-66.08398 37.0069,0 66.8985,29.56794 66.8985,66.08398 0,24.66524 -13.6587,46.14338 -33.918,57.50977 -2.3907,1.34129 -4.8745,2.53952 -7.4355,3.58594 l 1.8535,5.96875 c 2.9828,-1.19355 5.8704,-2.56971 8.6426,-4.125 22.1465,-12.42531 37.1035,-35.96788 37.1035,-62.93946 0,-39.93062 -32.8023,-72.32812 -73.1446,-72.32812 z m 7.5,137.99414 c -2.4618,0.2706 -4.962,0.41602 -7.5,0.41602 -2.5028,0 -4.9696,-0.14473 -7.4003,-0.40821 l -1.8633,6.05469 c 3.0363,0.3807 6.1241,0.59767 9.2636,0.59766 3.182,0 6.3161,-0.2044 9.3926,-0.59571 z"
id="path3544-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssccsssscccsscsccccc"
transform="matrix(0.04785074,0,0,0.04785074,-118.05951,92.995687)" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a00000;stroke-width:6.34386444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3811.3887,563.87891 -30.2735,97.13867 h 78.9297 l -30.1523,-97.125 c -2.8017,1.31925 -5.9315,2.05859 -9.2364,2.05859 -3.3169,0 -6.4581,-0.74396 -9.2675,-2.07226 z m 9.2675,11.66406 19.3165,61.84961 h -38.4082 z"
transform="matrix(0.04785074,0,0,0.04785074,-118.05951,92.995687)"
id="path3548-6"
inkscape:connector-curvature="0" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#a00000;stroke-width:0.3038334;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3556-1"
d="m 65.796938,119.04618 c 0,0.56924 -0.463484,1.03071 -1.035215,1.03071 -0.571734,0 -1.035215,-0.46147 -1.035215,-1.03071 0,-0.56925 0.463481,-1.03071 1.035215,-1.03071 0.571731,0 1.035215,0.46146 1.035215,1.03071 z"
inkscape:connector-curvature="0" />
</g>
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:'Yanone Kaffeesatz';-inkscape-font-specification:'Yanone Kaffeesatz';display:inline;fill:none;fill-opacity:1;stroke:#3465a4;stroke-width:0.29880485;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
id="path3552-8"
d="m 66.957088,119.05451 c 0,1.21246 -0.982899,2.19537 -2.195365,2.19537 -1.212466,0 -2.195365,-0.98291 -2.195365,-2.19537 0,-1.21246 0.982899,-2.19537 2.195365,-2.19537 1.212466,0 2.195365,0.98291 2.195365,2.19537 z"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 55 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 113 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 123 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -97,7 +97,7 @@ def renderFrame(infile, task, outfile):
converted.save(filename=outfile)
elif args.resvg:
# invoke inkscape to convert the generated svg-file into a png inside the .frames-directory
cmd = 'resvg --use-fonts-dir ~/.local/share/fonts/ --background white --width={1} --height={2} "{4}" "{3}" 2>&1 >/dev/null'.format(
cmd = 'resvg --background white --width={1} --height={2} "{4}" "{3}" 2>&1 >/dev/null'.format(
task.workdir, width, height, outfile, infile)
errorReturn = subprocess.check_output(
cmd, shell=True, universal_newlines=True, stderr=subprocess.STDOUT, cwd=task.workdir)
@ -107,15 +107,12 @@ def renderFrame(infile, task, outfile):
else:
# invoke inkscape to convert the generated svg-file into a png inside the .frames-directory
cmd = 'inkscape --export-background=white --export-background-opacity=0 --export-width={1} --export-height={2} --export-filename="{3}" "{4}"'.format(
cmd = 'inkscape --export-background=white --export-background-opacity=0 --export-width={1} --export-height={2} --export-filename="{3}" "{4}" --pipe 2>&1 >/dev/null'.format(
task.workdir, width, height, os.path.abspath(outfile), os.path.abspath(infile))
try:
errorReturn = subprocess.check_output(
cmd, shell=True, universal_newlines=True, stderr=subprocess.STDOUT, cwd=task.workdir)
except subprocess.CalledProcessError as e:
print(f"inkscape exited with error")
print(f"returncode={e.returncode}")
print(f"output={e.output}")
if errorReturn != '':
print("inkscape exited with error\n" + errorReturn)
# sys.exit(42)

View file

@ -1,5 +1,5 @@
pillow
pillow>=8.0.0
cssutils==1.0.2
lxml==4.9.1
svg.path==4.0.2
Wand==0.6.5
lxml~=5.3
svg.path~=6.0
Wand~=0.6.5

View file

@ -100,6 +100,12 @@ def events(scheduleUrl, titlemap={}):
url = event.find('url').text.strip()
else:
url = ''
if event.find('track') is not None and event.find('track').text is not None:
track = event.find('track').text
else:
track = ''
# yield a tupel with the event-id, event-title and person-names
yield {
'day': day.get('index'),
@ -109,7 +115,7 @@ def events(scheduleUrl, titlemap={}):
'persons': personnames,
'personnames': ', '.join(personnames),
'room': room.attrib['name'],
'track': event.find('track').text,
'track': track,
'url': url
}

BIN
vcfb24/Computerfont.ttf Normal file

Binary file not shown.

Binary file not shown.

37
vcfb24/config.ini Normal file
View file

@ -0,0 +1,37 @@
[meta]
schedule = http://vcfb.de/2024/schedule.xml
# ffmpeg -loop 1 -i intro.png -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -r 25 -t 10 intro.mp4
template = intro.mp4
alpha = false
prores = false
inout_type = t
fade_duration = 0.5
[title]
in = 1
out = 9.5
fontfile = Computerfont.ttf
fontsize = 100
fontcolor = #ffffff
x = 85
y = 122
[speaker]
in = 2
out = 9
fontfile = SourceSansPro-Semibold.ttf
fontsize = 65
fontcolor = #ffffff
x = 85
y = 861
[text]
in = 0
out = 0
fontfile = Computerfont.ttf
fontsize = 0
fontcolor = #ffffff
x = 0
y = 0
; text =

15584
vcfb24/intro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.1 MiB

6231
vcfb24/lower-third.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1 MiB

1668
vcfb24/outro.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 935 KiB

6626
vcfb24/pause.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1,015 KiB