Timeline: Analysis of possibly toxic input values

- protection against negative numbers seems adequate
- a possible concern are handling of very large time spans
- definitively have to guard against "poisonous" fractions
  (e.g. n / INT_MAX)
This commit is contained in:
Fischlurch 2022-11-12 17:35:47 +01:00
parent cc16953fd8
commit d3fc6fd4de
3 changed files with 237 additions and 3 deletions

View file

@ -60,6 +60,16 @@
** - scale factor and visible window line up logically
** - scale factor produces precise reproducible values
**
** ## Safety Guards
**
** Most setters require lib::time::TimeSpan or lib::time::Duration as _value arguments;_
** based on those entities internal definition, they can be assumed to be sanitised,
** within TimeValue bounds and properly oriented. Other setters taking possibly negative
** numbers are prepared to handle these (e.g. as offset). Range checks are in place to
** prevent possibly dangerous numbers from infesting the calculations.
** @note rational integral arithmetics can be insidious, since normalisation requires
** frequent multiplications, and large denominators might cause numeric overflow.
**
** ## Change listener
**
** A single change listener lambda can be installed (as of 10/2022 this is considered sufficient,
@ -379,7 +389,7 @@ namespace model {
nudgeVisiblePos (int steps)
{
FSecs dur{afterWin_-startWin_}; // navigate half window steps
setVisibleRange (TimeSpan{Time{startWin_ + dur*steps/2}
setVisibleRange (TimeSpan{Time{startWin_ + (dur*steps)/2}
, dur});
}
@ -761,6 +771,8 @@ namespace model {
* relative to the overall canvas. Implemented using a cubic parabola, which moves quick
* away from the boundaries, while hovering most of the time in the middle area.
* @return factor effectively between 0 ... 1 (inclusive)
* @warning in case of a "poisonous" input the calculation may go astray;
* yet results are limited at least...
*/
static Rat
parabolicAnchorRule (Rat posFactor)
@ -769,6 +781,7 @@ namespace model {
posFactor = (2*posFactor - 1); // -1 ... +1
posFactor = posFactor*posFactor*posFactor; // -1 ... +1 but accelerating towards boundaries
posFactor = (posFactor + 1) / 2; // 0 ... 1
posFactor = util::limited (0, posFactor, 1);
return posFactor;
}
};

View file

@ -86,6 +86,8 @@ namespace test {
verify_scroll();
verify_changeNotification();
toxic_corner_cases();
}
@ -482,6 +484,53 @@ namespace test {
CHECK (win.px_per_sec() == 400);
CHECK (wuz.px_per_sec() == 20);
}
/** @test verify safeguards when used in extreme corner cases */
void
toxic_corner_cases()
{
{
ZoomWindow win{0, TimeSpan{_t(0), FSecs(0)}};
CHECK (win.visible() == TimeSpan(_t(0), _t(23))); // uses DEFAULT_CANVAS instead of empty TimeSpan
CHECK (win.px_per_sec() == 25); // falls back on default initial zoom factor
CHECK (win.pxWidth() == 575); // allocates pixels in accordance to default
win.setOverallDuration(Duration{FSecs(50)});
win.setVisibleDuration(Duration{FSecs(0)});
CHECK (win.overallSpan() == TimeSpan(_t(0), _t(50)));
CHECK (win.visible() == TimeSpan(_t(0), _t(23))); // falls back to DEFAULT_CANVAS size
CHECK (win.pxWidth() == 575); // allocates pixels in accordance to default
win.calibrateExtension(0);
CHECK (win.px_per_sec() == 25); // stays at default zoom factor
CHECK (win.pxWidth() == 1); // retains 1px window size
CHECK (win.visible().duration() == _t(1,25)); // visible window has thus 1/25s duration
win.setOverallRange(TimeSpan(_t(10), _t(0)));
SHOW_EXPR (win.overallSpan());
SHOW_EXPR (win.visible());
SHOW_EXPR (_raw(win.visible().duration()));
SHOW_EXPR (win.px_per_sec());
SHOW_EXPR (win.pxWidth());
CHECK (TimeSpan(_t(10), _t(0)).duration() == Duration(FSecs(10))); // TimeSpan is always properly oriented by construction
Duration evilReversed = static_cast<Duration> (_t(-10));
SHOW_EXPR (evilReversed);
SHOW_EXPR (TimeSpan(_t(20), evilReversed));
}
{
ZoomWindow win{};
// SHOW_EXPR(win.overallSpan());
// SHOW_EXPR(_raw(win.visible().duration()));
// SHOW_EXPR(win.px_per_sec());
// SHOW_EXPR(win.pxWidth());
// CHECK (win.visible() == TimeSpan(_t(0), _t(23)));
// CHECK (win.px_per_sec() == 25);
// CHECK (win.pxWidth() == 575);
}
}
};

View file

@ -1379,7 +1379,7 @@
<node COLOR="#338800" CREATED="1493753249399" HGAP="64" ID="ID_1023343635" MODIFIED="1561827464564" TEXT="#1098 hand-over in UI-Thread" VSHIFT="83">
<linktarget COLOR="#a75677" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="-317;-24;" ID="Arrow_ID_274836249" SOURCE="ID_1146157818" STARTARROW="None" STARTINCLINATION="-647;-66;"/>
<linktarget COLOR="#84c6b8" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="21;233;" ID="Arrow_ID_1372135725" SOURCE="ID_995145542" STARTARROW="None" STARTINCLINATION="237;0;"/>
<linktarget COLOR="#7caaa8" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="2513;3565;" ID="Arrow_ID_1832047032" SOURCE="ID_489078622" STARTARROW="Default" STARTINCLINATION="3463;134;"/>
<linktarget COLOR="#7caaa8" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="2513;3565;" ID="Arrow_ID_1832047032" SOURCE="ID_489078622" STARTARROW="Default" STARTINCLINATION="2914;51;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1501804992301" ID="ID_1647263044" MODIFIED="1538263469665" TEXT="schedule event"/>
<node CREATED="1501804985286" ID="ID_320977714" MODIFIED="1538263469665" TEXT="GTK-Mechanismus">
@ -39533,11 +39533,170 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180004015" ID="ID_1355163433" MODIFIED="1668180133079" TEXT="extreme Grenzf&#xe4;lle abtesten">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1668212345981" ID="ID_1473341053" MODIFIED="1668212365788" TEXT="leer konstruiert &#x27f9; default-canvas">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180016155" ID="ID_506165727" MODIFIED="1668180136076" TEXT="leere Intervalle">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180071412" ID="ID_1188877277" MODIFIED="1668180136076" TEXT="falsch orientierte Intervalle">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1668262916332" ID="ID_670540657" MODIFIED="1668262927471" TEXT="weitgehend unm&#xf6;glich">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1668262928548" ID="ID_186072598" MODIFIED="1668262939564" TEXT="TimeSpan verhindert das">
<icon BUILTIN="info"/>
<node CREATED="1668263012905" ID="ID_37434622" MODIFIED="1668263018116" TEXT="genauer: es ist bereits Duration"/>
<node CREATED="1668263018992" ID="ID_774651709" MODIFIED="1668263029586" TEXT="Duration hat keinen normalen Copy-Konstruktur"/>
<node CREATED="1668263130427" ID="ID_371714481" MODIFIED="1668263147178" TEXT="Duration nimmt in jedem Ctor einen Absolutbetrag"/>
<node CREATED="1668263170236" ID="ID_1832591940" MODIFIED="1668263185566" TEXT="TimeSpan schickt alle Eingaben durch Duration-ctor"/>
<node CREATED="1668263200351" ID="ID_526293515" MODIFIED="1668263226330" TEXT="&#x27f9; sofern man TimeSpan per Value nimmt ist sogar Manipulation unm&#xf6;glich">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1668262940706" ID="ID_1639008148" MODIFIED="1668262957124" TEXT="&#x27f9; Eingangs-Checks vereinfachen"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1668262961151" ID="ID_1262854527" MODIFIED="1668270708694" TEXT="alle Eing&#xe4;nge daraufhin pr&#xfc;fen">
<icon BUILTIN="pencil"/>
<node CREATED="1668263281549" ID="ID_1653448250" MODIFIED="1668263292760" TEXT="potentiell gef&#xe4;hrlich">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263300631" ID="ID_1173749705" MODIFIED="1668265511790" TEXT="setMetric (Rat px_per_sec)">
<arrowlink COLOR="#aa6877" DESTINATION="ID_1257614207" ENDARROW="Default" ENDINCLINATION="271;-11;" ID="Arrow_ID_292335664" STARTARROW="None" STARTINCLINATION="314;29;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1668263308095" ID="ID_41228001" MODIFIED="1668263308095" TEXT="nudgeMetric (int steps)">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1668265226231" HGAP="29" ID="ID_680870152" MODIFIED="1668265531172" TEXT="(&#xe4;hnliche Problemlage)" VSHIFT="6">
<arrowlink COLOR="#be7ca2" DESTINATION="ID_1943948610" ENDARROW="Default" ENDINCLINATION="57;-54;" ID="Arrow_ID_569700266" STARTARROW="None" STARTINCLINATION="197;26;"/>
<font NAME="SansSerif" SIZE="8"/>
</node>
</node>
<node CREATED="1668263379747" ID="ID_1108084309" MODIFIED="1668265880846" TEXT="setOverallStart (TimeValue start)">
<icon BUILTIN="button_cancel"/>
<node COLOR="#435e98" CREATED="1668265476934" HGAP="22" ID="ID_1672613430" MODIFIED="1668265497115" TEXT="Offset &#x27f9; harmlos" VSHIFT="2">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1668263363873" ID="ID_1000302477" MODIFIED="1668267369598" TEXT="nudgeVisiblePos (int steps)">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668267251650" ID="ID_772154372" MODIFIED="1668267361180" TEXT="potentieller TimeValue-wrap">
<icon BUILTIN="broken-line"/>
</node>
<node COLOR="#435e98" CREATED="1668265476934" HGAP="22" ID="ID_1024656656" MODIFIED="1668265497115" TEXT="Offset &#x27f9; harmlos" VSHIFT="2">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1668263398546" ID="ID_1572318013" MODIFIED="1668265880846" TEXT="setVisiblePos (Time posToShow)">
<icon BUILTIN="button_cancel"/>
<node COLOR="#435e98" CREATED="1668265476934" HGAP="22" ID="ID_1485739923" MODIFIED="1668265497115" TEXT="Offset &#x27f9; harmlos" VSHIFT="2">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1668263409355" ID="ID_1494604965" MODIFIED="1668265848826" TEXT="setVisiblePos (Rat percentage)">
<arrowlink COLOR="#895f96" DESTINATION="ID_759637608" ENDARROW="Default" ENDINCLINATION="124;-7;" ID="Arrow_ID_728050450" STARTARROW="None" STARTINCLINATION="166;15;"/>
</node>
<node CREATED="1668263422928" ID="ID_1049514706" MODIFIED="1668263422928" TEXT="setVisiblePos (double percentage)"/>
</node>
<node CREATED="1668263441959" ID="ID_1366157126" MODIFIED="1668263454322" TEXT="2.Layer &#x2014; privat">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263464370" ID="ID_452384864" MODIFIED="1668269820128" TEXT="establishMetric (uint pxWidth, Time startWin, Time afterWin)">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668269822171" ID="ID_1581625515" MODIFIED="1668269880707" TEXT="Resultat sollte &quot;ungiftig&quot; sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
weil es direkt in das Feld <font face="Monospaced" color="#87179a">px_per_second_</font>&#160;geht
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1668269838609" ID="ID_982888658" MODIFIED="1668269848857" TEXT="geeignet normieren oder kappen?">
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263473958" ID="ID_1175951405" MODIFIED="1668270354481" TEXT="conformWindowToMetric (Rat changedMetric)">
<arrowlink COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_389982782" STARTARROW="None" STARTINCLINATION="-323;20;"/>
<linktarget COLOR="#965e8b" DESTINATION="ID_1175951405" ENDARROW="Default" ENDINCLINATION="253;-8;" ID="Arrow_ID_354964355" SOURCE="ID_909162669" STARTARROW="None" STARTINCLINATION="302;-12;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#435e98" CREATED="1668263585452" ID="ID_195681721" MODIFIED="1668270219934" TEXT="conformWindowToCanvas(&lt;current-settings&gt;)">
<node CREATED="1668270193562" ID="ID_918641802" MODIFIED="1668270440632" TEXT="nur additive arithmetik">
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1668270199865" ID="ID_764029688" MODIFIED="1668270213799" TEXT="bereits explizit auf Grenzen gepr&#xfc;ft">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263473958" ID="ID_148236436" MODIFIED="1668270289834" TEXT="conformToBounds (Rat changedMetric)">
<arrowlink COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_1815772846" STARTARROW="None" STARTINCLINATION="-292;20;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263629246" ID="ID_1257614207" MODIFIED="1668265511791" TEXT="mutateScale (Rat changedMetric)">
<arrowlink COLOR="#e62f5c" DESTINATION="ID_651838862" ENDARROW="Default" ENDINCLINATION="115;-4;" ID="Arrow_ID_1930230162" STARTARROW="None" STARTINCLINATION="-189;14;"/>
<linktarget COLOR="#aa6877" DESTINATION="ID_1257614207" ENDARROW="Default" ENDINCLINATION="271;-11;" ID="Arrow_ID_292335664" SOURCE="ID_1173749705" STARTARROW="None" STARTINCLINATION="314;29;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668265021139" HGAP="52" ID="ID_1943948610" MODIFIED="1668265531172" TEXT="pr&#xfc;fen: sehr kleine Metrik" VSHIFT="-2">
<linktarget COLOR="#be7ca2" DESTINATION="ID_1943948610" ENDARROW="Default" ENDINCLINATION="57;-54;" ID="Arrow_ID_569700266" SOURCE="ID_680870152" STARTARROW="None" STARTINCLINATION="197;26;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1668265390104" ID="ID_1154641838" MODIFIED="1668265435386" TEXT="es gibt keine Unterschwelle">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1668265398152" ID="ID_754119758" MODIFIED="1668265427796" TEXT="&#x27f6; hier k&#xf6;nnte sehr gro&#xdf;er Nenner ins System gelangen">
<icon BUILTIN="clanbomber"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1668263638141" ID="ID_909162669" MODIFIED="1668270369633" TEXT="mutateDuration (FSecs duration, uint px =0)">
<arrowlink COLOR="#965e8b" DESTINATION="ID_1175951405" ENDARROW="Default" ENDINCLINATION="253;-8;" ID="Arrow_ID_354964355" STARTARROW="None" STARTINCLINATION="302;-12;"/>
<node CREATED="1668270374842" HGAP="21" ID="ID_1976979366" MODIFIED="1668270395644" TEXT="delegiert an conformWindowToMetric(Rat)" VSHIFT="9">
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263652677" ID="ID_759637608" MODIFIED="1668265848826" TEXT="anchorWindowAtPosition (FSecs canvasOffset)">
<linktarget COLOR="#895f96" DESTINATION="ID_759637608" ENDARROW="Default" ENDINCLINATION="124;-7;" ID="Arrow_ID_728050450" SOURCE="ID_1494604965" STARTARROW="None" STARTINCLINATION="166;15;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1668265925547" ID="ID_548541569" MODIFIED="1668265934174" TEXT="negative Werte">
<node CREATED="1668267213730" ID="ID_751640089" MODIFIED="1668267225777" TEXT="grunds&#xe4;tzlich hier vorgesehen"/>
<node CREATED="1668267238564" ID="ID_1057480192" MODIFIED="1668267248362" TEXT="startWin_ = startAll_ + (canvasOffset - partBeforeAnchor);">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668267251650" ID="ID_1280626173" MODIFIED="1668267290312" TEXT="potentieller TimeValue-wrap">
<icon BUILTIN="broken-line"/>
</node>
</node>
<node CREATED="1668267393360" ID="ID_1700728412" MODIFIED="1668267398176" TEXT="giftige Br&#xfc;che">
<node CREATED="1668267422500" ID="ID_17566048" MODIFIED="1668267468507" TEXT="parabolicAnchorRule">
<arrowlink COLOR="#e92c3f" DESTINATION="ID_1689286236" ENDARROW="Default" ENDINCLINATION="82;-4;" ID="Arrow_ID_176217068" STARTARROW="None" STARTINCLINATION="-158;21;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263473958" ID="ID_773636992" MODIFIED="1668270626473" TEXT="placeWindowRelativeToAnchor (FSecs duration)">
<arrowlink COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_882084800" STARTARROW="None" STARTINCLINATION="-238;15;"/>
<node CREATED="1668270662235" ID="ID_238899324" MODIFIED="1668270676789" TEXT="kein wirklicher Schaden m&#xf6;glich"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668270677518" ID="ID_51247840" MODIFIED="1668270694761" TEXT="aber Berechnung kann wild entgleisen">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1668263721530" ID="ID_829406482" MODIFIED="1668270430868" TEXT="establishWindowDuration (TimeVar duration)">
<node CREATED="1668270193562" ID="ID_440259374" MODIFIED="1668270440632" TEXT="nur additive arithmetik">
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1668270199865" ID="ID_927662816" MODIFIED="1668270213799" TEXT="bereits explizit auf Grenzen gepr&#xfc;ft">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668263742928" ID="ID_1689286236" MODIFIED="1668267468507" TEXT="parabolicAnchorRule (Rat posFactor)">
<linktarget COLOR="#e92c3f" DESTINATION="ID_1689286236" ENDARROW="Default" ENDINCLINATION="82;-4;" ID="Arrow_ID_176217068" SOURCE="ID_17566048" STARTARROW="None" STARTINCLINATION="-158;21;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1668267470317" ID="ID_409576187" MODIFIED="1668267475864" TEXT="kann entgleisen"/>
<node CREATED="1668269162412" ID="ID_983739705" MODIFIED="1668269175422" TEXT="Fehlfunktion ist aber letztlich harmlos"/>
<node CREATED="1668269178282" ID="ID_697782687" MODIFIED="1668269188827" TEXT="die nachgelagerte Normalisierung f&#xe4;ngt die Konsequenzen auf"/>
<node COLOR="#338800" CREATED="1668269189680" ID="ID_1612606864" MODIFIED="1668269410626" TEXT="aber: Limitierung am Ausgang fehlt &#x27f9; nachr&#xfc;sten">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180030777" ID="ID_1319796356" MODIFIED="1668180136077" TEXT="1 &#xb5;-Tick">
<icon BUILTIN="flag-yellow"/>
@ -39545,6 +39704,19 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180054302" ID="ID_1604190635" MODIFIED="1668180136078" TEXT="1 Pixel">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668264626100" ID="ID_45091906" MODIFIED="1668264632183" TEXT="giftige Br&#xfc;che">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668264634478" ID="ID_651838862" MODIFIED="1668264715601" TEXT="setMetric (Rat) &#x27f6; mutateScale (Rat changedMetric)">
<linktarget COLOR="#e62f5c" DESTINATION="ID_651838862" ENDARROW="Default" ENDINCLINATION="115;-4;" ID="Arrow_ID_1930230162" SOURCE="ID_1257614207" STARTARROW="None" STARTINCLINATION="-189;14;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1668270062492" ID="ID_1671513743" MODIFIED="1668270626473" TEXT="entgiftungs-Methode schaffen">
<linktarget COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_389982782" SOURCE="ID_1175951405" STARTARROW="None" STARTINCLINATION="-323;20;"/>
<linktarget COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_1815772846" SOURCE="ID_148236436" STARTARROW="None" STARTINCLINATION="-292;20;"/>
<linktarget COLOR="#bf0f5b" DESTINATION="ID_1671513743" ENDARROW="Default" ENDINCLINATION="297;-23;" ID="Arrow_ID_882084800" SOURCE="ID_773636992" STARTARROW="None" STARTINCLINATION="-238;15;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1668180120032" ID="ID_346213896" MODIFIED="1668180136079" TEXT="Grenzen des Zeitformats">
<icon BUILTIN="flag-yellow"/>
</node>
@ -43861,7 +44033,7 @@
</node>
</node>
<node COLOR="#338800" CREATED="1501778430101" ID="ID_489078622" MODIFIED="1561827465675" TEXT="#1098 hand-over to UI thread">
<arrowlink COLOR="#7caaa8" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="2513;3565;" ID="Arrow_ID_1832047032" STARTARROW="Default" STARTINCLINATION="3463;134;"/>
<arrowlink COLOR="#7caaa8" DESTINATION="ID_1023343635" ENDARROW="Default" ENDINCLINATION="2513;3565;" ID="Arrow_ID_1832047032" STARTARROW="Default" STARTINCLINATION="2914;51;"/>
<linktarget COLOR="#6c5f80" DESTINATION="ID_489078622" ENDARROW="Default" ENDINCLINATION="712;-47;" ID="Arrow_ID_485145709" SOURCE="ID_31825421" STARTARROW="None" STARTINCLINATION="1538;-37;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1531583488816" ID="ID_626261980" MODIFIED="1531583585348" TEXT="Dispatcher">