development/architecture - add operating stages

This commit is contained in:
Ad Schellevis 2025-05-12 18:22:26 +02:00
parent 3be13e30c6
commit fcae9dd9e1
8 changed files with 834 additions and 35 deletions

View file

@ -22,7 +22,7 @@ This article describes how this will be achieved.
High-level architecture
-----------------------
|OPNsense Components.png|
|OPNsense Components.svg|
As the above model shows there are two main areas in our stack, the
frontend implemented with PHP/Phalcon and the backend using a custom
@ -42,37 +42,13 @@ Manipulation of the core configuration file is handled at the frontend
model; the backend service is merely a consumer of the information
provided.
--------------------
Backend Architecture
--------------------
|OPNsense backend.png|
Configd, is responsible
for the core system interaction like starting and stopping of daemons
and generating configuration files for used services and applications.
The daemon listens on a unix domain socket and is capable of executing
actions defined in its own configuration directory
(“/usr/local/opnsense/service/conf/actions\_\*.conf”).
Currently there are four types of services implemented in the daemon:
- script : execute external (rc) scripts, report back success or failure
- script_output: execute external scripts, report back their contents, usually in json format
- stream_output: open streams to backend components
- inline : perform inline actions which are part of configd, most notable template generation and maintanance.
|
| Template generation is handled by Jinja2 (http://jinja.pocoo.org/),
more information on how to create application templates can be found
at :doc:`/development/backend/templates`.
---------------------
Frontend Architecture
---------------------
|OPNsense frontend.png|
|OPNsense frontend.svg|
Routing
-------
@ -123,12 +99,71 @@ control and the repositories are split into 4 parts:
| For detailed information about the development workflow see:
| :doc:`OPNsense development workflow </development/workflow>`
.. |OPNsense Components.png| image:: images/OPNsense_Components.png
--------------------
Backend Architecture
--------------------
Middleware
--------------------------------------
|OPNsense backend.svg|
Configd, is responsible
for the core system interaction like starting and stopping of daemons
and generating configuration files for used services and applications.
The daemon listens on a unix domain socket and is capable of executing
actions defined in its own configuration directory
(“/usr/local/opnsense/service/conf/actions\_\*.conf”).
Currently there are four types of services implemented in the daemon:
- script : execute external (rc) scripts, report back success or failure
- script_output: execute external scripts, report back their contents, usually in json format
- stream_output: open streams to backend components
- inline : perform inline actions which are part of configd, most notable template generation and maintanance.
|
| Template generation is handled by Jinja2 (http://jinja.pocoo.org/),
more information on how to create application templates can be found
at :doc:`/development/backend/templates`.
Operating stages
--------------------------------------
|OPNsense_operating_events.svg|
As all earlier layers describe how user input can be persisted and service information can be exchanged, we still
have a gap in our functionality when looking at the life of a firewall.
Until this point we have means to manually manage services and devices, including ways to collect information on demand,
but still in a rather isolated way (events triggered via the api layer).
This is where :doc:`syshooks <backend/autorun>` and :doc:`plugins <backend/legacy>` come into play,
these offer mechanisms to ensure different types of services can cooperate with the shared functionality available.
Between starting and stopping our firewall, we can identify three stages.
After power-on, we are booting, when this initial stage has been reached we end up with a running firewall with
all configured services available. During time, various events can happen, for example, someone pulling an network cable
and pushing it back in, this is the running stage.
Eventually, if someone decides to power-down or reboot the machine, we are entering shutdown stage, letting services know
we are ending operation.
Further details of each stage can be found in the :doc:`overview <backend/overview>` document.
To avoid endless dependency loops, services should prevent hooking on events that are not strictly required for operating.
For example, forcing a restart of a component when a network interface has changed is usually a sign of not
following best practices for designing network services.
.. |OPNsense Components.svg| image:: images/OPNsense_Components.svg
:width: 600px
:height: 548px
.. |OPNsense backend.png| image:: images/OPNsense_backend.png
.. |OPNsense backend.svg| image:: images/OPNsense_backend.svg
:width: 500px
.. |OPNsense frontend.svg| image:: images/OPNsense_frontend.svg
:width: 600px
:height: 575px
.. |OPNsense frontend.png| image:: images/OPNsense_frontend.png
:width: 600px
:height: 461px
.. |OPNsense_operating_events.svg| image:: images/OPNsense_operating_events.svg
:width: 700px

View file

@ -9,7 +9,7 @@ Our core backend service (configd) is implemented using `Python <https://en.wiki
- Service interaction (using configd actions)
- Generation of configuration data (using templates)
Because some of the codebase still integrates with our legacy codebase, we provide additional plugin options for the following components:
Because we need integration between (legacy) components, we provide additional plugin options for the following components:
- Services (the services status)
- Syslog (define syslog targets)
@ -18,6 +18,8 @@ Because some of the codebase still integrates with our legacy codebase, we provi
Services which need to be executed at system startup can use rc(8) or our syshook system.
Our :doc:`overview <backend/overview>` document contains a practical write up to explain the various phases of
operation and hooks available in them.
.. toctree::
:maxdepth: 2

View file

@ -32,7 +32,7 @@ in sequence:
....................................
Normal operation
Running stage
....................................
Now the system is booted and events may take place, some of the common integration points with their purpose are listed below:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View file

@ -0,0 +1,476 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.24-->
<key attr.name="Description" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d0"/>
<node id="n0">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="282.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="39.33203125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.5068359375" x="22.74658203125" xml:space="preserve" y="16.333984375">bootloader
/
kernel stage<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n1">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
<y:Geometry height="30.0" width="30.0" x="222.5" y="399.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#27AE27" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.3173828125" x="-9.65869140625" xml:space="preserve" y="34.0">power on<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n2">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="421.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.853515625" x="30.0732421875" xml:space="preserve" y="22.22265625">syshooks
[early]<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n3">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="560.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.259765625" x="4.3701171875" xml:space="preserve" y="22.22265625">plugins
(registration points)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n4">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="699.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.7138671875" x="14.14306640625" xml:space="preserve" y="22.22265625">syshooks [start]
-&gt; rc(8)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n5">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
<y:Geometry height="30.0" width="30.0" x="838.5" y="399.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#27AE27" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.0419921875" x="-6.02099609375" xml:space="preserve" y="34.0">running<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n6">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="898.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="86.05078125" x="11.474609375" xml:space="preserve" y="22.22265625">syshook / plugin
events<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n7">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Event.withShadow">
<y:Geometry height="30.0" width="30.0" x="1037.5" y="399.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#27AE27" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="81.4072265625" x="-25.70361328125" xml:space="preserve" y="34.0">stop [power off]<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.EventCharEnum" name="com.yworks.bpmn.characteristic" value="EVENT_CHARACTERISTIC_START"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="EVENT_TYPE_PLAIN"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n8">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Activity.withShadow">
<y:Geometry height="72.0" width="109.0" x="1097.5" y="378.5"/>
<y:Fill color="#FFFFFFE6" color2="#D4D4D4CC" transparent="false"/>
<y:BorderStyle color="#123EA2" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.853515625" x="30.0732421875" xml:space="preserve" y="22.22265625">syshooks
[stop]<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:StyleProperties>
<y:Property class="com.yworks.yfiles.bpmn.view.TaskTypeEnum" name="com.yworks.bpmn.taskType" value="TASK_TYPE_ABSTRACT"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ACTIVITY_TYPE"/>
<y:Property class="com.yworks.yfiles.bpmn.view.ActivityTypeEnum" name="com.yworks.bpmn.activityType" value="ACTIVITY_TYPE_TASK"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n9">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
<y:Geometry height="30.0" width="249.0" x="629.5" y="181.0"/>
<y:Fill color="#FFFFFFE6" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="243.12109375" x="4.0" xml:space="preserve" y="1.22265625">Simple scripts, executed early, also used by core
components to handle early-boot requirements</y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_ANNOTATION"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n10">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
<y:Geometry height="30.0" width="249.0" x="742.0" y="230.25"/>
<y:Fill color="#FFFFFFE6" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="236.83203125" x="4.0" xml:space="preserve" y="1.22265625">Structures pluggable core services, devices and
offers configure event handlers</y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_ANNOTATION"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n11">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
<y:Geometry height="30.0" width="249.0" x="856.9" y="279.5"/>
<y:Fill color="#FFFFFFE6" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="143.8193359375" x="4.0" xml:space="preserve" y="7.111328125">Regular service startup point</y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_ANNOTATION"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<node id="n12">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.userMessage">
<y:Geometry height="40.0" width="643.0" x="222.5" y="480.5"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="71.9833984375" x="285.50830078125" xml:space="preserve" y="12.111328125">bootup stage<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n13">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.networkMessage">
<y:Geometry height="40.0" width="201.75" x="851.7115098111999" y="480.5"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.001953125" x="62.8740234375" xml:space="preserve" y="12.111328125">running stage<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n14">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.networkMessage">
<y:Geometry height="40.0" width="168.9999999999999" x="1037.5" y="480.5"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="86.3876953125" x="41.30615234375" xml:space="preserve" y="12.111328125">shutdown stage<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n15">
<data key="d5"/>
<data key="d6">
<y:GenericNode configuration="com.yworks.bpmn.Artifact.withShadow">
<y:Geometry height="30.0" width="179.70000000000005" x="1026.8000000000002" y="329.0"/>
<y:Fill color="#FFFFFFE6" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="27.5546875" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="148.052734375" x="4.0" xml:space="preserve" y="1.22265625">integration points for (device
related) events</y:NodeLabel>
<y:StyleProperties>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.line.color" value="#000000"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill2" value="#d4d4d4cc"/>
<y:Property class="java.awt.Color" name="com.yworks.bpmn.icon.fill" value="#ffffffe6"/>
<y:Property class="com.yworks.yfiles.bpmn.view.BPMNTypeEnum" name="com.yworks.bpmn.type" value="ARTIFACT_TYPE_ANNOTATION"/>
</y:StyleProperties>
</y:GenericNode>
</data>
</node>
<edge id="e0" source="n1" target="n0">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e1" source="n0" target="n2">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e2" source="n2" target="n3">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e3" source="n3" target="n4">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e4" source="n4" target="n5">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e5" source="n5" target="n6">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e6" source="n6" target="n7">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e7" source="n7" target="n8">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e8" source="n2" target="n9">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="617.0" y="196.0"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="88.63472993741766" y="-87.12303021621301">
<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e9" source="n3" target="n10">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="726.0" y="245.25"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="73.1893486034719" y="-61.943583582114">
<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e10" source="n4" target="n11">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="838.9888" y="294.5"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="57.984512618745384" y="-34.78907105634141">
<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e11" source="n6" target="n15">
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="1001.2881067471993" y="344.0"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="40.49212519416176" y="-10.949325364396941">
<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
</data>
</graphml>

View file

@ -0,0 +1,286 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="1025" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="370" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
<!--Generated by ySVG 2.6-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<linearGradient x1="282.5" gradientUnits="userSpaceOnUse" x2="391.5" y1="378.5" y2="450.5" id="linearGradient1" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="222.5" gradientUnits="userSpaceOnUse" x2="252.5" y1="399.5" y2="429.5" id="linearGradient2" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="421.5" gradientUnits="userSpaceOnUse" x2="530.5" y1="378.5" y2="450.5" id="linearGradient3" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="560.5" gradientUnits="userSpaceOnUse" x2="669.5" y1="378.5" y2="450.5" id="linearGradient4" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="699.5" gradientUnits="userSpaceOnUse" x2="808.5" y1="378.5" y2="450.5" id="linearGradient5" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="838.5" gradientUnits="userSpaceOnUse" x2="868.5" y1="399.5" y2="429.5" id="linearGradient6" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="898.5" gradientUnits="userSpaceOnUse" x2="1007.5" y1="378.5" y2="450.5" id="linearGradient7" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="1037.5" gradientUnits="userSpaceOnUse" x2="1067.5" y1="399.5" y2="429.5" id="linearGradient8" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="1097.5" gradientUnits="userSpaceOnUse" x2="1206.5" y1="378.5" y2="450.5" id="linearGradient9" spreadMethod="reflect">
<stop stop-opacity="0.902" stop-color="rgb(255,255,255)" offset="0%"/>
<stop stop-opacity="0.8" stop-color="rgb(212,212,212)" offset="100%"/>
</linearGradient>
<linearGradient x1="222.5" gradientUnits="userSpaceOnUse" x2="865.5" y1="480.5" y2="520.5" id="linearGradient10" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="851.7115" gradientUnits="userSpaceOnUse" x2="1053.4615" y1="480.5" y2="520.5" id="linearGradient11" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="1037.5" gradientUnits="userSpaceOnUse" x2="1206.5" y1="480.5" y2="520.5" id="linearGradient12" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M0 0 L1025 0 L1025 370 L0 370 L0 0 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M197 166 L1222 166 L1222 536 L197 536 L197 166 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
<path d="M-77.5 -204.5 L947.5 -204.5 L947.5 165.5 L-77.5 165.5 L-77.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
<path d="M-7.8413 -225.5 L1017.1587 -225.5 L1017.1587 144.5 L-7.8413 144.5 L-7.8413 -225.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
<path d="M-216.5 -204.5 L808.5 -204.5 L808.5 165.5 L-216.5 165.5 L-216.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
<path d="M-355.5 -204.5 L669.5 -204.5 L669.5 165.5 L-355.5 165.5 L-355.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
<path d="M-494.5 -204.5 L530.5 -204.5 L530.5 165.5 L-494.5 165.5 L-494.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
<path d="M-627.479 -225.5 L397.521 -225.5 L397.521 144.5 L-627.479 144.5 L-627.479 -225.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
<path d="M-693.5 -204.5 L331.5 -204.5 L331.5 165.5 L-693.5 165.5 L-693.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
<path d="M-806.7964 -225.5 L218.2036 -225.5 L218.2036 144.5 L-806.7964 144.5 L-806.7964 -225.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
<path d="M-892.5 -204.5 L132.5 -204.5 L132.5 165.5 L-892.5 165.5 L-892.5 -204.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
<path d="M-424.5 -7 L600.5 -7 L600.5 363 L-424.5 363 L-424.5 -7 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
<path d="M-537 -56.25 L488 -56.25 L488 313.75 L-537 313.75 L-537 -56.25 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
<path d="M-651.9 -105.5 L373.1 -105.5 L373.1 264.5 L-651.9 264.5 L-651.9 -105.5 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
<path d="M-821.8 -155 L203.2 -155 L203.2 215 L-821.8 215 L-821.8 -155 Z"/>
</clipPath>
</defs>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,77.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath3)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="282.5" y="378.5" transform="matrix(1,0,0,1,-274.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient1)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="282.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="310.584" xml:space="preserve" y="406.502" clip-path="url(#clipPath2)" stroke="none">bootloader</text>
<text x="332.7959" xml:space="preserve" y="418.2793" clip-path="url(#clipPath2)" stroke="none">/ </text>
<text x="307.2466" xml:space="preserve" y="430.0566" clip-path="url(#clipPath2)" stroke="none">kernel stage</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,7.8413,225.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath4)" width="70" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAYAAABxLuKEAAAE60lEQVR4Xu3aB28c&#10;NxAF4EnkJE51ei9nSYnTe2/eOP7/vyn8wBuIIFbnk2LAvDMHeLB0y11xHt+84fIc&#10;MWPGjBkzZsyIeKLBkyvIa49FtEScFNwoeKrg6Q4+cw1aoo4uWjIk/UzBswXPF7xQ&#10;8GLBSw387poxxrrHvUdFkESSkJtRE75V8GrBGwVvFbxT8O4Wfn57e+217VjkISkJ&#10;OnhyrLBysOoIeTlqwgj4qOCs4OOCOwWfbuHnT7bXNgXvFbxZ8EpUgpCbJXaQBJm4&#10;FbbSygMhkjyNSsCXBd8W/FDwY8FPW/jZZ659tR2LpA+iEkRBz0V99kGRk35i4hKg&#10;EqWxiZrkN1GT/7Xg94I/C/7q4DPXjDEWSZ9FJZXalCEFMmp/6yCiJYX8JWLFKYQS&#10;foua/N2CpeCfgnsdfOaaMca6B0EUpPTej+o/yEnlDB3Uov6VT5Iika8Lfo6qBMlK&#10;/t8t7l+CvG7ssr33l6jq4UPIoRwL4G8OW1LZfZgjH9BdzqOWjoSsPCXsImMNSZB7&#10;/45aXshh0DzLAvibw3YrclbzOgeTvB1V+vuQksnvUlFPDsLPo/oXcx/Sb9oSIm8d&#10;5POovrCLlJ6QHmvjPcszlSbf2hS8HhclNVSkWuxYbdisJLnrLEtcnuQ+WLtvKfgj&#10;qpnzG16WqhmqnE6i1rl6T7VYUbJnnmvJXQX9/Z6ZJaVcN1G7FMWayxCRZaR12sSd&#10;Rq3/VEufVJ/0vuifsURVzfdROx+l8jdzGSIQYy+hjBihbkHi2muvlj7Zq6AnOL3G&#10;btnmT4fSDYcpJ/7iXcik7C3aMmoT6hO9DlpikG5PpJyY8IdRS9lchuhOJpH+YnIm&#10;abIm3SbTJ3kd9Opbou6Kla7tgY5oLkMQcxJ1Mibljdku12SXeLikJHpieJkOyNvS&#10;gIcjZhOPlhj7mSGJuUwxD4uc/nlLDKyYR+Ux9+LCYyzGJgbzGJPIrqRlap1rXen/&#10;ktM+J4lBvnexIbvSrn2MvUafUJ/wvuifsbaPGeq1IHe+XuKYn7apfabP9Eldh5y1&#10;+5eo/vJd1Hez4Xa+4iRqbTvGtMmzglbSipJ8n9hVyFm7zzM9O8uI6fOXod6VRJZT&#10;nsWcxYNVsw85/XhI06UW70lK16HYUGWUYTJWKrsT1Tj4Tq9ZYney+xCS45aoz6TI&#10;L6KqJdv0jRgwdIJUjbfsTVSZ51nvEhdnvX3CD0ISloarhLTos6jewviHPMHLoBrt&#10;kqx1KBN3XrJGzj7qSGT55IG4MnXU4ICKrw195iuyQ6URq/0kh/T5gv3NEhdflbQE&#10;9GQkIfYrzl4QTClIyYPwLKFhSclIckw4yTmN6gfM0opLEkH53RIoE8jfXTPGWDtp&#10;fqU0z6OSkl+dKN/hScloybEj5gNM0vks9UjS6utaEgdlAvm7a0g0lkqY+SZqiVJK&#10;+zXtQUVbVsxR5+AJm6gtloJ4hQ2a5CG/t6Ys1ygEmRRHJTaQ/CvL5+BIycg2rmNY&#10;YeqRnPJyaH47amkgCgH5Px185pr3H2TqcsrSuTJzH9po9w0JWFkrLCkEUZByQJIN&#10;ofIAhPnXZ64ZQyHucW+q5OBJaSMJstq8QaJKov1fVeBnnyFDGVLbURKyFi1JkgZk&#10;JfzuWpJx9ITsiiTgsSZhxowZM2bMmDFjxowZM2bMmDFjxowZM2bMmDFjxoyjiP8A&#10;+3jHsSVM0bsAAAAASUVORK5CYII=" height="70" preserveAspectRatio="none"/>
<path fill="url(#linearGradient2)" d="M252.5 414.5 C252.5 422.7843 245.7843 429.5 237.5 429.5 C229.2157 429.5 222.5 422.7843 222.5 414.5 C222.5 406.2157 229.2157 399.5 237.5 399.5 C245.7843 399.5 252.5 406.2157 252.5 414.5 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-204.8413,-391.5)" stroke="none" image-rendering="auto"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(39,174,39)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(39,174,39)" stroke-miterlimit="1.45">
<path fill="none" d="M252.5 414.5 C252.5 422.7843 245.7843 429.5 237.5 429.5 C229.2157 429.5 222.5 422.7843 222.5 414.5 C222.5 406.2157 229.2157 399.5 237.5 399.5 C245.7843 399.5 252.5 406.2157 252.5 414.5 Z" clip-path="url(#clipPath2)"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="214.8413" xml:space="preserve" y="445.168" clip-path="url(#clipPath2)" stroke="none">power on</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,216.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath5)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="421.5" y="378.5" transform="matrix(1,0,0,1,-413.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient3)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="421.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="453.5732" xml:space="preserve" y="412.3906" clip-path="url(#clipPath2)" stroke="none">syshooks</text>
<text x="461.0977" xml:space="preserve" y="424.168" clip-path="url(#clipPath2)" stroke="none">[early]</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,355.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath6)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="560.5" y="378.5" transform="matrix(1,0,0,1,-552.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient4)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="560.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="597.0898" xml:space="preserve" y="412.3906" clip-path="url(#clipPath2)" stroke="none">plugins</text>
<text x="566.8701" xml:space="preserve" y="424.168" clip-path="url(#clipPath2)" stroke="none">(registration points)</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,494.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath7)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="699.5" y="378.5" transform="matrix(1,0,0,1,-691.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient5)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="699.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="715.6431" xml:space="preserve" y="412.3906" clip-path="url(#clipPath2)" stroke="none">syshooks [start]</text>
<text x="734.5298" xml:space="preserve" y="424.168" clip-path="url(#clipPath2)" stroke="none">-&gt; rc(8)</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,627.479,225.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath8)" width="63" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAABGCAYAAAB7ckzWAAAE30lEQVR4Xu3ZB2/k&#10;NhAF4LnYaZd6KZeeOLAvPVfSe5Ty/39T+IEaHENoDdswJDnhAA/eFYv4Zt4MyXXE&#10;sGHDhg0bdt12a8YTC8i2/5Ql2aOC44InC55agOfa9Utn3Fiz+CSM3DMFtwueL3ih&#10;4MUGvnuuXT/9jbtxTshIW/zTUQkhd6fgtYI3Ct4qeHuGz28W3J3b9dPfOONvjBMy&#10;2iJn8aL6alRy7xV8WHCv4OOCTxr4fja366e/ccY/GzUlzLtbByRx0SLhV6JG9YOC&#10;jwo+L3hQ8FXBNwXfzvAZHs3t+nGQcZxgHvOZd5cOsCDylK+i9XrUCCLxRVTC3xf8&#10;VPDLjF87/FzwY8F3c3/jjDeP+aTC7hyQEU/icvqk4NOo0UQasd8KpoI/Cv5cgOfa&#10;9dOfEx5GTQsqUBPMvxsHtFK3MAuUt6T7ddRII5OE/yr4+xxoT0cYRwnm+SyqQ81P&#10;AWqKIripWYCFyEnSPIlKXA6L3hQXI90jnfB7VAemAyjAjvBc1CK4WfQzz1VjRUlu&#10;krqFJnEklojn80PtrQOmqA5QB6TAu1G3Q++luk0so07uqrriJMctdIplUj3pHn1/&#10;SAVIATXgLOouQP6bRL+Nuv34JGp1VtzkqgX3JHqih7A0Tg2wIyiC0or8qW2T6GfU&#10;eV8U7ONkSe4WukTgMlgaP0VVFXVRmV1FrVk9+rxta3s5aq6LxqGo98Quit4BbfQV&#10;P7nv/Xaa1cin5B1fSd7W5mS2lOs9ocuiJd/m/v2oqeb9gkCJqxjypGa7se+eRZW8&#10;U1sv+Z7MZdHPNcVj6Z9G3V4F4ShWsiQv3zLfbW8k2Uq+J3JVtPNxLid7X+a9IBzH&#10;SoZ8FjtbnBuZQ82a5L2P0zk/i94q1pN38LCYvtj1JK6KQ+Q53fs3Jb9F5Mm+jfyq&#10;sr9Izl+HA/q5kHeWUGA3y3kva6u96rt0wOnJXBb9XFPUau+YexobVHvmZXm0tc/b&#10;d+2/Uywv+ipo54Dc538o+DLqPu+Iu+o+z7wsT3hOWk5cTl590buqA/rxQFVSy09f&#10;bo/vFLwUtf5Q42qWRS/zPm907VW2X3xP8BD6cTm2v9nl2f44VrbM+7zLu2U534t+&#10;Fr4lIj3RHn3/HJNVXtSp7P2od/rVJZ/mpe3NTjRERXRE6ZADlpzQt7f9zCOd5Lo7&#10;xGlseKNL89KjqNEXBbnvwGMbUpFbB5xH8BBa4hwqrZwp5LpaI+rev5mJfl5y/LZG&#10;/vlTVjqAZC8S5SScpI1L4hxqXnK3w9jejmOjqLfWyt++mw6wYAtXA6b49y+4S9CW&#10;pDlNjpO6iJvPvOYn9138estS/n5UaB0gBdQARYoKOAGpaQaSiXymXT/9jZPjpC7i&#10;+Y+L3RBPax0gMlJADTiLuguIHjIiiZgtMf9zA757rl0/TlPVT6PmOKm3Ed9c7r2l&#10;AyxQDVAE7QKixgnIOAlyhJRQF1yI/PUdYSc3EtffOFVdcZPj5jX/7oinWVgWQdWY&#10;TJ0DkKCEk6jRdCgiZ3Ax8t1z7SKtf/6r2jyK266kfp61KrAVkqwIkq/cRY4qXIn9&#10;9d1zjnJk1R9pTtx1tA9ZqsDikVAPOIKEkRNV8Bk8167fjSW9ZK0jSBgQTPiuDXZZ&#10;0K7bEEwMGzZs2LBhw4YNGzZs2LBhw4YNGzZs2LBhw4b9f+0f14LHeXVcFtgAAAAA&#10;SUVORK5CYII=" height="70" preserveAspectRatio="none"/>
<path fill="url(#linearGradient6)" d="M868.5 414.5 C868.5 422.7843 861.7843 429.5 853.5 429.5 C845.2157 429.5 838.5 422.7843 838.5 414.5 C838.5 406.2157 845.2157 399.5 853.5 399.5 C861.7843 399.5 868.5 406.2157 868.5 414.5 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-824.479,-391.5)" stroke="none" image-rendering="auto"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(39,174,39)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(39,174,39)" stroke-miterlimit="1.45">
<path fill="none" d="M868.5 414.5 C868.5 422.7843 861.7843 429.5 853.5 429.5 C845.2157 429.5 838.5 422.7843 838.5 414.5 C838.5 406.2157 845.2157 399.5 853.5 399.5 C861.7843 399.5 868.5 406.2157 868.5 414.5 Z" clip-path="url(#clipPath2)"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="834.479" xml:space="preserve" y="445.168" clip-path="url(#clipPath2)" stroke="none">running</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,693.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath9)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="898.5" y="378.5" transform="matrix(1,0,0,1,-890.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient7)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="898.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="911.9746" xml:space="preserve" y="412.3906" clip-path="url(#clipPath2)" stroke="none">syshook / plugin</text>
<text x="937.3188" xml:space="preserve" y="424.168" clip-path="url(#clipPath2)" stroke="none">events</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,806.7964,225.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath10)" width="102" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABGCAYAAAA+c+FUAAAFI0lEQVR4Xu3b53Ij&#10;RwwEYNg655yzj3eSc87ZXof3fybPV0MUx3NLSqJU9B90VVdR3CAVGmhgZlcRhUKh&#10;UCgUCoXCTfDQwIdXmMcKJ8AoxFnjncZHGh+d6Dt03HkpVOGWMYoh4I81PtH4VOPT&#10;jc80PjvQz445x7muKYFuGQKZgjwePeDPNb7Y+Erja41vNL65pc+vN77a+NL2XOIR&#10;STW5V4lzQ8hwdiTrCfJ8dDEIcLfxfuN7jR80frilz+83njduGt+KLtIL0QUiLpGr&#10;eo6EwAmgTGdPL0cPMjEI8Gnjl43fNH7b+N2WPvvuq8bPGj+KLtI70QUi7pNR1XMU&#10;UhQBFEjWtIleDV9ED/6PjT83/tr420Tf/bI9h1gE/Di6qKqNDarAEucaGEVhPwIp&#10;41WISvgpevD/aFwa/2z8a6Lv0DnOJSCBPo9uc29H7z+sjTh+Z+EAZK6ewr5UClEu&#10;ogf0++hVINiC//eW/+xhHnfuEl2gH6JXj8pjbcRRORKhqmYPcvrS6E1S7CtFEVCB&#10;VQWHxNhH17j29+gVp/8QR+WoSolQlrYHaWHsxeR1L3rzVimXiZLVcaiKRnH0HpVj&#10;ojNeGy7K0laQ1SJzZTCbMU1p8hr5PlFmQWaune9ehCa4vrWJPvHpaXeiquY/GKvF&#10;gvEiekZr2kvsD/JVuHbdEr1fGSZYml7GPqtqJpxFX/hp+HzfaGuKktma91pwr8P5&#10;evc0RLA0drmJPghkrynEbhJjJSxFb7FW0aSXeDCwc9CvyvkeS/Sq+Tr6CG3YULEq&#10;txBdGMGw8Sg4gsRisrfMAT2Wa1WTvUaFqtS0s+oz0T09R2RbLpo+GzM9jTY2B/oY&#10;ziKPdmbvzeDBUqvPRA9C9hfT2CfR1y2CNgZzDvKxnO2MZbJOFpp9poSJXeOXrbJW&#10;9sriJR4M5G1wFsbkZwK8H73H1QCwhSAQxsZiCrPW+OcAH8s1YewElDATBGGtYk5l&#10;ZVUxe3DKHpP3GoWZe0w1/y0EwVRmv+rQVHZTccb7oHuPU9m70avW31LCxG4dk9sx&#10;NhYt+tbWMTcRZ75P7plJAskgKWodM2Bt5W+rn8XMdnasOGvXL9FX/hq/ZJAUksPf&#10;UtjiLLqF5F5Z7izv2yu7jjjzdeierFIvq72yAxjtzAsT57HbL8uqWQvyLMLM+fy8&#10;Zok+jeU+md3lfCZTNjZAMGTquMPsTRh7ZuxmicuDfZkgeZ7eon/pLSZAI7pqyecx&#10;hQlZNZ7B6zWb6IETQIFcYvesfw74ZUzBsuGzMH3sPPrGqQ3UehZzAKpGgNiKZmzR&#10;pwekOPOLGIdEGs9xzRI7UdgkCzOJqVCV6neXje3BaGlGV8/jZbVHwIYBfUHTXmL3&#10;qtIowCwGqhKCskRb/CkKu7QNVI+Ur4gcn/MVJlajcjwzMdrKeEEmkIAvWxIA82fH&#10;nKPSLCL1KwJfRK+UfOkvX5ctXAGjOCrHpKZJy3TWJsiy39RGJCRAvoGJjhFRpakS&#10;w8S96FVoha9SSpQjkOKwNc3Z5GSs3UQXyGAg4KqIUJjvLRuDHVMhBFFxrMtrUfoX&#10;wUuUGyB7joFAhufL5bLehqcKYE2E8rZLvunvO2LY/yImQdgi67KQrZ5yCxBAmS2Y&#10;gkogFcSOiMTm9CEc/zfGMecQcxTEvUqUW0QKpILYkECzpPG/ytBn3xGQDaq2EuRE&#10;GEUSdCRW0s+OpRglyP+IFKBEKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgU&#10;CoVCoXAa/AsuJse/SpChuwAAAABJRU5ErkJggg==" height="70" preserveAspectRatio="none"/>
<path fill="url(#linearGradient8)" d="M1067.5 414.5 C1067.5 422.7843 1060.7843 429.5 1052.5 429.5 C1044.2157 429.5 1037.5 422.7843 1037.5 414.5 C1037.5 406.2157 1044.2157 399.5 1052.5 399.5 C1060.7843 399.5 1067.5 406.2157 1067.5 414.5 Z" clip-path="url(#clipPath2)" transform="matrix(1,0,0,1,-1003.7964,-391.5)" stroke="none" image-rendering="auto"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(39,174,39)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(39,174,39)" stroke-miterlimit="1.45">
<path fill="none" d="M1067.5 414.5 C1067.5 422.7843 1060.7843 429.5 1052.5 429.5 C1044.2157 429.5 1037.5 422.7843 1037.5 414.5 C1037.5 406.2157 1044.2157 399.5 1052.5 399.5 C1060.7843 399.5 1067.5 406.2157 1067.5 414.5 Z" clip-path="url(#clipPath2)"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="1013.7964" xml:space="preserve" y="445.168" clip-path="url(#clipPath2)" stroke="none">stop [power off]</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,892.5,204.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath11)" width="130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAABdCAYAAABpa74HAAADUklEQVR4Xu3dWU8U&#10;URBA4UIRcRcSRFTcBZdEXHBHxeX//ybr1LVjZwIvPTN2P5xKvvBEN8k9U93zRITj&#10;OI7jOI7jOM6iZyWdmXFWo+qfBeeDpU0XwGo6l9bSeU0KZ8LZcEZdFAubfgDc7EK6&#10;nK6ma+m6JoGz4Ew4G86IKNgWC4uhi2A9XUmbaTvdSnc0GbfTTroR7Yw4K86Ms5s7&#10;Bi7QRUBxBHA3PU5P0/P0QqPjHJ6l/fQo7UYLgg3BFmczzDVsAy5EXUTwINpNX6XD&#10;9D590CRwFpzJQbQo7keLgUcF7w2Dt0K3DXjesGrYBETwNn1OX9M3TcL3vz+P0sf0&#10;JloMbIaNaBudD/WgIQRKoijK4nHAJviUjtPP9EuT8iNaEMTAZniYttLFmOPxQEG8&#10;efKc4SWE5w+rh01ABL81OV0MbAY29166Ge3DvBoDp3s/4CWRN1JWDc8hiuOGs3+A&#10;xjF7DoTAh/VdtBd6vt3xjsd2HzT9EPh6wvvBSSHM/mH6/04LgQ8vIbDVlxrC7B+k&#10;8RiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiC&#10;iiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGo&#10;GIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGIKKIagYgoohqBiCiiGoGILK&#10;qCEYwzT0z2K0EIxhXLPnsNQQuv8Wz8VPCkHT0A/hMNp/i9+JBfy3+LVoF+Fi++lt&#10;Oko/49+NNQ3deRynL+lNepK20+W0GgNnJVpFXORGepQO0sdoW4HyNC3H0bbBh/Qy&#10;PUxb6WI6GwNnJdovX0ibaTfa44HSPkXbDNxU08EmIILX0R4LvNtdj/aIZ8MPnv7j&#10;ga1wP1oMbAYeE7wzaBp4J+BDyiYggnvRtgEbnc3OB3vw8Ms8W9ajvXkSw260lbMX&#10;7YaEofFxFpwJZ8MmIAI+wGyDwY+F/vRjoK6NaDe5Ge2rCd8oND7OgjPhbDgjzqqL&#10;YK5t0J/ufYHHBEFcilYbWwJ8xdR4unPg8DkbzojHwUIj6IYL8s7AxdkQ3IgwNA2c&#10;BzibpQRw2nAjTY/jOI7jOI7jOM4S5g9hNzoHUnGfsAAAAABJRU5ErkJggg==" height="93" preserveAspectRatio="none"/>
<rect x="1097.5" y="378.5" transform="matrix(1,0,0,1,-1089.5,-370.5)" clip-path="url(#clipPath2)" fill="url(#linearGradient9)" width="109" image-rendering="auto" rx="4" ry="4" height="72" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" fill="rgb(18,62,162)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(18,62,162)" stroke-miterlimit="1.45">
<rect x="1097.5" y="378.5" clip-path="url(#clipPath2)" fill="none" width="109" rx="4" ry="4" height="72"/>
</g>
<g font-size="10px" stroke-linecap="butt" transform="matrix(1,0,0,1,-197,-166)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
<text x="1129.5732" xml:space="preserve" y="412.3906" clip-path="url(#clipPath2)" stroke="none">syshooks</text>
<text x="1138.1108" xml:space="preserve" y="424.168" clip-path="url(#clipPath2)" stroke="none">[stop]</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,424.5,7)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath12)" width="270" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAAAzCAYAAABmIuZiAAADHUlEQVR4Xu3d2U4V&#10;QRSF4Q2ICqigyOCMGBXneUYFh/d/Jfef6g5H4k1xqk4i+Vfy5VxZpRe1endfWBHG&#10;GGOMMcYYY4wxxhhjjDGmXeYG8xMWGplcE+NekmaneViUA34mnU3nOmHtxQF7SZqN&#10;yYd4kxIZS4NDvZwuptW01hhrXoqy/oW0EmU/SX0tpfNRHt48tKcuj8nS4DBfSVvp&#10;erqZbg2/LdyIsu522kwb6aqk7tbT5SgPbopkLI8Th+JgjGExSoPDvZsepsfpSSOs&#10;9SjtpQfpfro3YD9J/exEGQJ4aDP9M4Fw7k88dczH0bTBpMEmT9Pr9D59aIS18C69&#10;ibL+q8FLSd28SM+iPLg531tRPhdw7jn/Jwp/kPceRhheI5g0ONSf07f0ffht5Wva&#10;H3wZsJekPj5FeXhzrikPPhusRTn3UxcHHy5ZkFcKJgMO+Y/0sxHWGh1KmpmDKA9s&#10;yoPJ406UzxJ8LJ26OGgg3oH4HsEGTBq/0u/ht6fjJSOpHR7WnGcmD15bdqJhcfxr&#10;4mBTD7b0f7M4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWz&#10;OCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFXrWhz+Z8XS6dS1OGY9&#10;cfCPkdTfYZTz/DE6FQfXP3JhC7et7UfZcNy4pYMBLSipL0qDi88YCLil8XaUe2Sb&#10;FMd4kxv3unItI+3EJS5sym8LlBEmb29jfJLUD2eZ0uBc70UZEJrc5DbeHbuZ7kb5&#10;zsEmTB5syG8Lb+Pve2PHey0l9fM8yqRBaXC+OedT3x07F+XWam6vZnxh6mBxJg9e&#10;W/jmwW8L/MUfxtFN9btR9pLUz06Uax/5hsmF00wbSzHlbfX8wYUo7bMSpTxopGtR&#10;RpqWKKXtKH/5jXQ1rUvqjo+hFAaTBqWxGFNMG2Mmy4NFeW1hA757rDbCWmBdCmo5&#10;yl6S+uNDKN80OONMGpTGiaeNybAIi7EobcQGrbEu2IOiGrGvpNloUhjHw6K9GWOM&#10;McYYY4wxxhhjjDHGGGPMKckfuFGv0cj5VlIAAAAASUVORK5CYII=" height="51" preserveAspectRatio="none"/>
</g>
<g transform="matrix(1,0,0,1,-197,-166)" fill-opacity="0.902" fill="rgb(255,255,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,255,255)" stroke-opacity="0.902">
<rect x="629.5" width="249" height="30" y="181" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M654.4 181 L629.5 181 L629.5 211 L654.4 211" clip-path="url(#clipPath2)"/>
<text x="635.5" font-size="10px" y="193.8906" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">Simple scripts, executed early, also used by core </text>
<text x="635.5" font-size="10px" y="205.668" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">components to handle early-boot requirements</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,537,56.25)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath13)" width="270" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAAAzCAYAAABmIuZiAAADHUlEQVR4Xu3d2U4V&#10;QRSF4Q2ICqigyOCMGBXneUYFh/d/Jfef6g5H4k1xqk4i+Vfy5VxZpRe1endfWBHG&#10;GGOMMcYYY4wxxhhjjDGmXeYG8xMWGplcE+NekmaneViUA34mnU3nOmHtxQF7SZqN&#10;yYd4kxIZS4NDvZwuptW01hhrXoqy/oW0EmU/SX0tpfNRHt48tKcuj8nS4DBfSVvp&#10;erqZbg2/LdyIsu522kwb6aqk7tbT5SgPbopkLI8Th+JgjGExSoPDvZsepsfpSSOs&#10;9SjtpQfpfro3YD9J/exEGQJ4aDP9M4Fw7k88dczH0bTBpMEmT9Pr9D59aIS18C69&#10;ibL+q8FLSd28SM+iPLg531tRPhdw7jn/Jwp/kPceRhheI5g0ONSf07f0ffht5Wva&#10;H3wZsJekPj5FeXhzrikPPhusRTn3UxcHHy5ZkFcKJgMO+Y/0sxHWGh1KmpmDKA9s&#10;yoPJ406UzxJ8LJ26OGgg3oH4HsEGTBq/0u/ht6fjJSOpHR7WnGcmD15bdqJhcfxr&#10;4mBTD7b0f7M4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWz&#10;OCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFXrWhz+Z8XS6dS1OGY9&#10;cfCPkdTfYZTz/DE6FQfXP3JhC7et7UfZcNy4pYMBLSipL0qDi88YCLil8XaUe2Sb&#10;FMd4kxv3unItI+3EJS5sym8LlBEmb29jfJLUD2eZ0uBc70UZEJrc5DbeHbuZ7kb5&#10;zsEmTB5syG8Lb+Pve2PHey0l9fM8yqRBaXC+OedT3x07F+XWam6vZnxh6mBxJg9e&#10;W/jmwW8L/MUfxtFN9btR9pLUz06Uax/5hsmF00wbSzHlbfX8wYUo7bMSpTxopGtR&#10;RpqWKKXtKH/5jXQ1rUvqjo+hFAaTBqWxGFNMG2Mmy4NFeW1hA757rDbCWmBdCmo5&#10;yl6S+uNDKN80OONMGpTGiaeNybAIi7EobcQGrbEu2IOiGrGvpNloUhjHw6K9GWOM&#10;McYYY4wxxhhjjDHGGGPMKckfuFGv0cj5VlIAAAAASUVORK5CYII=" height="51" preserveAspectRatio="none"/>
</g>
<g transform="matrix(1,0,0,1,-197,-166)" fill-opacity="0.902" fill="rgb(255,255,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,255,255)" stroke-opacity="0.902">
<rect x="742" width="249" height="30" y="230.25" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M766.9 230.25 L742 230.25 L742 260.25 L766.9 260.25" clip-path="url(#clipPath2)"/>
<text x="748" font-size="10px" y="243.1406" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">Structures pluggable core services, devices and </text>
<text x="748" font-size="10px" y="254.918" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">offers configure event handlers</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,651.9,105.5)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath14)" width="270" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAAAzCAYAAABmIuZiAAADHUlEQVR4Xu3d2U4V&#10;QRSF4Q2ICqigyOCMGBXneUYFh/d/Jfef6g5H4k1xqk4i+Vfy5VxZpRe1endfWBHG&#10;GGOMMcYYY4wxxhhjjDGmXeYG8xMWGplcE+NekmaneViUA34mnU3nOmHtxQF7SZqN&#10;yYd4kxIZS4NDvZwuptW01hhrXoqy/oW0EmU/SX0tpfNRHt48tKcuj8nS4DBfSVvp&#10;erqZbg2/LdyIsu522kwb6aqk7tbT5SgPbopkLI8Th+JgjGExSoPDvZsepsfpSSOs&#10;9SjtpQfpfro3YD9J/exEGQJ4aDP9M4Fw7k88dczH0bTBpMEmT9Pr9D59aIS18C69&#10;ibL+q8FLSd28SM+iPLg531tRPhdw7jn/Jwp/kPceRhheI5g0ONSf07f0ffht5Wva&#10;H3wZsJekPj5FeXhzrikPPhusRTn3UxcHHy5ZkFcKJgMO+Y/0sxHWGh1KmpmDKA9s&#10;yoPJ406UzxJ8LJ26OGgg3oH4HsEGTBq/0u/ht6fjJSOpHR7WnGcmD15bdqJhcfxr&#10;4mBTD7b0f7M4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFWz&#10;OCRVszgkVbM4JFWzOCRVszgkVbM4JFWzOCRVszgkVbM4JFXrWhz+Z8XS6dS1OGY9&#10;cfCPkdTfYZTz/DE6FQfXP3JhC7et7UfZcNy4pYMBLSipL0qDi88YCLil8XaUe2Sb&#10;FMd4kxv3unItI+3EJS5sym8LlBEmb29jfJLUD2eZ0uBc70UZEJrc5DbeHbuZ7kb5&#10;zsEmTB5syG8Lb+Pve2PHey0l9fM8yqRBaXC+OedT3x07F+XWam6vZnxh6mBxJg9e&#10;W/jmwW8L/MUfxtFN9btR9pLUz06Uax/5hsmF00wbSzHlbfX8wYUo7bMSpTxopGtR&#10;RpqWKKXtKH/5jXQ1rUvqjo+hFAaTBqWxGFNMG2Mmy4NFeW1hA757rDbCWmBdCmo5&#10;yl6S+uNDKN80OONMGpTGiaeNybAIi7EobcQGrbEu2IOiGrGvpNloUhjHw6K9GWOM&#10;McYYY4wxxhhjjDHGGGPMKckfuFGv0cj5VlIAAAAASUVORK5CYII=" height="51" preserveAspectRatio="none"/>
</g>
<g transform="matrix(1,0,0,1,-197,-166)" fill-opacity="0.902" fill="rgb(255,255,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,255,255)" stroke-opacity="0.902">
<rect x="856.9" width="249" height="30" y="279.5" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M881.8 279.5 L856.9 279.5 L856.9 309.5 L881.8 309.5" clip-path="url(#clipPath2)"/>
<text x="862.9" font-size="10px" y="298.2793" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">Regular service startup point</text>
</g>
<g fill="url(#linearGradient10)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke="url(#linearGradient10)">
<path d="M222.5 480.5 L855.5 480.5 L865.5 500.5 L855.5 520.5 L222.5 520.5 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M222.5 480.5 L855.5 480.5 L865.5 500.5 L855.5 520.5 L222.5 520.5 Z" clip-path="url(#clipPath2)"/>
<text x="510.0083" font-size="10px" y="504.2793" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">bootup stage</text>
</g>
<g fill="url(#linearGradient11)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke="url(#linearGradient11)">
<path d="M851.7115 480.5 L1053.4615 480.5 L1053.4615 520.5 L851.7115 520.5 L861.7115 500.5 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M851.7115 480.5 L1053.4615 480.5 L1053.4615 520.5 L851.7115 520.5 L861.7115 500.5 Z" clip-path="url(#clipPath2)"/>
<text x="916.5855" font-size="10px" y="504.2793" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">running stage</text>
</g>
<g fill="url(#linearGradient12)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke="url(#linearGradient12)">
<path d="M1037.5 480.5 L1206.5 480.5 L1206.5 520.5 L1037.5 520.5 L1047.5 500.5 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M1037.5 480.5 L1206.5 480.5 L1206.5 520.5 L1037.5 520.5 L1047.5 500.5 Z" clip-path="url(#clipPath2)"/>
<text x="1080.8062" font-size="10px" y="504.2793" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">shutdown stage</text>
</g>
<g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,821.8,155)" image-rendering="optimizeQuality">
<image x="0" y="0" clip-path="url(#clipPath15)" width="200" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAzCAYAAADSDUdEAAADC0lEQVR4Xu3dV2/U&#10;QBSG4ZNCCyWhJBA6ARJ67y0hwP//S5xXYysWika79q4jovdIj3yzHu/FfDPjm+MI&#10;y7Isy7Isy7Isy7IsyzoutdBY7FiaQvc+tONJR2GmxYBM8uV0Mp0agPtxIsp40pi6&#10;C/ZMwtKGg0m9ks6n1bTWA/ddiDLGuXQ2ypjSWM6k01HmM4Fpg9KruuFgQl9KV9P1&#10;dDPdaq6TutHcey1tpPV0RRoRc5jFmkWaoLQh6VUEhAFIHgMzwbfSTnqSnk6B3z9O&#10;j9J2epjuNxhTmrd76U6UxZrFmdMMIWET6LWLLMbB7sHOwUOepTfpQ/o4BX6P9+lt&#10;lDFeN15JI3gZZf6ywN+OsqNwzOd9uHdAeLEmaRyNGJiJ/SX9SLvNdRrf07fG1wbj&#10;SfP2OcoCTVA4wWxGOWqxCQwKCC/XbEsck9gFmOj76dcU+H3rp3QEWNBZkN9FOe7z&#10;ysDcHhyQtSgv5LxLcFziQb/Tn+Y61L9hkuaBkHCCYZFnsWfRn0lADttBeKCTW/8T&#10;AyJVGBCpwoBIFQZEqjAgUoUBkSoMiFRhQKQKAyJVGBCpwoBIFQZEqjAgUoUBkSoM&#10;iFRhQKQKAyJVGBCpwoBIFXMLiE0bdBzMLSDz2EH2pZHtRenHRm+smQeEHkL0EmJw&#10;HkIaeSjXae11sBtJY2D3oIEcnT1pgcucpini4IC0nRW3o7QK/RTlYewkXCdFsNDt&#10;pki3O2kMvB7QNO5FehCliTqdFQe1HiVd9ObdiNL8l/cQQsJOwnGL66T4c92+vG2/&#10;VGkMz6PMXxZ63qnb3rzL0TMg3MTNfFPhYpRdhJDwAI5bnOO4ToptbScOOrtvRRlP&#10;GsPdKE2rmcfrUU5GnJCWomctxMH3QUgaIWEn2YxyfpsWf4x76RTPHyTBl6WR8AkP&#10;5vBqlFNR+30Q5nnv6oaEnYSBObeRPh40KX7f/brUSoMxpTEQCLBr8N7BvOY1YnAR&#10;EgYibQxMWPrg3vbbhPy5FmNLY2JOD9o5Dqt20KEsy7Isy7Isy7Isy7Isy7KsmdVf&#10;Bs2NO86RzTgAAAAASUVORK5CYII=" height="51" preserveAspectRatio="none"/>
</g>
<g transform="matrix(1,0,0,1,-197,-166)" fill-opacity="0.902" fill="rgb(255,255,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,255,255)" stroke-opacity="0.902">
<rect x="1026.8" width="179.7" height="30" y="329" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M1044.77 329 L1026.8 329 L1026.8 359 L1044.77 359" clip-path="url(#clipPath2)"/>
<text x="1032.8" font-size="10px" y="341.8906" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">integration points for (device </text>
<text x="1032.8" font-size="10px" y="353.668" clip-path="url(#clipPath2)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve">related) events</text>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path fill="none" d="M252.5125 414.5 L274.5039 414.5" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-197,-166)" stroke-linecap="butt">
<path d="M282.5039 414.5 L270.5039 409.5 L273.5039 414.5 L270.5039 419.5 Z" stroke="none" clip-path="url(#clipPath2)"/>
<path fill="none" d="M391.4666 414.5 L413.4743 414.5" clip-path="url(#clipPath2)"/>
<path d="M421.4743 414.5 L409.4743 409.5 L412.4743 414.5 L409.4743 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M530.4666 414.5 L552.4743 414.5" clip-path="url(#clipPath2)"/>
<path d="M560.4743 414.5 L548.4743 409.5 L551.4743 414.5 L548.4743 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M669.4666 414.5 L691.4743 414.5" clip-path="url(#clipPath2)"/>
<path d="M699.4743 414.5 L687.4743 409.5 L690.4743 414.5 L687.4743 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M808.4626 414.5 L830.5022 414.5" clip-path="url(#clipPath2)"/>
<path d="M838.5022 414.5 L826.5022 409.5 L829.5022 414.5 L826.5022 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M868.5125 414.5 L890.5039 414.5" clip-path="url(#clipPath2)"/>
<path d="M898.5039 414.5 L886.5039 409.5 L889.5039 414.5 L886.5039 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M1007.4626 414.5 L1029.5022 414.5" clip-path="url(#clipPath2)"/>
<path d="M1037.5022 414.5 L1025.5022 409.5 L1028.5022 414.5 L1025.5022 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M1067.5125 414.5 L1089.5039 414.5" clip-path="url(#clipPath2)"/>
<path d="M1097.5039 414.5 L1085.5039 409.5 L1088.5039 414.5 L1085.5039 419.5 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" stroke-dasharray="6,2" d="M499.2189 378.519 L617 196 L629.4758 196" clip-path="url(#clipPath2)"/>
<path fill="none" stroke-dasharray="6,2" d="M638.6038 378.5096 L726 245.25 L742.0189 245.25" clip-path="url(#clipPath2)"/>
<path fill="none" stroke-dasharray="6,2" d="M779.5008 378.4941 L838.9888 294.5 L856.8945 294.5" clip-path="url(#clipPath2)"/>
<path fill="none" stroke-dasharray="6,2" d="M977.6392 378.5271 L1001.2881 344 L1026.777 344" clip-path="url(#clipPath2)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 47 KiB