David Hendricks submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Edward O'Callaghan: Looks good to me, approved
ubertest: Add blackbox test uber-script

This modifies CB:23025 further to work with upstream as it is now,
without the syntax changes in the patch chain. I also gave it a new
name since this script is, well, uber.

Since flashrom currently only supports reading/writing ROM-sized files
we can't easily determine a targeted region offset and size except
when a layout file is used. Therefore, some extra arithmetic is needed
in the partial write test and the only modes allowed are clobber mode
and layout mode.

A few other changes:
- Update paths and script name
- Remove write-protect testing support
- Use ROM-sized files only, no region-sized files
- Return error if flashmap or ifd mode are used

Documentation is ported from https://goo.gl/3jNoL7 into a markdown
file and accompanying SVGs. Minor changes were made for clarity and
formatting, and references to write protect testing have been removed
for the time being.

Tested using a Raspberry Pi with a W25Q16

Change-Id: I1af55d5088c54ee33853009797adbd535a506b49
Signed-off-by: David Hendricks <david.hendricks@gmail.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/38788
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
---
A util/ubertest/README.md
A util/ubertest/cmd.sh
A util/ubertest/drawing_external_programmer_external_rom.svg
A util/ubertest/drawing_external_programmer_local_dut.svg
A util/ubertest/drawing_external_programmer_remote_dut.svg
A util/ubertest/drawing_local_programmer_is_dut.svg
A util/ubertest/drawing_remote_host_is_remote_dut.svg
A util/ubertest/ubertest.sh
8 files changed, 2,086 insertions(+), 0 deletions(-)

diff --git a/util/ubertest/README.md b/util/ubertest/README.md
new file mode 100644
index 0000000..727d6e0
--- /dev/null
+++ b/util/ubertest/README.md
@@ -0,0 +1,175 @@
+# Ubertest
+## Intro / Features
+
+Ubertest is a blackbox regression test for flashrom. It requires two flashrom binaries, one of which is assumed to be an older or stable version and the other which is the new version being tested.
+
+Tests can be run on the local host or on a remote machine (via SSH). Additionally, the ubertest script supports using a secondary programmer to check the result of the primary programmer.
+
+Ubertest supports multiple modes of operation which allow regions to be flashed selectively based on presence of a layout file or integrated layout mapping:
+- Clobber mode: The entire ROM can be used for testing.
+- Layout mode: Target a region using a flashrom layout file.
+- Descriptor mode: Target a region using an Intel flash descriptor (Intel systems)
+- Flashmap mode: Target a region using a flashmap
+
+The tests assume that we care about 4KiB and 64KiB sector/block sizes. Some large ROMs available today only support 64KiB block erase operations, however testing on large regions can be impractical for many devices. The `--small-region` option may be used to restrict tests to using a smaller amount of flash memory (currently 16KiB).
+
+### Terminology
+
+- DUT: Device under test
+- Local host: The machine which is running the script. It might also be the DUT.
+- Remote machine: DUT controlled via SSH with primary programmer.
+Programmers
+ - Primary programmer: The programmer which will be tested using the new version of flashrom.
+ - Secondary programmer: An optional programmer which will be used along with the old version of flashrom to verify the result of the primary programmer. This is generally assumed to be an external programmer connected to the local host e.g. via USB or serial. It may also be a secondary internal interface, for example if the DUT has a SPI ROM and both linux_spi and linux_mtd support and the developer wishes to test one against the other.
+
+## Basic Usage
+
+For a full list of options use `-h/--help`.
+
+### Mandatory Options
+
+`-n/--new <path>`: New (unstable) flashrom binary to test. Also see Note 1 below.
+
+`-t/--type <type>`: Type of test to run:
+- Single test: A single test of the specified mode will be run. If this type is selected, then a mode must also be specified.
+- Endurance test: The ROM will be erased/written with random content until the first failure.
+
+`-p/--primary-programmer`: Primary programmer options, e.g. “internal”, “ch341a_spi”, etc.
+
+**Note 1**: When a remote host is used these options refer to files that are on the remote host, not the local host. See Testing on a Remote Host/DUT below.
+
+**Note 2**: The script will default to using ${PATH}/flashrom if no old (presumably stable) flashrom binary is specified using -o/--old.
+
+### Other Options
+
+`-b/--backup-image`: Backup image that will be flashed to the target ROM unconditionally when the script is done. If unspecified, the script will read the ROM first using the stable flashrom binary to obtain a backup image. If remote host is used, backup image will be copied to local host’s temporary directory in case something goes terribly wrong. Also see Note 1 below.
+
+`-o/--old <path>`: Old (stable) flashrom binary to test.
+
+`--custom-hooks`: This allows the user to specify a script containing functions which are run at certain points during ubertest. These functions are intended to adapt the test script to the user’s environment. For example, the user can supply their own `preflash_hook()` and `postflash_hook()` to toggle power enable for the flash chip, instruct other devices with access to the flash chip to suspend access, etc.
+
+`--local-flashrom`: If a remote host and a secondary programmer are used, then a local copy of flashrom is used to control the secondary programmer. This is because the “old” and “new” binaries reside on the remote host, and the secondary programmer is controlled from the local host. This defaults to `sudo which flashrom`.
+
+`-m/--mode <mode>`: Mode to operate in (Mandatory if single test type is chosen):
+- Clobber mode: Any portion of the ROM may be used for testing.
+- Layout mode: Portions specified using a layout file will be erased/written. A layout file must be provided using -l/--layout-file option. The user may specify a region to use for testing with the --layout-region option.
+- Descriptor mode (Intel systems only): Flashrom will read the flash descriptor from the DUT’s firmware ROM to determine which region to write to. The user may specify a region to use for testing with the --descriptor-region option.
+- Flashmap mode: Flashrom will read the flashmap from the DUT’s firmware ROM to determine which region to write to. The user may specify a region to use for testing with the --flashmap-region option.
+
+`--no-clean`: Do not remove temporary files if the script succeeds. Temporary files remain in the event of failure whether or not this option is used. This option is intended for developers for debugging the script.
+
+`--skip-consistency-check`: By default, the script will read the ROM twice as a sanity check for consistent readings. This option is intended for developers for faster iteration, but should not be used in most cases.
+
+`--small-region`: Skip parts of the tests that require a large (>16KiB currently ) region to work with. This is useful for small or densely packed firmware ROMs (especially those on microcontrollers/ECs) that do not have space for the default set of tests which may assume minimum eraseblock size of 64KB.
+
+`-v/--voltage`: Supply voltage (in millivolts) for chip.
+
+## Testing on a Remote Host/DUT
+
+Ubertest supports testing on a remote host via SSH. A remote host is specified by IP address or hostname using the `-r/--remote-host` option. If used, the remote host becomes the DUT. The remote host should accept non-interactive root login from the local host.
+
+Remote testing modifies the meaning of arguments supplied to some options. In particular, paths specified to options such as `-n`, `-o`, `-l`, and `-b` will refer to files on the remote host’s filesystem instead of the local host’s filesystem.
+
+To use a remote host as your DUT, use the following options:
+
+`-r/--remote-host <host>`: The remote host by IP address or hostname.
+
+`--ssh-port <port>`: Specify SSH port to use (default: 22).
+
+## Testing With a Secondary Programmer
+
+Ubertest can be used with up to two programmers. The secondary programmer is used with the old/stable version of flashrom to verify the primary programmer and new version of flashrom at each step.
+
+TODO: Change “secondary programmer” to “external programmer”? That could simplify the script significantly, especially in cases where a remote host + external programmer is used.
+
+To use a secondary programmer, use the following options:
+`-s/--secondary-programmer <parameters>`: Specify the secondary programmer the same way you do with -p/--primary-programmer.
+
+## Test methods / examples
+
+The purpose of ubertest is to automate a few simple tests in a way that can be invoked in a variety of environments (see Configurations / Setup).
+
+The “single” mode tests boils down to:
+- Read the targeted section of the ROM twice to check for consistency.
+- Test 4KiB block write capabilities:
+- Write the lower half of a block and ensuring that data in the upper half is restored to its original state.
+- Write over the boundary of two blocks, ensuring the data outside the targeted region is restored to its original state.
+- Write the upper half of a block, ensuring that data in the lower half restored to its original state
+- Write a full block.
+- Repeat step 2 for 64KiB blocks unless `--small-region` is used.
+
+### Configurations / Setup
+There are a few possible setups (shown below) involving a local machine, a remote machine, an external programmer, and the ROM to be tested. For the example commands in each setup the command takes a set of options, `MY_OPTS`. Depending on the type of test and potentially the mode, `MY_OPTS` will be different. To get the correct `MY_OPTS` for a specific test (and mode), see _Examples (Basic)_ and _Examples (Advanced)_ below. In general, any test type/mode can be run in any configuration.
+
+#### Targeting external ROM connected to an external programmer
+
+`flashrom$ sh util/ubertest/ubertest.sh -p ext_prog $MY_OPTS`
+
+![external programmer, external ROM](drawing_external_programmer_external_rom.svg)
+
+#### Targeting local host’s ROM using internal programmer
+
+`flashrom$ sh util/ubertest/ubertest.sh -p internal $MY_OPTS`
+
+![local programmer is dut](drawing_local_programmer_is_dut.svg)
+
+#### Targeting remote host's ROM using its internal programmer
+
+`flashrom$ sh util/ubertest/ubertest.sh -r remote_host -p internal $MY_OPTS`
+
+![remote host is remote dut](drawing_remote_host_is_remote_dut.svg)
+
+#### Targeting local host’s ROM using external programmer
+
+`flashrom$ sh util/ubertest/ubertest.sh -p internal -s ext_prog $MY_OPTS`
+
+![external programmer targeting local dut](drawing_external_programmer_local_dut.svg)
+
+#### Targeting remote host's ROM using its internal programmer, and checking the result using an external (secondary) programmer
+`flashrom # sh util/ubertest/ubertest.sh -p internal -s ext_prog -r remote_host $MY_OPTS`
+
+In this configuration the "old" and "new" flashrom binaries will be on the remote host. However in order to control the external programmer that will be used to check the result, a local flashrom binary must be supplied using `--local-flashrom`.
+
+![external programmer targeting external dut](drawing_external_programmer_remote_dut.svg)
+
+### Examples (Basic)
+#### Single Test
+
+For each region layout mode, we will assume a different set of common options in `MY_OPTS`. For details on the possible configurations, as well as their corresponding example commands, see Configurations / Setup above.
+
+#### Clobber Mode
+
+`MY_OPTS=”-n new_flashrom -o old_flashrom -t single -m clobber”`
+
+The clobber mode test will clobber (no surprise there!) the ROM with random content. If this operation is successful, then a partial write test will be run on the entire chip in order to test corner cases.
+
+#### Layout Mode
+
+`MY_OPTS=”-n new_flashrom -o old_flashrom -t single -m layout -l layout.txt -layout-region RW”`
+
+#### Descriptor Mode
+
+`MY_OPTS=”-n new_flashrom -o old_flashrom -t single -m descriptor --descriptor-region bios”`
+
+#### Flashmap Mode
+
+`MY_OPTS=”-n new_flashrom -o old_flashrom -t single -m flashmap --flashmap-region RW_SECTION”`
+
+### Examples (Advanced)
+
+For the following test types, we will assume the set of common options `MY_OPTS`. For details on each configuration, as well as the corresponding example command, see Configurations / Setup above.
+
+##### Endurance Test
+`MY_OPTS=”-n new_flashrom -o old_flashrom -t endurance”`
+
+The endurance test will repeatedly run single Clobber Mode tests until the first failure. This is intended to test the capabilities of the flash chip. It is important to note that a full test can take a while (potentially more than a week or two) to complete. The average time for one iteration of the endurance test using a remote host with a SPI ROM operating at 50MHz is around 100 seconds. This process will likely take longer for boards with larger chip sizes, and also longer for configurations that use an external programmer. At 1 iteration every 100 seconds, which is a relatively high speed, around 6048 iterations will be run in a week (probably a little less than that because the time spent between iterations will accumulate to a significant amount).
+
+
+## Document Information
+Authors: David Hendricks <dhendrix@chromium.org>, Souvik Ghosh
+
+Original document short URL: <https://goo.gl/3jNoL7>
+
+Original document long URL: <https://docs.google.com/document/d/1IoBR7rHXJFiahC6dGnNKqaNFfg-q89_NMHuFyiJ7JnA/edit?usp=sharing>
+
+This document is licensed under a Creative Commons Attribution 3.0 Unported License. Feel free to copy, modify, and distribute this document however you see fit with attribution to the Flashrom Community.
diff --git a/util/ubertest/cmd.sh b/util/ubertest/cmd.sh
new file mode 100644
index 0000000..1d1c47a
--- /dev/null
+++ b/util/ubertest/cmd.sh
@@ -0,0 +1,137 @@
+#!/bin/sh
+#
+# This file is part of the flashrom project. It is derived from
+# board_status.sh in coreboot.
+#
+# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2014 Sage Electronic Engineering, LLC.
+
+USE_CUSTOM_HOOKS=0
+if [ -n "$CUSTOM_HOOKS_FILENAME" ]; then
+ USE_CUSTOM_HOOKS=1
+ . "$CUSTOM_HOOKS_FILENAME"
+ if [ $? -ne 0 ]; then
+ echo "Failed to source custom hooks file."
+ exit $EXIT_FAILURE
+ fi
+
+ if ! custom_hook_sanity_check; then
+ echo "Failed to run sanity check for custom hooks."
+ exit $EXIT_FAILURE
+ fi
+fi
+
+# test a command
+#
+# $1: 0 ($LOCAL) to run command locally,
+# 1 ($REMOTE) to run remotely if remote host defined
+# $2: command to test
+# $3: 0 ($FATAL) Exit with an error if the command fails
+# 1 ($NONFATAL) Don't exit on command test failure
+test_cmd()
+{
+ local rc
+ local cmd__="$(echo $2 | cut -d ' ' -f -1)"
+ local args="$(echo $2 | cut -d ' ' -f 2-)"
+
+ if [ -e "$cmd__" ]; then
+ return
+ fi
+
+ if [ "$1" -eq "$REMOTE" ] && [ -n "$REMOTE_HOST" ]; then
+ ssh $REMOTE_PORT_OPTION root@${REMOTE_HOST} command -v "$cmd__" $args > /dev/null 2>&1
+ rc=$?
+ else
+ command -v "$cmd__" $args >/dev/null 2>&1
+ rc=$?
+ fi
+
+ if [ $rc -eq 0 ]; then
+ return 0
+ fi
+
+ if [ "$3" = "1" ]; then
+ return 1
+ fi
+
+ echo "$2 not found"
+ exit $EXIT_FAILURE
+}
+
+# Same args as cmd() but with the addition of $4 which determines if the
+# command should be totally silenced or not.
+_cmd()
+{
+ local silent=$4
+ local rc=0
+
+ if [ -n "$3" ]; then
+ pipe_location="${3}"
+ else
+ pipe_location="/dev/null"
+ fi
+
+ if [ $1 -eq $REMOTE ] && [ -n "$REMOTE_HOST" ]; then
+ if [ $silent -eq 0 ]; then
+ ssh $REMOTE_PORT_OPTION "root@${REMOTE_HOST}" "$2" > "$pipe_location" 2>/dev/null
+ rc=$?
+ else
+ ssh $REMOTE_PORT_OPTION "root@${REMOTE_HOST}" "$2" >/dev/null 2>&1
+ rc=$?
+ fi
+ else
+ if [ $USE_CUSTOM_HOOKS -eq 1 ]; then
+ preflash_hook $1 "$2" "$3" $4
+ fi
+
+ if [ $silent -eq 0 ]; then
+ $SUDO_CMD $2 > "$pipe_location" 2>/dev/null
+ rc=$?
+ else
+ $SUDO_CMD $2 >/dev/null 2>&1
+ rc=$?
+ fi
+
+ if [ $USE_CUSTOM_HOOKS -eq 1 ]; then
+ postflash_hook $1 "$2" "$3" $4
+ fi
+ fi
+
+ return $rc
+}
+
+# run a command
+#
+# $1: 0 ($LOCAL) to run command locally,
+# 1 ($REMOTE) to run remotely if remote host defined
+# $2: command
+# $3: filename to direct output of command into
+cmd()
+{
+ _cmd $1 "$2" "$3" 0
+
+ if [ $? -eq 0 ]; then
+ return
+ fi
+
+ echo "Failed to run \"$2\", aborting"
+ rm -f "$3" # don't leave an empty file
+ return $EXIT_FAILURE
+}
+
+# run a command silently
+#
+# $1: 0 ($LOCAL) to run command locally,
+# 1 ($REMOTE) to run remotely if remote host defined
+# $2: command
+scmd()
+{
+ _cmd $1 "$2" "" 1
+
+ if [ $? -eq 0 ]; then
+ return
+ fi
+
+ echo "Failed to run \"$2\", aborting"
+ return $EXIT_FAILURE
+}
diff --git a/util/ubertest/drawing_external_programmer_external_rom.svg b/util/ubertest/drawing_external_programmer_external_rom.svg
new file mode 100644
index 0000000..7af3157
--- /dev/null
+++ b/util/ubertest/drawing_external_programmer_external_rom.svg
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 611.22791 199.54794"
+ stroke-miterlimit="10"
+ id="svg3802"
+ sodipodi:docname="drawing_external_programmer.svg"
+ width="611.22791"
+ height="199.54794"
+ style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata3808">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3806" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1295"
+ inkscape:window-height="1058"
+ id="namedview3804"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.1125147"
+ inkscape:cx="256.65593"
+ inkscape:cy="88.451203"
+ inkscape:window-x="2121"
+ inkscape:window-y="731"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg3802" />
+ <clipPath
+ id="p.0">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path3761"
+ inkscape:connector-curvature="0"
+ style="clip-rule:nonzero" />
+ </clipPath>
+ <g
+ clip-path="url(#p.0)"
+ id="g3800"
+ transform="translate(-179.7729,-178.43253)">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path3764"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path3766"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path3768"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 205,188 h 142.99213 v 54.99213 H 205 Z"
+ id="path3770"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 215.35938,214.92 v -13.35938 h 1.78125 v 11.78125 h 6.5625 V 214.92 Z m 9.64134,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 15.61009,1.29687 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 9.32813,2.35938 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 4.15697,4.85938 v -13.35938 h 1.64061 V 214.92 Z m 9.37499,0 v -9.67188 h 1.46875 v 1.35938 q 0.45312,-0.71875 1.20312,-1.14063 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 214.92 h -1.64062 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70313 -0.42187,-0.26562 -0.98437,-0.26562 -1.01563,0 -1.6875,0.6875 -0.67188,0.67187 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85938,1.0625 -0.25,0.70313 -0.25,2.03125 V 214.92 Z m 21.85333,-1.1875 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 10.51633,1.3125 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 3.01563,3.54688 v -13.35938 h 1.64062 v 4.79688 q 1.14063,-1.32813 2.89063,-1.32813 1.07812,0 1.85937,0.42188 0.79688,0.42187 1.14063,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64063 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51562,-0.5625 -0.71875,0 -1.35938,0.39063 -0.64062,0.375 -0.92187,1.01562 -0.26563,0.64063 -0.26563,1.78125 V 214.92 Z m 10.3757,-11.46875 v -1.89063 h 1.64062 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64062 V 214.92 Z m 4.14483,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82813 0.375,0.5 0.51563,1.20312 0.0937,0.45313 0.0937,1.59375 V 214.92 h -1.64063 v -5.89063 q 0,-1 -0.20312,-1.48437 -0.1875,-0.5 -0.67188,-0.79688 -0.48437,-0.29687 -1.14062,-0.29687 -1.04688,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 214.92 Z m 17.00074,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.29688 -1.23438,-1.3125 -1.23438,-3.67187 0,-2.45313 1.25,-3.79688 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.32813 1.23437,1.3125 1.23437,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.48438 1.01563,-1.51563 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76562,0.75 -0.84375,2.01562 z"
+ id="path3772"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 221,252 h 110.99213 v 68 H 221 Z"
+ id="path3774"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 640.0079,245.49606 h 142.99213 v 60 H 640.0079 Z"
+ id="path3776"
+ inkscape:connector-curvature="0"
+ style="fill:#fff2cc;fill-rule:evenodd" />
+ <path
+ d="m 640.0079,245.49606 h 142.99213 v 60 H 640.0079 Z"
+ id="path3778"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 674.49603,254 h 71.49609 v 42.99213 h -71.49609 z"
+ id="path3780"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 684.9648,280.91998 V 267.5606 h 5.92187 q 1.78125,0 2.70313,0.35938 0.9375,0.35937 1.48437,1.28125 0.5625,0.90625 0.5625,2.01562 0,1.40625 -0.92187,2.39063 -0.92188,0.96875 -2.84375,1.23437 0.70312,0.34375 1.07812,0.67188 0.76563,0.70312 1.45313,1.76562 l 2.32812,3.64063 h -2.21875 l -1.76562,-2.78125 q -0.78125,-1.20313 -1.28125,-1.82813 -0.5,-0.64062 -0.90625,-0.89062 -0.39063,-0.26563 -0.79688,-0.35938 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45313 h 3.79688 q 1.21875,0 1.89062,-0.25 0.6875,-0.26562 1.04688,-0.8125 0.35937,-0.54687 0.35937,-1.1875 0,-0.95312 -0.6875,-1.5625 -0.6875,-0.60937 -2.1875,-0.60937 h -4.21875 z m 11.14484,0.95313 q 0,-3.32813 1.78125,-5.20313 1.78125,-1.89062 4.60938,-1.89062 1.84375,0 3.32812,0.89062 1.48438,0.875 2.26563,2.46875 0.78125,1.57813 0.78125,3.57813 0,2.03125 -0.82813,3.64062 -0.8125,1.59375 -2.3125,2.42188 -1.5,0.82812 -3.25,0.82812 -1.875,0 -3.35937,-0.90625 -1.48438,-0.92187 -2.25,-2.5 -0.76563,-1.57812 -0.76563,-3.32812 z m 1.8125,0.0156 q 0,2.42188 1.29688,3.8125 1.29687,1.39063 3.26562,1.39063 2,0 3.28125,-1.40625 1.28125,-1.40625 1.28125,-3.98438 0,-1.625 -0.54687,-2.84375 -0.54688,-1.21875 -1.60938,-1.875 -1.0625,-0.67187 -2.375,-0.67187 -1.89062,0 -3.25,1.29687 -1.34375,1.28125 -1.34375,4.28125 z m 13.18329,6.48438 V 267.5606 h 2.65625 l 3.15625,9.45313 q 0.4375,1.32812 0.64062,1.98437 0.23438,-0.73437 0.70313,-2.14062 l 3.20312,-9.29688 h 2.375 v 13.35938 H 723.9023 V 269.7481 l -3.875,11.17188 h -1.59375 l -3.85938,-11.375 v 11.375 z"
+ id="path3782"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 425,251.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66852,0 7.18683,1.45733 9.78089,4.0514 2.59405,2.59405 4.05139,6.11235 4.05139,9.78091 v 55.32751 c 0,7.63938 -6.19294,13.83231 -13.83228,13.83231 H 438.83231 C 431.19293,321.00787 425,314.81494 425,307.17556 Z"
+ id="path3784"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="m 425,251.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66852,0 7.18683,1.45733 9.78089,4.0514 2.59405,2.59405 4.05139,6.11235 4.05139,9.78091 v 55.32751 c 0,7.63938 -6.19294,13.83231 -13.83228,13.83231 H 438.83231 C 431.19293,321.00787 425,314.81494 425,307.17556 Z"
+ id="path3786"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 465.745,275.43182 v -13.35937 h 9.65625 v 1.57812 h -7.875 v 4.09375 h 7.375 v 1.5625 h -7.375 v 4.54688 h 8.1875 v 1.57812 z m 11.11545,0 3.53125,-5.03125 -3.26563,-4.64062 h 2.04688 l 1.48437,2.26562 q 0.42188,0.64063 0.67188,1.07813 0.40625,-0.59375 0.73437,-1.0625 l 1.64063,-2.28125 h 1.95312 l -3.34375,4.54687 3.59375,5.125 h -2.01562 l -1.98438,-3 -0.51562,-0.8125 -2.54688,3.8125 z m 14,-1.46875 0.23437,1.45313 q -0.6875,0.14062 -1.23437,0.14062 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.73437 -0.20312,-0.46875 -0.20312,-1.9375 v -5.57813 h -1.20313 v -1.26562 h 1.20313 v -2.39063 l 1.625,-0.98437 v 3.375 h 1.65625 v 1.26562 h -1.65625 v 5.67188 q 0,0.6875 0.0781,0.89062 0.0937,0.20313 0.28125,0.32813 0.20313,0.10937 0.57813,0.10937 0.26562,0 0.71875,-0.0625 z m 8.23016,-1.64062 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.12573,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 6.2283,0 v -9.67187 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82812 0.375,0.5 0.51563,1.20313 0.0937,0.45312 0.0937,1.59375 v 5.95312 h -1.64063 v -5.89062 q 0,-1 -0.20312,-1.48438 -0.1875,-0.5 -0.67188,-0.79687 -0.48437,-0.29688 -1.14062,-0.29688 -1.04688,0 -1.8125,0.67188 -0.75,0.65625 -0.75,2.51562 v 5.28125 z m 16.68823,-1.1875 q -0.92187,0.76563 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98437 0,-0.71875 0.32813,-1.29688 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23438 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42188 l -1.60938,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45313,-0.98437 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29687 0.78125,0.28125 1.14063,0.73438 0.375,0.4375 0.51562,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10937,2.89062 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51562 -0.32813,-1.1875 z m -0.14062,-3.67187 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14062 -1.4375,0.32812 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26563,-0.5625 0.26563,-1.64063 z m 4.15692,4.85937 v -13.35937 h 1.64062 v 13.35937 z"
+ id="path3788"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 448.10052,297.43182 v -13.35937 h 5.04688 q 1.32812,0 2.03125,0.125 0.96875,0.17187 1.64062,0.64062 0.67188,0.45313 1.07813,1.28125 0.40625,0.82813 0.40625,1.82813 0,1.70312 -1.09375,2.89062 -1.07813,1.17188 -3.92188,1.17188 h -3.42187 v 5.42187 z m 1.76563,-7 h 3.45312 q 1.71875,0 2.4375,-0.64062 0.71875,-0.64063 0.71875,-1.79688 0,-0.84375 -0.42187,-1.4375 -0.42188,-0.59375 -1.125,-0.78125 -0.4375,-0.125 -1.64063,-0.125 h -3.42187 z m 10.45919,7 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 5.61893,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07812 3.04687,-1.07812 2,0 3.26563,1.3125 1.26562,1.29687 1.26562,3.60937 0,1.85938 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29687 -1.25,-1.3125 -1.25,-3.76563 z m 1.6875,0 q 0,1.85938 0.79688,2.79688 0.8125,0.92187 2.04687,0.92187 1.21875,0 2.03125,-0.92187 0.8125,-0.9375 0.8125,-2.84375 0,-1.79688 -0.8125,-2.71875 -0.8125,-0.92188 -2.03125,-0.92188 -1.23437,0 -2.04687,0.92188 -0.79688,0.90625 -0.79688,2.76562 z m 8.98508,5.64063 1.59375,0.23437 q 0.10937,0.75 0.5625,1.07813 0.60937,0.45312 1.67187,0.45312 1.14063,0 1.75,-0.45312 0.625,-0.45313 0.84375,-1.26563 0.125,-0.5 0.10938,-2.10937 -1.0625,1.26562 -2.67188,1.26562 -2,0 -3.09375,-1.4375 -1.09375,-1.4375 -1.09375,-3.45312 0,-1.39063 0.5,-2.5625 0.51563,-1.17188 1.45313,-1.79688 0.95312,-0.64062 2.25,-0.64062 1.70312,0 2.8125,1.375 v -1.15625 h 1.51562 v 8.35937 q 0,2.26563 -0.46875,3.20313 -0.45312,0.9375 -1.45312,1.48437 -0.98438,0.54688 -2.45313,0.54688 -1.71875,0 -2.79687,-0.78125 -1.0625,-0.76563 -1.03125,-2.34375 z m 1.35937,-5.8125 q 0,1.90625 0.75,2.78125 0.76563,0.875 1.90625,0.875 1.125,0 1.89063,-0.85938 0.76562,-0.875 0.76562,-2.73437 0,-1.78125 -0.79687,-2.67188 -0.78125,-0.90625 -1.89063,-0.90625 -1.09375,0 -1.85937,0.89063 -0.76563,0.875 -0.76563,2.625 z m 9.31323,5.01562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 12.54081,-1.1875 q -0.92188,0.76563 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98437 0,-0.71875 0.32812,-1.29688 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23438 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42188 l -1.60937,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45312,-0.98437 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29687 0.78125,0.28125 1.14062,0.73438 0.375,0.4375 0.51563,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10938,2.89062 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51562 -0.32812,-1.1875 z m -0.14063,-3.67187 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14062 -1.4375,0.32812 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26562,-0.5625 0.26562,-1.64063 z m 4.20383,4.85937 v -9.67187 h 1.46875 v 1.35937 q 0.45312,-0.71875 1.20312,-1.14062 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45312 0.6875,0.4375 0.96875,1.23438 1.15628,-1.6875 2.9844,-1.6875 1.45313,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64062 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70312 -0.42187,-0.26563 -0.98437,-0.26563 -1.01563,0 -1.68753,0.6875 -0.67188,0.67188 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85938,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 15.5408,0 v -9.67187 h 1.46875 v 1.35937 q 0.45312,-0.71875 1.20312,-1.14062 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45312 0.6875,0.4375 0.96875,1.23438 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64062 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70312 -0.42187,-0.26563 -0.98437,-0.26563 -1.01563,0 -1.6875,0.6875 -0.67188,0.67188 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85938,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 22.16583,-3.10937 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.12567,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z"
+ id="path3790"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 357.49606,269.74802 h 55.49606 V 264 l 11.49607,11.49607 -11.49607,11.49606 v -5.74805 h -55.49606 z"
+ id="path3792"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="m 357.49606,269.74802 h 55.49606 V 264 l 11.49607,11.49607 -11.49607,11.49606 v -5.74805 h -55.49606 z"
+ id="path3794"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 572.50397,269.74802 H 628 V 264 L 639.49604,275.49607 628,286.99213 v -5.74805 h -55.49603 z"
+ id="path3796"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="M 572.50397,269.74802 H 628 V 264 L 639.49604,275.49607 628,286.99213 v -5.74805 h -55.49603 z"
+ id="path3798"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ </g>
+ <rect
+ id="rect3810"
+ width="611.22791"
+ height="199.54794"
+ x="0"
+ y="0" />
+ <rect
+ id="rect3812"
+ width="611.22791"
+ height="199.54794"
+ x="0"
+ y="0" />
+</svg>
diff --git a/util/ubertest/drawing_external_programmer_local_dut.svg b/util/ubertest/drawing_external_programmer_local_dut.svg
new file mode 100644
index 0000000..79d6fa3
--- /dev/null
+++ b/util/ubertest/drawing_external_programmer_local_dut.svg
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 385.03391 185.09322"
+ stroke-miterlimit="10"
+ id="svg70"
+ sodipodi:docname="drawing_local_host_external_programmer_local_dut.svg"
+ width="385.03391"
+ height="185.09322"
+ style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata76">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs74" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1544"
+ inkscape:window-height="1153"
+ id="namedview72"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.5733333"
+ inkscape:cx="236.47285"
+ inkscape:cy="122.94451"
+ inkscape:window-x="1699"
+ inkscape:window-y="740"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg70" />
+ <clipPath
+ id="p.0">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path29"
+ inkscape:connector-curvature="0"
+ style="clip-rule:nonzero" />
+ </clipPath>
+ <g
+ clip-path="url(#p.0)"
+ id="g68"
+ transform="translate(-187,-188)">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path32"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path34"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path36"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 205,188 h 142.99213 v 54.99213 H 205 Z"
+ id="path38"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 215.35938,214.92 v -13.35938 h 1.78125 v 11.78125 h 6.5625 V 214.92 Z m 9.64134,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 15.61009,1.29687 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 9.32813,2.35938 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 4.15697,4.85938 v -13.35938 h 1.64061 V 214.92 Z m 9.37499,0 v -9.67188 h 1.46875 v 1.35938 q 0.45312,-0.71875 1.20312,-1.14063 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 214.92 h -1.64062 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70313 -0.42187,-0.26562 -0.98437,-0.26562 -1.01563,0 -1.6875,0.6875 -0.67188,0.67187 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85938,1.0625 -0.25,0.70313 -0.25,2.03125 V 214.92 Z m 21.85333,-1.1875 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 10.51633,1.3125 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 3.01563,3.54688 v -13.35938 h 1.64062 v 4.79688 q 1.14063,-1.32813 2.89063,-1.32813 1.07812,0 1.85937,0.42188 0.79688,0.42187 1.14063,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64063 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51562,-0.5625 -0.71875,0 -1.35938,0.39063 -0.64062,0.375 -0.92187,1.01562 -0.26563,0.64063 -0.26563,1.78125 V 214.92 Z m 10.3757,-11.46875 v -1.89063 h 1.64062 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64062 V 214.92 Z m 4.14483,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82813 0.375,0.5 0.51563,1.20312 0.0937,0.45313 0.0937,1.59375 V 214.92 h -1.64063 v -5.89063 q 0,-1 -0.20312,-1.48437 -0.1875,-0.5 -0.67188,-0.79688 -0.48437,-0.29687 -1.14062,-0.29687 -1.04688,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 214.92 Z m 17.00074,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.29688 -1.23438,-1.3125 -1.23438,-3.67187 0,-2.45313 1.25,-3.79688 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.32813 1.23437,1.3125 1.23437,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.48438 1.01563,-1.51563 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76562,0.75 -0.84375,2.01562 z"
+ id="path40"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 221,252 h 110.99213 v 68 H 221 Z"
+ id="path42"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 200.49606,270 h 142.99213 v 60 H 200.49606 Z"
+ id="path44"
+ inkscape:connector-curvature="0"
+ style="fill:#fff2cc;fill-rule:evenodd" />
+ <path
+ d="m 200.49606,270 h 142.99213 v 60 H 200.49606 Z"
+ id="path46"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 234.98425,278.50394 H 309 v 42.99213 h -74.01575 z"
+ id="path48"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 245.453,305.42395 v -13.35938 h 5.92187 q 1.78125,0 2.70313,0.35938 0.9375,0.35937 1.48437,1.28125 0.5625,0.90625 0.5625,2.01562 0,1.40625 -0.92187,2.39063 -0.92188,0.96875 -2.84375,1.23437 0.70312,0.34375 1.07812,0.67188 0.76563,0.70312 1.45313,1.76562 l 2.32812,3.64063 h -2.21875 l -1.76562,-2.78125 q -0.78125,-1.20313 -1.28125,-1.82813 -0.5,-0.64062 -0.90625,-0.89062 -0.39063,-0.26563 -0.79688,-0.35938 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45313 h 3.79688 q 1.21875,0 1.89062,-0.25 0.6875,-0.26562 1.04688,-0.8125 0.35937,-0.54687 0.35937,-1.1875 0,-0.95312 -0.6875,-1.5625 -0.6875,-0.60937 -2.1875,-0.60937 h -4.21875 z m 11.14481,0.95313 q 0,-3.32813 1.78125,-5.20313 1.78125,-1.89062 4.60938,-1.89062 1.84375,0 3.32812,0.89062 1.48438,0.875 2.26563,2.46875 0.78125,1.57813 0.78125,3.57813 0,2.03125 -0.82813,3.64062 -0.8125,1.59375 -2.3125,2.42188 -1.5,0.82812 -3.25,0.82812 -1.875,0 -3.35937,-0.90625 -1.48438,-0.92187 -2.25,-2.5 -0.76563,-1.57812 -0.76563,-3.32812 z m 1.8125,0.0156 q 0,2.42188 1.29688,3.8125 1.29687,1.39063 3.26562,1.39063 2,0 3.28125,-1.40625 1.28125,-1.40625 1.28125,-3.98438 0,-1.625 -0.54687,-2.84375 -0.54688,-1.21875 -1.60938,-1.875 -1.0625,-0.67187 -2.375,-0.67187 -1.89062,0 -3.25,1.29687 -1.34375,1.28125 -1.34375,4.28125 z m 13.18332,6.48438 v -13.35938 h 2.65625 l 3.15625,9.45313 q 0.4375,1.32812 0.64062,1.98437 0.23438,-0.73437 0.70313,-2.14062 l 3.20312,-9.29688 h 2.375 v 13.35938 h -1.70312 v -11.17188 l -3.875,11.17188 h -1.59375 l -3.85938,-11.375 v 11.375 z"
+ id="path50"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 425,251.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66852,0 7.18683,1.45733 9.78089,4.0514 2.59405,2.59405 4.05139,6.11235 4.05139,9.78091 v 55.32751 c 0,7.63938 -6.19294,13.83231 -13.83228,13.83231 H 438.83231 C 431.19293,321.00787 425,314.81494 425,307.17556 Z"
+ id="path52"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="m 425,251.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66852,0 7.18683,1.45733 9.78089,4.0514 2.59405,2.59405 4.05139,6.11235 4.05139,9.78091 v 55.32751 c 0,7.63938 -6.19294,13.83231 -13.83228,13.83231 H 438.83231 C 431.19293,321.00787 425,314.81494 425,307.17556 Z"
+ id="path54"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 465.745,275.43182 v -13.35937 h 9.65625 v 1.57812 h -7.875 v 4.09375 h 7.375 v 1.5625 h -7.375 v 4.54688 h 8.1875 v 1.57812 z m 11.11545,0 3.53125,-5.03125 -3.26563,-4.64062 h 2.04688 l 1.48437,2.26562 q 0.42188,0.64063 0.67188,1.07813 0.40625,-0.59375 0.73437,-1.0625 l 1.64063,-2.28125 h 1.95312 l -3.34375,4.54687 3.59375,5.125 h -2.01562 l -1.98438,-3 -0.51562,-0.8125 -2.54688,3.8125 z m 14,-1.46875 0.23437,1.45313 q -0.6875,0.14062 -1.23437,0.14062 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.73437 -0.20312,-0.46875 -0.20312,-1.9375 v -5.57813 h -1.20313 v -1.26562 h 1.20313 v -2.39063 l 1.625,-0.98437 v 3.375 h 1.65625 v 1.26562 h -1.65625 v 5.67188 q 0,0.6875 0.0781,0.89062 0.0937,0.20313 0.28125,0.32813 0.20313,0.10937 0.57813,0.10937 0.26562,0 0.71875,-0.0625 z m 8.23016,-1.64062 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.12573,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 6.2283,0 v -9.67187 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82812 0.375,0.5 0.51563,1.20313 0.0937,0.45312 0.0937,1.59375 v 5.95312 h -1.64063 v -5.89062 q 0,-1 -0.20312,-1.48438 -0.1875,-0.5 -0.67188,-0.79687 -0.48437,-0.29688 -1.14062,-0.29688 -1.04688,0 -1.8125,0.67188 -0.75,0.65625 -0.75,2.51562 v 5.28125 z m 16.68823,-1.1875 q -0.92187,0.76563 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98437 0,-0.71875 0.32813,-1.29688 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23438 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42188 l -1.60938,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45313,-0.98437 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29687 0.78125,0.28125 1.14063,0.73438 0.375,0.4375 0.51562,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10937,2.89062 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51562 -0.32813,-1.1875 z m -0.14062,-3.67187 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14062 -1.4375,0.32812 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26563,-0.5625 0.26563,-1.64063 z m 4.15692,4.85937 v -13.35937 h 1.64062 v 13.35937 z"
+ id="path56"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 448.10052,297.43182 v -13.35937 h 5.04688 q 1.32812,0 2.03125,0.125 0.96875,0.17187 1.64062,0.64062 0.67188,0.45313 1.07813,1.28125 0.40625,0.82813 0.40625,1.82813 0,1.70312 -1.09375,2.89062 -1.07813,1.17188 -3.92188,1.17188 h -3.42187 v 5.42187 z m 1.76563,-7 h 3.45312 q 1.71875,0 2.4375,-0.64062 0.71875,-0.64063 0.71875,-1.79688 0,-0.84375 -0.42187,-1.4375 -0.42188,-0.59375 -1.125,-0.78125 -0.4375,-0.125 -1.64063,-0.125 h -3.42187 z m 10.45919,7 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 5.61893,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07812 3.04687,-1.07812 2,0 3.26563,1.3125 1.26562,1.29687 1.26562,3.60937 0,1.85938 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29687 -1.25,-1.3125 -1.25,-3.76563 z m 1.6875,0 q 0,1.85938 0.79688,2.79688 0.8125,0.92187 2.04687,0.92187 1.21875,0 2.03125,-0.92187 0.8125,-0.9375 0.8125,-2.84375 0,-1.79688 -0.8125,-2.71875 -0.8125,-0.92188 -2.03125,-0.92188 -1.23437,0 -2.04687,0.92188 -0.79688,0.90625 -0.79688,2.76562 z m 8.98508,5.64063 1.59375,0.23437 q 0.10937,0.75 0.5625,1.07813 0.60937,0.45312 1.67187,0.45312 1.14063,0 1.75,-0.45312 0.625,-0.45313 0.84375,-1.26563 0.125,-0.5 0.10938,-2.10937 -1.0625,1.26562 -2.67188,1.26562 -2,0 -3.09375,-1.4375 -1.09375,-1.4375 -1.09375,-3.45312 0,-1.39063 0.5,-2.5625 0.51563,-1.17188 1.45313,-1.79688 0.95312,-0.64062 2.25,-0.64062 1.70312,0 2.8125,1.375 v -1.15625 h 1.51562 v 8.35937 q 0,2.26563 -0.46875,3.20313 -0.45312,0.9375 -1.45312,1.48437 -0.98438,0.54688 -2.45313,0.54688 -1.71875,0 -2.79687,-0.78125 -1.0625,-0.76563 -1.03125,-2.34375 z m 1.35937,-5.8125 q 0,1.90625 0.75,2.78125 0.76563,0.875 1.90625,0.875 1.125,0 1.89063,-0.85938 0.76562,-0.875 0.76562,-2.73437 0,-1.78125 -0.79687,-2.67188 -0.78125,-0.90625 -1.89063,-0.90625 -1.09375,0 -1.85937,0.89063 -0.76563,0.875 -0.76563,2.625 z m 9.31323,5.01562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 12.54081,-1.1875 q -0.92188,0.76563 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98437 0,-0.71875 0.32812,-1.29688 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23438 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42188 l -1.60937,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45312,-0.98437 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29687 0.78125,0.28125 1.14062,0.73438 0.375,0.4375 0.51563,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10938,2.89062 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51562 -0.32812,-1.1875 z m -0.14063,-3.67187 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14062 -1.4375,0.32812 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26562,-0.5625 0.26562,-1.64063 z m 4.20383,4.85937 v -9.67187 h 1.46875 v 1.35937 q 0.45312,-0.71875 1.20312,-1.14062 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45312 0.6875,0.4375 0.96875,1.23438 1.15628,-1.6875 2.9844,-1.6875 1.45313,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64062 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70312 -0.42187,-0.26563 -0.98437,-0.26563 -1.01563,0 -1.68753,0.6875 -0.67188,0.67188 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85938,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 15.5408,0 v -9.67187 h 1.46875 v 1.35937 q 0.45312,-0.71875 1.20312,-1.14062 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45312 0.6875,0.4375 0.96875,1.23438 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64062 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70312 -0.42187,-0.26563 -0.98437,-0.26563 -1.01563,0 -1.6875,0.6875 -0.67188,0.67188 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85938,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 22.16583,-3.10937 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.12567,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z"
+ id="path58"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 358,252.74803 h 55.49606 V 247 l 11.49607,11.49606 -11.49607,11.49606 v -5.74804 H 358 Z"
+ id="path60"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="m 358,252.74803 h 55.49606 V 247 l 11.49607,11.49606 -11.49607,11.49606 v -5.74804 H 358 Z"
+ id="path62"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 343.4882,292.49606 354.98426,281 v 5.74801 h 71.02362 v 11.49607 h -71.02362 v 5.74804 z"
+ id="path64"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="M 343.4882,292.49606 354.98426,281 v 5.74801 h 71.02362 v 11.49607 h -71.02362 v 5.74804 z"
+ id="path66"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ </g>
+ <rect
+ id="rect3919"
+ width="385.03391"
+ height="185.09322"
+ x="0"
+ y="0" />
+</svg>
diff --git a/util/ubertest/drawing_external_programmer_remote_dut.svg b/util/ubertest/drawing_external_programmer_remote_dut.svg
new file mode 100644
index 0000000..b35e9d7
--- /dev/null
+++ b/util/ubertest/drawing_external_programmer_remote_dut.svg
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 561.27228 321.81293"
+ stroke-miterlimit="10"
+ id="svg133"
+ sodipodi:docname="drawing_local_host_external_programmer_remote_dut.svg"
+ width="561.27228"
+ height="321.81293"
+ style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata139">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs137" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1496"
+ inkscape:window-height="1194"
+ id="namedview135"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.1125147"
+ inkscape:cx="347.90062"
+ inkscape:cy="-34.458882"
+ inkscape:window-x="1551"
+ inkscape:window-y="595"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg133" />
+ <clipPath
+ id="p.0">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path78"
+ inkscape:connector-curvature="0"
+ style="clip-rule:nonzero" />
+ </clipPath>
+ <g
+ clip-path="url(#p.0)"
+ id="g131"
+ transform="translate(-80.517029,-99.313019)">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path81"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 94,106.50394 H 276.01575 V 283.00788 H 94 Z"
+ id="path83"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 94,106.50394 H 276.01575 V 283.00788 H 94 Z"
+ id="path85"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 120,123 h 142.99213 v 54.99213 H 120 Z"
+ id="path87"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 130.35938,149.92 v -13.35938 h 1.78125 v 11.78125 h 6.5625 V 149.92 Z m 9.64134,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 15.61009,1.29687 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 9.32813,2.35938 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 4.15697,4.85938 v -13.35938 h 1.64063 V 149.92 Z m 9.375,0 v -9.67188 h 1.46875 v 1.35938 q 0.45313,-0.71875 1.20313,-1.14063 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64063 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.70313 -0.42188,-0.26562 -0.98438,-0.26562 -1.01562,0 -1.6875,0.6875 -0.67187,0.67187 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85937,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 21.8533,-1.1875 q -0.92187,0.76562 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98438 0,-0.71875 0.32813,-1.29687 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23437 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42187 l -1.60938,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45313,-0.98438 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29688 0.78125,0.28125 1.14063,0.73437 0.375,0.4375 0.51562,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10937,2.89063 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51563 -0.32813,-1.1875 z m -0.14062,-3.67188 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14063 -1.4375,0.32813 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26563,-0.5625 0.26563,-1.64062 z m 10.51634,1.3125 1.60937,0.21875 q -0.26562,1.65625 -1.35937,2.60938 -1.07813,0.9375 -2.67188,0.9375 -1.98437,0 -3.1875,-1.29688 -1.20312,-1.29687 -1.20312,-3.71875 0,-1.57812 0.51562,-2.75 0.51563,-1.17187 1.57813,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57812,0 2.57812,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23437,-0.96875 -0.8125,-1.45313 -0.57812,-0.5 -1.39062,-0.5 -1.23438,0 -2.01563,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95313,0.875 0.96875,0 1.60937,-0.59375 0.65625,-0.59375 0.82813,-1.82813 z m 3.01562,3.54688 v -13.35938 h 1.64063 v 4.79688 q 1.14062,-1.32813 2.89062,-1.32813 1.07813,0 1.85938,0.42188 0.79687,0.42187 1.14062,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64062 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51563,-0.5625 -0.71875,0 -1.35937,0.39063 -0.64063,0.375 -0.92188,1.01562 -0.26562,0.64063 -0.26562,1.78125 V 149.92 Z m 10.37572,-11.46875 v -1.89063 h 1.64063 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64063 V 149.92 Z m 4.14482,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82813 0.375,0.5 0.51563,1.20312 0.0937,0.45313 0.0937,1.59375 V 149.92 h -1.64063 v -5.89063 q 0,-1 -0.20312,-1.48437 -0.1875,-0.5 -0.67188,-0.79688 -0.48437,-0.29687 -1.14062,-0.29687 -1.04688,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 149.92 Z m 17.00072,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z"
+ id="path89"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 426.99213,106.50394 h 206.99213 v 172 H 426.99213 Z"
+ id="path91"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="m 426.99213,106.50394 h 206.99213 v 172 H 426.99213 Z"
+ id="path93"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 440,123 h 173.98425 v 54.99213 H 440 Z"
+ id="path95"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 450.46875,149.92 v -13.35938 h 5.92187 q 1.78125,0 2.70313,0.35938 0.9375,0.35937 1.48437,1.28125 0.5625,0.90625 0.5625,2.01562 0,1.40625 -0.92187,2.39063 -0.92188,0.96875 -2.84375,1.23437 0.70312,0.34375 1.07812,0.67188 0.76563,0.70312 1.45313,1.76562 l 2.32812,3.64063 h -2.21875 L 458.25,147.13875 q -0.78125,-1.20313 -1.28125,-1.82813 -0.5,-0.64062 -0.90625,-0.89062 -0.39063,-0.26563 -0.79688,-0.35938 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45313 h 3.79688 q 1.21875,0 1.89062,-0.25 0.6875,-0.26562 1.04688,-0.8125 0.35937,-0.54687 0.35937,-1.1875 0,-0.95312 -0.6875,-1.5625 -0.6875,-0.60937 -2.1875,-0.60937 h -4.21875 z m 18.09797,4.34375 1.6875,0.20313 q -0.40625,1.48437 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.29688 -1.23438,-1.3125 -1.23438,-3.67187 0,-2.45313 1.25,-3.79688 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.32813 1.23437,1.3125 1.23437,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.48438 1.01563,-1.51563 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76562,0.75 -0.84375,2.01562 z m 9.14133,5.76563 v -9.67188 h 1.46875 v 1.35938 q 0.45312,-0.71875 1.20312,-1.14063 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64062 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70313 -0.42187,-0.26562 -0.98437,-0.26562 -1.01563,0 -1.6875,0.6875 -0.67188,0.67187 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85938,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 14.93142,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 12.87574,3.375 0.23437,1.45312 q -0.6875,0.14063 -1.23437,0.14063 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.73438 -0.20312,-0.46875 -0.20312,-1.9375 v -5.57812 h -1.20313 v -1.26563 h 1.20313 v -2.39062 l 1.625,-0.98438 v 3.375 h 1.65625 v 1.26563 h -1.65625 v 5.67187 q 0,0.6875 0.0781,0.89063 0.0937,0.20312 0.28125,0.32812 0.20313,0.10938 0.57813,0.10938 0.26562,0 0.71875,-0.0625 z m 8.23016,-1.64063 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z m 14.32464,5.76563 v -9.67188 h 1.46875 v 1.35938 q 0.45313,-0.71875 1.20313,-1.14063 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64063 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.70313 -0.42188,-0.26562 -0.98438,-0.26562 -1.01562,0 -1.6875,0.6875 -0.67187,0.67187 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85937,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 21.85333,-1.1875 q -0.92187,0.76562 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98438 0,-0.71875 0.32813,-1.29687 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23437 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42187 l -1.60938,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45313,-0.98438 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29688 0.78125,0.28125 1.14063,0.73437 0.375,0.4375 0.51562,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10937,2.89063 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51563 -0.32813,-1.1875 z m -0.14062,-3.67188 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14063 -1.4375,0.32813 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26563,-0.5625 0.26563,-1.64062 z m 10.5163,1.3125 1.60937,0.21875 q -0.26562,1.65625 -1.35937,2.60938 -1.07813,0.9375 -2.67188,0.9375 -1.98437,0 -3.1875,-1.29688 -1.20312,-1.29687 -1.20312,-3.71875 0,-1.57812 0.51562,-2.75 0.51563,-1.17187 1.57813,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57812,0 2.57812,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23437,-0.96875 -0.8125,-1.45313 -0.57812,-0.5 -1.39062,-0.5 -1.23438,0 -2.01563,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95313,0.875 0.96875,0 1.60937,-0.59375 0.65625,-0.59375 0.82813,-1.82813 z m 3.01562,3.54688 v -13.35938 h 1.64063 v 4.79688 q 1.14062,-1.32813 2.89062,-1.32813 1.07813,0 1.85938,0.42188 0.79687,0.42187 1.14062,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64062 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51563,-0.5625 -0.71875,0 -1.35937,0.39063 -0.64063,0.375 -0.92188,1.01562 -0.26562,0.64063 -0.26562,1.78125 V 149.92 Z m 10.37573,-11.46875 v -1.89063 h 1.64063 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64063 V 149.92 Z m 4.14484,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07812,-1.59375 0.875,0 1.60938,0.3125 0.73437,0.3125 1.09375,0.82813 0.375,0.5 0.51562,1.20312 0.0937,0.45313 0.0937,1.59375 V 149.92 h -1.64062 v -5.89063 q 0,-1 -0.20313,-1.48437 -0.1875,-0.5 -0.67187,-0.79688 -0.48438,-0.29687 -1.14063,-0.29687 -1.04687,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 149.92 Z m 17.00073,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z"
+ id="path97"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 458.99213,183 h 142.99213 v 60 H 458.99213 Z"
+ id="path99"
+ inkscape:connector-curvature="0"
+ style="fill:#fff2cc;fill-rule:evenodd" />
+ <path
+ d="m 458.99213,183 h 142.99213 v 60 H 458.99213 Z"
+ id="path101"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 493.48032,191.50394 h 74.01572 v 42.99213 h -74.01572 z"
+ id="path103"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 503.94907,218.42393 v -13.35937 h 5.92187 q 1.78125,0 2.7031,0.35937 0.9375,0.35938 1.48437,1.28125 0.5625,0.90625 0.5625,2.01563 0,1.40625 -0.92187,2.39062 -0.92188,0.96875 -2.84372,1.23438 0.70312,0.34375 1.07812,0.67187 0.7656,0.70313 1.4531,1.76563 l 2.32812,3.64062 h -2.21875 l -1.76559,-2.78125 q -0.78125,-1.20312 -1.28125,-1.82812 -0.5,-0.64063 -0.90625,-0.89063 -0.39063,-0.26562 -0.79688,-0.35937 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45312 h 3.79688 q 1.21875,0 1.89062,-0.25 0.68747,-0.26563 1.04685,-0.8125 0.35937,-0.54688 0.35937,-1.1875 0,-0.95313 -0.6875,-1.5625 -0.68747,-0.60938 -2.18747,-0.60938 h -4.21875 z m 11.14481,0.95312 q 0,-3.32812 1.78125,-5.20312 1.78125,-1.89063 4.60938,-1.89063 1.84375,0 3.32812,0.89063 1.48438,0.875 2.26563,2.46875 0.78125,1.57812 0.78125,3.57812 0,2.03125 -0.82813,3.64063 -0.8125,1.59375 -2.3125,2.42187 -1.5,0.82813 -3.25,0.82813 -1.875,0 -3.35937,-0.90625 -1.48438,-0.92188 -2.25,-2.5 -0.76563,-1.57813 -0.76563,-3.32813 z m 1.8125,0.0156 q 0,2.42187 1.29688,3.8125 1.29687,1.39062 3.26562,1.39062 2,0 3.28125,-1.40625 1.28125,-1.40625 1.28125,-3.98437 0,-1.625 -0.54687,-2.84375 -0.54688,-1.21875 -1.60938,-1.875 -1.0625,-0.67188 -2.375,-0.67188 -1.89062,0 -3.25,1.29688 -1.34375,1.28125 -1.34375,4.28125 z m 13.18329,6.48437 v -13.35937 h 2.65625 l 3.15625,9.45312 q 0.4375,1.32813 0.64062,1.98438 0.23438,-0.73438 0.70313,-2.14063 l 3.20312,-9.29687 h 2.375 v 13.35937 h -1.70312 v -11.17187 l -3.875,11.17187 h -1.59375 l -3.85938,-11.375 v 11.375 z"
+ id="path105"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="M 278.50394,188.49606 300,167 v 10.74803 H 405.48032 V 167 l 21.49606,21.49606 -21.49606,21.49606 V 199.24409 H 300 v 10.74803 z"
+ id="path107"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 278.50394,188.49606 300,167 v 10.74803 H 405.48032 V 167 l 21.49606,21.49606 -21.49606,21.49606 V 199.24409 H 300 v 10.74803 z"
+ id="path109"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 322.00787,140.98425 H 381 v 37.00787 h -58.99213 z"
+ id="path111"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 331.85162,163.60738 1.65625,-0.14063 q 0.125,1 0.54688,1.64063 0.4375,0.64062 1.34375,1.04687 0.92187,0.39063 2.0625,0.39063 1,0 1.78125,-0.29688 0.78125,-0.29687 1.15625,-0.8125 0.375,-0.53125 0.375,-1.15625 0,-0.625 -0.375,-1.09375 -0.35938,-0.46875 -1.1875,-0.79687 -0.54688,-0.20313 -2.39063,-0.64063 -1.82812,-0.45312 -2.5625,-0.84375 -0.96875,-0.5 -1.4375,-1.23437 -0.46875,-0.75 -0.46875,-1.67188 0,-1 0.57813,-1.875 0.57812,-0.89062 1.67187,-1.34375 1.10938,-0.45312 2.45313,-0.45312 1.48437,0 2.60937,0.48437 1.14063,0.46875 1.75,1.40625 0.60938,0.92188 0.65625,2.09375 l -1.6875,0.125 q -0.14062,-1.26562 -0.9375,-1.90625 -0.78125,-0.65625 -2.3125,-0.65625 -1.60937,0 -2.34375,0.59375 -0.73437,0.59375 -0.73437,1.42188 0,0.71875 0.53125,1.17187 0.5,0.46875 2.65625,0.96875 2.15625,0.48438 2.95312,0.84375 1.17188,0.53125 1.71875,1.35938 0.5625,0.82812 0.5625,1.90625 0,1.0625 -0.60937,2.01562 -0.60938,0.9375 -1.75,1.46875 -1.14063,0.51563 -2.57813,0.51563 -1.8125,0 -3.04687,-0.53125 -1.21875,-0.53125 -1.92188,-1.59375 -0.6875,-1.0625 -0.71875,-2.40625 z m 12.44357,0 1.65625,-0.14063 q 0.125,1 0.54688,1.64063 0.4375,0.64062 1.34375,1.04687 0.92187,0.39063 2.0625,0.39063 1,0 1.78125,-0.29688 0.78125,-0.29687 1.15625,-0.8125 0.375,-0.53125 0.375,-1.15625 0,-0.625 -0.375,-1.09375 -0.35938,-0.46875 -1.1875,-0.79687 -0.54688,-0.20313 -2.39063,-0.64063 -1.82812,-0.45312 -2.5625,-0.84375 -0.96875,-0.5 -1.4375,-1.23437 -0.46875,-0.75 -0.46875,-1.67188 0,-1 0.57813,-1.875 0.57812,-0.89062 1.67187,-1.34375 1.10938,-0.45312 2.45313,-0.45312 1.48437,0 2.60937,0.48437 1.14063,0.46875 1.75,1.40625 0.60938,0.92188 0.65625,2.09375 l -1.6875,0.125 q -0.14062,-1.26562 -0.9375,-1.90625 -0.78125,-0.65625 -2.3125,-0.65625 -1.60937,0 -2.34375,0.59375 -0.73437,0.59375 -0.73437,1.42188 0,0.71875 0.53125,1.17187 0.5,0.46875 2.65625,0.96875 2.15625,0.48438 2.95312,0.84375 1.17188,0.53125 1.71875,1.35938 0.5625,0.82812 0.5625,1.90625 0,1.0625 -0.60937,2.01562 -0.60938,0.9375 -1.75,1.46875 -1.14063,0.51563 -2.57813,0.51563 -1.8125,0 -3.04687,-0.53125 -1.21875,-0.53125 -1.92188,-1.59375 -0.6875,-1.0625 -0.71875,-2.40625 z m 13.09983,4.29687 v -13.35937 h 1.76562 v 5.48437 h 6.9375 v -5.48437 h 1.76563 v 13.35937 h -1.76563 v -6.29687 h -6.9375 v 6.29687 z"
+ id="path113"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 279.24408,347.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66855,0 7.18686,1.45734 9.78091,4.0514 2.59406,2.59405 4.05137,6.11236 4.05137,9.78091 v 55.32751 c 0,7.63938 -6.19291,13.83231 -13.83228,13.83231 H 293.07639 c -7.63938,0 -13.83231,-6.19293 -13.83231,-13.83231 z"
+ id="path115"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="m 279.24408,347.84805 v 0 c 0,-7.63937 6.19293,-13.83231 13.83231,-13.83231 h 119.32754 c 3.66855,0 7.18686,1.45734 9.78091,4.0514 2.59406,2.59405 4.05137,6.11236 4.05137,9.78091 v 55.32751 c 0,7.63938 -6.19291,13.83231 -13.83228,13.83231 H 293.07639 c -7.63938,0 -13.83231,-6.19293 -13.83231,-13.83231 z"
+ id="path117"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 319.98907,371.43182 v -13.35937 h 9.65625 v 1.57812 h -7.875 v 4.09375 h 7.375 v 1.5625 h -7.375 v 4.54688 h 8.1875 v 1.57812 z m 11.11545,0 3.53125,-5.03125 -3.26563,-4.64062 h 2.04688 l 1.48437,2.26562 q 0.42188,0.64063 0.67188,1.07813 0.40625,-0.59375 0.73437,-1.0625 l 1.64063,-2.28125 h 1.95312 l -3.34375,4.54687 3.59375,5.125 h -2.01562 l -1.98438,-3 -0.51562,-0.8125 -2.54688,3.8125 z m 14,-1.46875 0.23437,1.45313 q -0.6875,0.14062 -1.23437,0.14062 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.73437 -0.20312,-0.46875 -0.20312,-1.9375 v -5.57813 h -1.20313 v -1.26562 h 1.20313 v -2.39063 l 1.625,-0.98437 v 3.375 h 1.65625 v 1.26562 h -1.65625 v 5.67188 q 0,0.6875 0.0781,0.89062 0.0937,0.20313 0.28125,0.32813 0.20313,0.10937 0.57813,0.10937 0.26562,0 0.71875,-0.0625 z m 8.23019,-1.64062 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.1257,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 6.2283,0 v -9.67187 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82812 0.375,0.5 0.51563,1.20313 0.0937,0.45312 0.0937,1.59375 v 5.95312 h -1.64063 v -5.89062 q 0,-1 -0.20312,-1.48438 -0.1875,-0.5 -0.67188,-0.79687 -0.48437,-0.29688 -1.14062,-0.29688 -1.04688,0 -1.8125,0.67188 -0.75,0.65625 -0.75,2.51562 v 5.28125 z m 16.68823,-1.1875 q -0.92187,0.76563 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98437 0,-0.71875 0.32813,-1.29688 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23438 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42188 l -1.60938,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45313,-0.98437 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29687 0.78125,0.28125 1.14063,0.73438 0.375,0.4375 0.51562,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10937,2.89062 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51562 -0.32813,-1.1875 z m -0.14062,-3.67187 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14062 -1.4375,0.32812 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26563,-0.5625 0.26563,-1.64063 z m 4.15695,4.85937 v -13.35937 h 1.64062 v 13.35937 z"
+ id="path119"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 302.3446,393.43182 v -13.35937 h 5.04688 q 1.32812,0 2.03125,0.125 0.96875,0.17187 1.64062,0.64062 0.67188,0.45313 1.07813,1.28125 0.40625,0.82813 0.40625,1.82813 0,1.70312 -1.09375,2.89062 -1.07813,1.17188 -3.92188,1.17188 h -3.42187 v 5.42187 z m 1.76563,-7 h 3.45312 q 1.71875,0 2.4375,-0.64062 0.71875,-0.64063 0.71875,-1.79688 0,-0.84375 -0.42187,-1.4375 -0.42188,-0.59375 -1.125,-0.78125 -0.4375,-0.125 -1.64063,-0.125 h -3.42187 z m 10.45919,7 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 5.61893,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07812 3.04687,-1.07812 2,0 3.26563,1.3125 1.26562,1.29687 1.26562,3.60937 0,1.85938 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29687 -1.25,-1.3125 -1.25,-3.76563 z m 1.6875,0 q 0,1.85938 0.79688,2.79688 0.8125,0.92187 2.04687,0.92187 1.21875,0 2.03125,-0.92187 0.8125,-0.9375 0.8125,-2.84375 0,-1.79688 -0.8125,-2.71875 -0.8125,-0.92188 -2.03125,-0.92188 -1.23437,0 -2.04687,0.92188 -0.79688,0.90625 -0.79688,2.76562 z m 8.98511,5.64063 1.59375,0.23437 q 0.10937,0.75 0.5625,1.07813 0.60937,0.45312 1.67187,0.45312 1.14063,0 1.75,-0.45312 0.625,-0.45313 0.84375,-1.26563 0.125,-0.5 0.10938,-2.10937 -1.0625,1.26562 -2.67188,1.26562 -2,0 -3.09375,-1.4375 -1.09375,-1.4375 -1.09375,-3.45312 0,-1.39063 0.5,-2.5625 0.51563,-1.17188 1.45313,-1.79688 0.95312,-0.64062 2.25,-0.64062 1.70312,0 2.8125,1.375 v -1.15625 h 1.51562 v 8.35937 q 0,2.26563 -0.46875,3.20313 -0.45312,0.9375 -1.45312,1.48437 -0.98438,0.54688 -2.45313,0.54688 -1.71875,0 -2.79687,-0.78125 -1.0625,-0.76563 -1.03125,-2.34375 z m 1.35937,-5.8125 q 0,1.90625 0.75,2.78125 0.76563,0.875 1.90625,0.875 1.125,0 1.89063,-0.85938 0.76562,-0.875 0.76562,-2.73437 0,-1.78125 -0.79687,-2.67188 -0.78125,-0.90625 -1.89063,-0.90625 -1.09375,0 -1.85937,0.89063 -0.76563,0.875 -0.76563,2.625 z m 9.3132,5.01562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48438,-0.32812 1.0625,-0.32812 0.82813,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60937,-0.35937 -1.20312,-0.35937 -0.54688,0 -0.96875,0.32812 -0.42188,0.32813 -0.60938,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z m 12.54081,-1.1875 q -0.92188,0.76563 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98437 0,-0.71875 0.32812,-1.29688 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35937 1.1875,-0.54687 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23438 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42188 0,-1 -0.46875,-1.42187 -0.625,-0.54688 -1.875,-0.54688 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42188 l -1.60937,-0.21875 q 0.21875,-1.01563 0.71875,-1.64063 0.5,-0.64062 1.45312,-0.98437 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29687 0.78125,0.28125 1.14062,0.73438 0.375,0.4375 0.51563,1.10937 0.0781,0.42188 0.0781,1.51563 v 2.1875 q 0,2.28125 0.10938,2.89062 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51562 -0.32812,-1.1875 z m -0.14063,-3.67187 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14062 -1.4375,0.32812 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42187 1.09375,-1.14062 0.26562,-0.5625 0.26562,-1.64063 z m 4.20386,4.85937 v -9.67187 h 1.46875 v 1.35937 q 0.45312,-0.71875 1.20312,-1.14062 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45312 0.6875,0.4375 0.96875,1.23438 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64062 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70312 -0.42187,-0.26563 -0.98437,-0.26563 -1.01563,0 -1.6875,0.6875 -0.67188,0.67188 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85938,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 15.5408,0 v -9.67187 h 1.46875 v 1.35937 q 0.45313,-0.71875 1.20313,-1.14062 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.45312 0.6875,0.4375 0.96875,1.23438 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.79687 0.78125,0.79688 0.78125,2.45313 v 6.64062 h -1.64063 v -6.09375 q 0,-0.98437 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.70312 -0.42188,-0.26563 -0.98438,-0.26563 -1.01562,0 -1.6875,0.6875 -0.67187,0.67188 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.64062 -0.40625,-0.54688 -1.3125,-0.54688 -0.6875,0 -1.28125,0.35938 -0.59375,0.35937 -0.85937,1.0625 -0.25,0.70312 -0.25,2.03125 v 5.01562 z m 22.1658,-3.10937 1.6875,0.20312 q -0.40625,1.48438 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29687 -1.23437,-1.3125 -1.23437,-3.67188 0,-2.45312 1.25,-3.79687 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32812 1.23438,1.3125 1.23438,3.70313 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45312 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48437 1.01562,-1.51562 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82813 -0.78125,-0.95312 -2.03125,-0.95312 -1.125,0 -1.90625,0.76562 -0.76563,0.75 -0.84375,2.01563 z m 9.1257,5.76562 v -9.67187 h 1.46875 v 1.46875 q 0.5625,-1.03125 1.03125,-1.35938 0.48437,-0.32812 1.0625,-0.32812 0.82812,0 1.6875,0.53125 l -0.5625,1.51562 q -0.60938,-0.35937 -1.20313,-0.35937 -0.54687,0 -0.96875,0.32812 -0.42187,0.32813 -0.60937,0.89063 -0.28125,0.875 -0.28125,1.92187 v 5.0625 z"
+ id="path121"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 205.22835,283.00787 v 53.35828 c 0,17.884 14.49786,32.38186 32.38188,32.38186 h 23.12991 V 378 l 18.50394,-18.50394 -18.50394,-18.50394 v 9.25195 h -23.12991 v 0 c -7.66458,0 -13.87795,-6.21334 -13.87795,-13.87792 v -53.35828 z"
+ id="path123"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="m 205.22835,283.00787 v 53.35828 c 0,17.884 14.49786,32.38186 32.38188,32.38186 h 23.12991 V 378 l 18.50394,-18.50394 -18.50394,-18.50394 v 9.25195 h -23.12991 v 0 c -7.66458,0 -13.87795,-6.21334 -13.87795,-13.87792 v -53.35828 z"
+ id="path125"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 426.97638,378 h 32.82284 c 18.12754,0 32.82282,-14.69528 32.82282,-32.82285 V 262.74014 H 502 l -18.75592,-18.75589 -18.75589,18.75589 h 9.37796 v 82.43701 0 c 0,7.76896 -6.29797,14.06693 -14.06693,14.06693 h -32.82284 z"
+ id="path127"
+ inkscape:connector-curvature="0"
+ style="fill:#ead1dc;fill-rule:evenodd" />
+ <path
+ d="m 426.97638,378 h 32.82284 c 18.12754,0 32.82282,-14.69528 32.82282,-32.82285 V 262.74014 H 502 l -18.75592,-18.75589 -18.75589,18.75589 h 9.37796 v 82.43701 0 c 0,7.76896 -6.29797,14.06693 -14.06693,14.06693 h -32.82284 z"
+ id="path129"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ </g>
+ <rect
+ id="rect214"
+ width="561.27228"
+ height="321.81293"
+ x="0"
+ y="0"
+ ry="0" />
+</svg>
diff --git a/util/ubertest/drawing_local_programmer_is_dut.svg b/util/ubertest/drawing_local_programmer_is_dut.svg
new file mode 100644
index 0000000..3aa1c2a
--- /dev/null
+++ b/util/ubertest/drawing_local_programmer_is_dut.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 169.98425 183.02362"
+ stroke-miterlimit="10"
+ id="svg27"
+ sodipodi:docname="drawing_local_programmer.svg"
+ width="169.98425"
+ height="183.02362"
+ style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata33">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs31" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1922"
+ inkscape:window-height="1005"
+ id="namedview29"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.5733333"
+ inkscape:cx="116.46357"
+ inkscape:cy="52.165074"
+ inkscape:window-x="1343"
+ inkscape:window-y="852"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg27" />
+ <clipPath
+ id="p.0">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path2"
+ inkscape:connector-curvature="0"
+ style="clip-rule:nonzero" />
+ </clipPath>
+ <g
+ clip-path="url(#p.0)"
+ id="g25"
+ transform="translate(-187,-188)">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 187,188 H 356.98425 V 371.02362 H 187 Z"
+ id="path9"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 205,188 h 142.99213 v 54.99213 H 205 Z"
+ id="path11"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 215.35938,214.92 v -13.35938 h 1.78125 v 11.78125 h 6.5625 V 214.92 Z m 9.64134,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 15.61009,1.29687 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 9.32813,2.35938 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 4.15697,4.85938 v -13.35938 h 1.64061 V 214.92 Z m 9.37499,0 v -9.67188 h 1.46875 v 1.35938 q 0.45312,-0.71875 1.20312,-1.14063 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 214.92 h -1.64062 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70313 -0.42187,-0.26562 -0.98437,-0.26562 -1.01563,0 -1.6875,0.6875 -0.67188,0.67187 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85938,1.0625 -0.25,0.70313 -0.25,2.03125 V 214.92 Z m 21.85333,-1.1875 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 10.51633,1.3125 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 3.01563,3.54688 v -13.35938 h 1.64062 v 4.79688 q 1.14063,-1.32813 2.89063,-1.32813 1.07812,0 1.85937,0.42188 0.79688,0.42187 1.14063,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64063 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51562,-0.5625 -0.71875,0 -1.35938,0.39063 -0.64062,0.375 -0.92187,1.01562 -0.26563,0.64063 -0.26563,1.78125 V 214.92 Z m 10.3757,-11.46875 v -1.89063 h 1.64062 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64062 V 214.92 Z m 4.14483,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82813 0.375,0.5 0.51563,1.20312 0.0937,0.45313 0.0937,1.59375 V 214.92 h -1.64063 v -5.89063 q 0,-1 -0.20312,-1.48437 -0.1875,-0.5 -0.67188,-0.79688 -0.48437,-0.29687 -1.14062,-0.29687 -1.04688,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 214.92 Z m 17.00074,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.29688 -1.23438,-1.3125 -1.23438,-3.67187 0,-2.45313 1.25,-3.79688 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.32813 1.23437,1.3125 1.23437,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.48438 1.01563,-1.51563 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76562,0.75 -0.84375,2.01562 z"
+ id="path13"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 221,252 h 110.99213 v 68 H 221 Z"
+ id="path15"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 200.49606,270 h 142.99213 v 60 H 200.49606 Z"
+ id="path17"
+ inkscape:connector-curvature="0"
+ style="fill:#fff2cc;fill-rule:evenodd" />
+ <path
+ d="m 200.49606,270 h 142.99213 v 60 H 200.49606 Z"
+ id="path19"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 234.98425,278.50394 H 309 v 42.99213 h -74.01575 z"
+ id="path21"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 245.453,305.42395 v -13.35938 h 5.92187 q 1.78125,0 2.70313,0.35938 0.9375,0.35937 1.48437,1.28125 0.5625,0.90625 0.5625,2.01562 0,1.40625 -0.92187,2.39063 -0.92188,0.96875 -2.84375,1.23437 0.70312,0.34375 1.07812,0.67188 0.76563,0.70312 1.45313,1.76562 l 2.32812,3.64063 h -2.21875 l -1.76562,-2.78125 q -0.78125,-1.20313 -1.28125,-1.82813 -0.5,-0.64062 -0.90625,-0.89062 -0.39063,-0.26563 -0.79688,-0.35938 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45313 h 3.79688 q 1.21875,0 1.89062,-0.25 0.6875,-0.26562 1.04688,-0.8125 0.35937,-0.54687 0.35937,-1.1875 0,-0.95312 -0.6875,-1.5625 -0.6875,-0.60937 -2.1875,-0.60937 h -4.21875 z m 11.14481,0.95313 q 0,-3.32813 1.78125,-5.20313 1.78125,-1.89062 4.60938,-1.89062 1.84375,0 3.32812,0.89062 1.48438,0.875 2.26563,2.46875 0.78125,1.57813 0.78125,3.57813 0,2.03125 -0.82813,3.64062 -0.8125,1.59375 -2.3125,2.42188 -1.5,0.82812 -3.25,0.82812 -1.875,0 -3.35937,-0.90625 -1.48438,-0.92187 -2.25,-2.5 -0.76563,-1.57812 -0.76563,-3.32812 z m 1.8125,0.0156 q 0,2.42188 1.29688,3.8125 1.29687,1.39063 3.26562,1.39063 2,0 3.28125,-1.40625 1.28125,-1.40625 1.28125,-3.98438 0,-1.625 -0.54687,-2.84375 -0.54688,-1.21875 -1.60938,-1.875 -1.0625,-0.67187 -2.375,-0.67187 -1.89062,0 -3.25,1.29687 -1.34375,1.28125 -1.34375,4.28125 z m 13.18332,6.48438 v -13.35938 h 2.65625 l 3.15625,9.45313 q 0.4375,1.32812 0.64062,1.98437 0.23438,-0.73437 0.70313,-2.14062 l 3.20312,-9.29688 h 2.375 v 13.35938 h -1.70312 v -11.17188 l -3.875,11.17188 h -1.59375 l -3.85938,-11.375 v 11.375 z"
+ id="path23"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ </g>
+ <rect
+ id="rect3738"
+ width="169.98425"
+ height="183.02362"
+ x="0"
+ y="0" />
+</svg>
diff --git a/util/ubertest/drawing_remote_host_is_remote_dut.svg b/util/ubertest/drawing_remote_host_is_remote_dut.svg
new file mode 100644
index 0000000..6c39dfc
--- /dev/null
+++ b/util/ubertest/drawing_remote_host_is_remote_dut.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 540.95764 185.23334"
+ stroke-miterlimit="10"
+ id="svg198"
+ sodipodi:docname="drawing_remote_host_remote_dut.svg"
+ width="540.95764"
+ height="185.23334"
+ style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata204">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs202" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1736"
+ inkscape:window-height="1198"
+ id="namedview200"
+ showgrid="false"
+ inkscape:zoom="1.5733333"
+ inkscape:cx="136.34177"
+ inkscape:cy="95.880647"
+ inkscape:window-x="1284"
+ inkscape:window-y="714"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg198"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <clipPath
+ id="p.0">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path159"
+ inkscape:connector-curvature="0"
+ style="clip-rule:nonzero" />
+ </clipPath>
+ <g
+ clip-path="url(#p.0)"
+ id="g196"
+ transform="translate(-93.36441,-100.148)">
+ <path
+ d="M 0,0 H 800 V 600 H 0 Z"
+ id="path162"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="M 94,106.50394 H 276.01575 V 283.00788 H 94 Z"
+ id="path164"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 94,106.50394 H 276.01575 V 283.00788 H 94 Z"
+ id="path166"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 120,123 h 142.99213 v 54.99213 H 120 Z"
+ id="path168"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 130.35938,149.92 v -13.35938 h 1.78125 v 11.78125 h 6.5625 V 149.92 Z m 9.64134,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 15.61009,1.29687 1.60938,0.21875 q -0.26563,1.65625 -1.35938,2.60938 -1.07812,0.9375 -2.67187,0.9375 -1.98438,0 -3.1875,-1.29688 -1.20313,-1.29687 -1.20313,-3.71875 0,-1.57812 0.51563,-2.75 0.51562,-1.17187 1.57812,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57813,0 2.57813,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23438,-0.96875 -0.8125,-1.45313 -0.57813,-0.5 -1.39063,-0.5 -1.23437,0 -2.01562,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95312,0.875 0.96875,0 1.60938,-0.59375 0.65625,-0.59375 0.82812,-1.82813 z m 9.32813,2.35938 q -0.92188,0.76562 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.98438 0,-0.71875 0.32812,-1.29687 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45313,-0.25 1.98437,-0.23437 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.42187 l -1.60937,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45312,-0.98438 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.29688 0.78125,0.28125 1.14062,0.73437 0.375,0.4375 0.51563,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10938,2.89063 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.51563 -0.32812,-1.1875 z m -0.14063,-3.67188 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.14063 -1.4375,0.32813 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26562,-0.5625 0.26562,-1.64062 z m 4.15697,4.85938 v -13.35938 h 1.64063 V 149.92 Z m 9.375,0 v -9.67188 h 1.46875 v 1.35938 q 0.45313,-0.71875 1.20313,-1.14063 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64063 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.70313 -0.42188,-0.26562 -0.98438,-0.26562 -1.01562,0 -1.6875,0.6875 -0.67187,0.67187 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85937,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 21.8533,-1.1875 q -0.92187,0.76562 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98438 0,-0.71875 0.32813,-1.29687 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23437 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42187 l -1.60938,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45313,-0.98438 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29688 0.78125,0.28125 1.14063,0.73437 0.375,0.4375 0.51562,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10937,2.89063 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51563 -0.32813,-1.1875 z m -0.14062,-3.67188 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14063 -1.4375,0.32813 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26563,-0.5625 0.26563,-1.64062 z m 10.51634,1.3125 1.60937,0.21875 q -0.26562,1.65625 -1.35937,2.60938 -1.07813,0.9375 -2.67188,0.9375 -1.98437,0 -3.1875,-1.29688 -1.20312,-1.29687 -1.20312,-3.71875 0,-1.57812 0.51562,-2.75 0.51563,-1.17187 1.57813,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57812,0 2.57812,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23437,-0.96875 -0.8125,-1.45313 -0.57812,-0.5 -1.39062,-0.5 -1.23438,0 -2.01563,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95313,0.875 0.96875,0 1.60937,-0.59375 0.65625,-0.59375 0.82813,-1.82813 z m 3.01562,3.54688 v -13.35938 h 1.64063 v 4.79688 q 1.14062,-1.32813 2.89062,-1.32813 1.07813,0 1.85938,0.42188 0.79687,0.42187 1.14062,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64062 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51563,-0.5625 -0.71875,0 -1.35937,0.39063 -0.64063,0.375 -0.92188,1.01562 -0.26562,0.64063 -0.26562,1.78125 V 149.92 Z m 10.37572,-11.46875 v -1.89063 h 1.64063 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64063 V 149.92 Z m 4.14482,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.82813 0.375,0.5 0.51563,1.20312 0.0937,0.45313 0.0937,1.59375 V 149.92 h -1.64063 v -5.89063 q 0,-1 -0.20312,-1.48437 -0.1875,-0.5 -0.67188,-0.79688 -0.48437,-0.29687 -1.14062,-0.29687 -1.04688,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 149.92 Z m 17.00072,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z"
+ id="path170"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 426.99213,106.50394 h 206.99213 v 172 H 426.99213 Z"
+ id="path172"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="m 426.99213,106.50394 h 206.99213 v 172 H 426.99213 Z"
+ id="path174"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 440,123 h 173.98425 v 54.99213 H 440 Z"
+ id="path176"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 450.46875,149.92 v -13.35938 h 5.92187 q 1.78125,0 2.70313,0.35938 0.9375,0.35937 1.48437,1.28125 0.5625,0.90625 0.5625,2.01562 0,1.40625 -0.92187,2.39063 -0.92188,0.96875 -2.84375,1.23437 0.70312,0.34375 1.07812,0.67188 0.76563,0.70312 1.45313,1.76562 l 2.32812,3.64063 h -2.21875 L 458.25,147.13875 q -0.78125,-1.20313 -1.28125,-1.82813 -0.5,-0.64062 -0.90625,-0.89062 -0.39063,-0.26563 -0.79688,-0.35938 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45313 h 3.79688 q 1.21875,0 1.89062,-0.25 0.6875,-0.26562 1.04688,-0.8125 0.35937,-0.54687 0.35937,-1.1875 0,-0.95312 -0.6875,-1.5625 -0.6875,-0.60937 -2.1875,-0.60937 h -4.21875 z m 18.09797,4.34375 1.6875,0.20313 q -0.40625,1.48437 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.29688 -1.23438,-1.3125 -1.23438,-3.67187 0,-2.45313 1.25,-3.79688 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.32813 1.23437,1.3125 1.23437,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.48438 1.01563,-1.51563 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76562,0.75 -0.84375,2.01562 z m 9.14133,5.76563 v -9.67188 h 1.46875 v 1.35938 q 0.45312,-0.71875 1.20312,-1.14063 0.76563,-0.4375 1.71875,-0.4375 1.07813,0 1.76563,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98437,-1.6875 1.45313,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64062 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57813,-0.70313 -0.42187,-0.26562 -0.98437,-0.26562 -1.01563,0 -1.6875,0.6875 -0.67188,0.67187 -0.67188,2.15625 v 5.625 h -1.64062 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85938,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 14.93142,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.07813 3.04687,-1.07813 2,0 3.26563,1.3125 1.26562,1.29688 1.26562,3.60938 0,1.85937 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.29688 -1.25,-1.3125 -1.25,-3.76562 z m 1.6875,0 q 0,1.85937 0.79688,2.79687 0.8125,0.92188 2.04687,0.92188 1.21875,0 2.03125,-0.92188 0.8125,-0.9375 0.8125,-2.84375 0,-1.79687 -0.8125,-2.71875 -0.8125,-0.92187 -2.03125,-0.92187 -1.23437,0 -2.04687,0.92187 -0.79688,0.90625 -0.79688,2.76563 z m 12.87574,3.375 0.23437,1.45312 q -0.6875,0.14063 -1.23437,0.14063 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.73438 -0.20312,-0.46875 -0.20312,-1.9375 v -5.57812 h -1.20313 v -1.26563 h 1.20313 v -2.39062 l 1.625,-0.98438 v 3.375 h 1.65625 v 1.26563 h -1.65625 v 5.67187 q 0,0.6875 0.0781,0.89063 0.0937,0.20312 0.28125,0.32812 0.20313,0.10938 0.57813,0.10938 0.26562,0 0.71875,-0.0625 z m 8.23016,-1.64063 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z m 14.32464,5.76563 v -9.67188 h 1.46875 v 1.35938 q 0.45313,-0.71875 1.20313,-1.14063 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.45313 0.6875,0.4375 0.96875,1.23437 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.79688 0.78125,0.79687 0.78125,2.45312 V 149.92 h -1.64063 v -6.09375 q 0,-0.98438 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.70313 -0.42188,-0.26562 -0.98438,-0.26562 -1.01562,0 -1.6875,0.6875 -0.67187,0.67187 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.64063 -0.40625,-0.54687 -1.3125,-0.54687 -0.6875,0 -1.28125,0.35937 -0.59375,0.35938 -0.85937,1.0625 -0.25,0.70313 -0.25,2.03125 V 149.92 Z m 21.85333,-1.1875 q -0.92187,0.76562 -1.76562,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.98438 0,-0.71875 0.32813,-1.29687 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.35938 1.1875,-0.54688 0.46875,-0.125 1.45312,-0.25 1.98438,-0.23437 2.92188,-0.5625 0.0156,-0.34375 0.0156,-0.42187 0,-1 -0.46875,-1.42188 -0.625,-0.54687 -1.875,-0.54687 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.42187 l -1.60938,-0.21875 q 0.21875,-1.01562 0.71875,-1.64062 0.5,-0.64063 1.45313,-0.98438 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01562,0.29688 0.78125,0.28125 1.14063,0.73437 0.375,0.4375 0.51562,1.10938 0.0781,0.42187 0.0781,1.51562 v 2.1875 q 0,2.28125 0.10937,2.89063 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.51563 -0.32813,-1.1875 z m -0.14062,-3.67188 q -0.89063,0.375 -2.67188,0.625 -1.01562,0.14063 -1.4375,0.32813 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.42188 1.09375,-1.14063 0.26563,-0.5625 0.26563,-1.64062 z m 10.5163,1.3125 1.60937,0.21875 q -0.26562,1.65625 -1.35937,2.60938 -1.07813,0.9375 -2.67188,0.9375 -1.98437,0 -3.1875,-1.29688 -1.20312,-1.29687 -1.20312,-3.71875 0,-1.57812 0.51562,-2.75 0.51563,-1.17187 1.57813,-1.75 1.0625,-0.59375 2.3125,-0.59375 1.57812,0 2.57812,0.79688 1,0.79687 1.28125,2.26562 l -1.59375,0.23438 q -0.23437,-0.96875 -0.8125,-1.45313 -0.57812,-0.5 -1.39062,-0.5 -1.23438,0 -2.01563,0.89063 -0.78125,0.89062 -0.78125,2.8125 0,1.95312 0.75,2.84375 0.75,0.875 1.95313,0.875 0.96875,0 1.60937,-0.59375 0.65625,-0.59375 0.82813,-1.82813 z m 3.01562,3.54688 v -13.35938 h 1.64063 v 4.79688 q 1.14062,-1.32813 2.89062,-1.32813 1.07813,0 1.85938,0.42188 0.79687,0.42187 1.14062,1.17187 0.34375,0.75 0.34375,2.17188 v 6.125 h -1.64062 v -6.125 q 0,-1.23438 -0.53125,-1.79688 -0.53125,-0.5625 -1.51563,-0.5625 -0.71875,0 -1.35937,0.39063 -0.64063,0.375 -0.92188,1.01562 -0.26562,0.64063 -0.26562,1.78125 V 149.92 Z m 10.37573,-11.46875 v -1.89063 h 1.64063 v 1.89063 z m 0,11.46875 v -9.67188 h 1.64063 V 149.92 Z m 4.14484,0 v -9.67188 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07812,-1.59375 0.875,0 1.60938,0.3125 0.73437,0.3125 1.09375,0.82813 0.375,0.5 0.51562,1.20312 0.0937,0.45313 0.0937,1.59375 V 149.92 h -1.64062 v -5.89063 q 0,-1 -0.20313,-1.48437 -0.1875,-0.5 -0.67187,-0.79688 -0.48438,-0.29687 -1.14063,-0.29687 -1.04687,0 -1.8125,0.67187 -0.75,0.65625 -0.75,2.51563 V 149.92 Z m 17.00073,-3.10938 1.6875,0.20313 q -0.40625,1.48437 -1.48437,2.3125 -1.07813,0.8125 -2.76563,0.8125 -2.125,0 -3.375,-1.29688 -1.23437,-1.3125 -1.23437,-3.67187 0,-2.45313 1.25,-3.79688 1.26562,-1.34375 3.26562,-1.34375 1.9375,0 3.15625,1.32813 1.23438,1.3125 1.23438,3.70312 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.45313 0.8125,0.84375 2.01562,0.84375 0.90625,0 1.54688,-0.46875 0.64062,-0.48438 1.01562,-1.51563 z m -5.39062,-2.65625 h 5.40625 q -0.10938,-1.21875 -0.625,-1.82812 -0.78125,-0.95313 -2.03125,-0.95313 -1.125,0 -1.90625,0.76563 -0.76563,0.75 -0.84375,2.01562 z"
+ id="path178"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="m 458.99213,183 h 142.99213 v 60 H 458.99213 Z"
+ id="path180"
+ inkscape:connector-curvature="0"
+ style="fill:#fff2cc;fill-rule:evenodd" />
+ <path
+ d="m 458.99213,183 h 142.99213 v 60 H 458.99213 Z"
+ id="path182"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="m 493.48032,191.50394 h 74.01572 v 42.99213 h -74.01572 z"
+ id="path184"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 503.94907,218.42393 v -13.35937 h 5.92187 q 1.78125,0 2.7031,0.35937 0.9375,0.35938 1.48437,1.28125 0.5625,0.90625 0.5625,2.01563 0,1.40625 -0.92187,2.39062 -0.92188,0.96875 -2.84372,1.23438 0.70312,0.34375 1.07812,0.67187 0.7656,0.70313 1.4531,1.76563 l 2.32812,3.64062 h -2.21875 l -1.76559,-2.78125 q -0.78125,-1.20312 -1.28125,-1.82812 -0.5,-0.64063 -0.90625,-0.89063 -0.39063,-0.26562 -0.79688,-0.35937 -0.29687,-0.0781 -0.98437,-0.0781 h -2.04688 v 5.9375 z m 1.76562,-7.45312 h 3.79688 q 1.21875,0 1.89062,-0.25 0.68747,-0.26563 1.04685,-0.8125 0.35937,-0.54688 0.35937,-1.1875 0,-0.95313 -0.6875,-1.5625 -0.68747,-0.60938 -2.18747,-0.60938 h -4.21875 z m 11.14481,0.95312 q 0,-3.32812 1.78125,-5.20312 1.78125,-1.89063 4.60938,-1.89063 1.84375,0 3.32812,0.89063 1.48438,0.875 2.26563,2.46875 0.78125,1.57812 0.78125,3.57812 0,2.03125 -0.82813,3.64063 -0.8125,1.59375 -2.3125,2.42187 -1.5,0.82813 -3.25,0.82813 -1.875,0 -3.35937,-0.90625 -1.48438,-0.92188 -2.25,-2.5 -0.76563,-1.57813 -0.76563,-3.32813 z m 1.8125,0.0156 q 0,2.42187 1.29688,3.8125 1.29687,1.39062 3.26562,1.39062 2,0 3.28125,-1.40625 1.28125,-1.40625 1.28125,-3.98437 0,-1.625 -0.54687,-2.84375 -0.54688,-1.21875 -1.60938,-1.875 -1.0625,-0.67188 -2.375,-0.67188 -1.89062,0 -3.25,1.29688 -1.34375,1.28125 -1.34375,4.28125 z m 13.18329,6.48437 v -13.35937 h 2.65625 l 3.15625,9.45312 q 0.4375,1.32813 0.64062,1.98438 0.23438,-0.73438 0.70313,-2.14063 l 3.20312,-9.29687 h 2.375 v 13.35937 h -1.70312 v -11.17187 l -3.875,11.17187 h -1.59375 l -3.85938,-11.375 v 11.375 z"
+ id="path186"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ <path
+ d="M 278.50394,188.49606 300,167 v 10.74803 H 405.48032 V 167 l 21.49606,21.49606 -21.49606,21.49606 V 199.24409 H 300 v 10.74803 z"
+ id="path188"
+ inkscape:connector-curvature="0"
+ style="fill:#cfe2f3;fill-rule:evenodd" />
+ <path
+ d="M 278.50394,188.49606 300,167 v 10.74803 H 405.48032 V 167 l 21.49606,21.49606 -21.49606,21.49606 V 199.24409 H 300 v 10.74803 z"
+ id="path190"
+ inkscape:connector-curvature="0"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+ <path
+ d="M 322.00787,140.98425 H 381 v 37.00787 h -58.99213 z"
+ id="path192"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+ <path
+ d="m 331.85162,163.60738 1.65625,-0.14063 q 0.125,1 0.54688,1.64063 0.4375,0.64062 1.34375,1.04687 0.92187,0.39063 2.0625,0.39063 1,0 1.78125,-0.29688 0.78125,-0.29687 1.15625,-0.8125 0.375,-0.53125 0.375,-1.15625 0,-0.625 -0.375,-1.09375 -0.35938,-0.46875 -1.1875,-0.79687 -0.54688,-0.20313 -2.39063,-0.64063 -1.82812,-0.45312 -2.5625,-0.84375 -0.96875,-0.5 -1.4375,-1.23437 -0.46875,-0.75 -0.46875,-1.67188 0,-1 0.57813,-1.875 0.57812,-0.89062 1.67187,-1.34375 1.10938,-0.45312 2.45313,-0.45312 1.48437,0 2.60937,0.48437 1.14063,0.46875 1.75,1.40625 0.60938,0.92188 0.65625,2.09375 l -1.6875,0.125 q -0.14062,-1.26562 -0.9375,-1.90625 -0.78125,-0.65625 -2.3125,-0.65625 -1.60937,0 -2.34375,0.59375 -0.73437,0.59375 -0.73437,1.42188 0,0.71875 0.53125,1.17187 0.5,0.46875 2.65625,0.96875 2.15625,0.48438 2.95312,0.84375 1.17188,0.53125 1.71875,1.35938 0.5625,0.82812 0.5625,1.90625 0,1.0625 -0.60937,2.01562 -0.60938,0.9375 -1.75,1.46875 -1.14063,0.51563 -2.57813,0.51563 -1.8125,0 -3.04687,-0.53125 -1.21875,-0.53125 -1.92188,-1.59375 -0.6875,-1.0625 -0.71875,-2.40625 z m 12.44357,0 1.65625,-0.14063 q 0.125,1 0.54688,1.64063 0.4375,0.64062 1.34375,1.04687 0.92187,0.39063 2.0625,0.39063 1,0 1.78125,-0.29688 0.78125,-0.29687 1.15625,-0.8125 0.375,-0.53125 0.375,-1.15625 0,-0.625 -0.375,-1.09375 -0.35938,-0.46875 -1.1875,-0.79687 -0.54688,-0.20313 -2.39063,-0.64063 -1.82812,-0.45312 -2.5625,-0.84375 -0.96875,-0.5 -1.4375,-1.23437 -0.46875,-0.75 -0.46875,-1.67188 0,-1 0.57813,-1.875 0.57812,-0.89062 1.67187,-1.34375 1.10938,-0.45312 2.45313,-0.45312 1.48437,0 2.60937,0.48437 1.14063,0.46875 1.75,1.40625 0.60938,0.92188 0.65625,2.09375 l -1.6875,0.125 q -0.14062,-1.26562 -0.9375,-1.90625 -0.78125,-0.65625 -2.3125,-0.65625 -1.60937,0 -2.34375,0.59375 -0.73437,0.59375 -0.73437,1.42188 0,0.71875 0.53125,1.17187 0.5,0.46875 2.65625,0.96875 2.15625,0.48438 2.95312,0.84375 1.17188,0.53125 1.71875,1.35938 0.5625,0.82812 0.5625,1.90625 0,1.0625 -0.60937,2.01562 -0.60938,0.9375 -1.75,1.46875 -1.14063,0.51563 -2.57813,0.51563 -1.8125,0 -3.04687,-0.53125 -1.21875,-0.53125 -1.92188,-1.59375 -0.6875,-1.0625 -0.71875,-2.40625 z m 13.09983,4.29687 v -13.35937 h 1.76562 v 5.48437 h 6.9375 v -5.48437 h 1.76563 v 13.35937 h -1.76563 v -6.29687 h -6.9375 v 6.29687 z"
+ id="path194"
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero" />
+ </g>
+ <rect
+ id="rect206"
+ width="539.98425"
+ height="172"
+ x="0.6355896"
+ y="6.3559341" />
+ <rect
+ id="rect208"
+ width="539.98425"
+ height="172"
+ x="0.6355896"
+ y="6.3559341" />
+ <rect
+ id="rect212"
+ width="540.95764"
+ height="185.23334"
+ x="0"
+ y="0" />
+</svg>
diff --git a/util/ubertest/ubertest.sh b/util/ubertest/ubertest.sh
new file mode 100755
index 0000000..e64daf7
--- /dev/null
+++ b/util/ubertest/ubertest.sh
@@ -0,0 +1,935 @@
+#!/bin/sh
+#
+# Copyright (C) 2016 Google Inc.
+# Copyright (C) 2020 Facebook Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+RC=$EXIT_SUCCESS
+FATAL=0
+NONFATAL=1
+
+#
+# Stuff obtained from command-line
+#
+
+# Generic options
+BACKUP_IMAGE=""
+OLD_FLASHROM=""
+NEW_FLASHROM=""
+NO_CLEAN=0
+SKIP_CONSISTENCY_CHECK=0
+UPLOAD_RESULTS=0
+
+# LOCAL_FLASHROM is required if both a secondary programmer *and* a remote host
+# are used since OLD_FLASHROM and NEW_FLASHROM will be called on the remote
+# host and we need a local copy of flashrom to control the secondary programmer.
+# By default this will be set to the result of `which flashrom`.
+LOCAL_FLASHROM=""
+
+# Primary/Secondary programmer options
+PRIMARY_OPTS=""
+SECONDARY_OPTS=""
+
+# Calls preflash_hook() and postflash_hook() before and after doing a command.
+CUSTOM_HOOKS_FILENAME=""
+
+# logfile to store the script's output
+SCRIPT_LOGFILE="flashrom-test_script_output.txt"
+
+# Test type
+TEST_TYPE_UNKNOWN=0
+TEST_TYPE_SINGLE=1
+TEST_TYPE_ENDURANCE=2
+TEST_TYPE=$TEST_TYPE_UNKNOWN
+
+# Region modes
+REGION_MODE_UNKNOWN=0
+REGION_MODE_CLOBBER=1
+REGION_MODE_DESCRIPTOR=2
+REGION_MODE_FLASHMAP=3
+REGION_MODE_LAYOUT=4
+REGION_MODE=$REGION_MODE_UNKNOWN
+DESCRIPTOR_REGION="BIOS"
+FLASHMAP_REGION="RW_SECTION_A"
+LAYOUT_FILE=""
+LAYOUT_REGION="RW"
+SMALL_REGION=0
+
+# Remote testing options
+SSH_PORT=""
+REMOTE_HOST=""
+REMOTE_PORT_OPTION=""
+REMOTE_ONLY=0
+REMOTE_PROGRAMMER_PARAMS=""
+SSH_CMD="ssh $REMOTE_PORT_OPTION root@${REMOTE_HOST} command -v"
+
+LOCAL=0
+REMOTE=1
+DO_REMOTE=0 # boolean to use for cmd() and tests
+
+# relative path from flashrom root directory
+TEST_SCRIPT_PATH="util/testing/test_v2.1.sh"
+
+# In case we need to run flashrom locally and we're not already root.
+SUDO_CMD=""
+if [ "$(id -u)" -ne "0" ]; then
+ SUDO_CMD="sudo"
+fi
+
+# 1KB
+K=1024
+
+show_help() {
+ printf "Usage:
+ ${0} <options>
+
+General options:
+ -b, --backup-image <path>
+ Backup image to write unconditionally at end of testing.
+ -h, --help
+ Show this message.
+ -l, --layout-file <path>
+ Layout file (required if mode is \"layout\", resides locally).
+ -m, --mode <arg>
+ Region access mode (clobber, descriptor, flashmap, layout).
+ -n, --new <path>
+ Path to new version of flashrom.
+ -o, --old <path>
+ Path to old (stable) version of flashrom.
+ -p, --primary-programmer <parameters>
+ Primary programmer options.
+ -r, --remote-host <host>
+ Remote host to test primary programmer on.
+ -s, --secondary-programmer <parameters>
+ Secondary programmer options.
+ -t, --type <arg>
+ Test type (single, endurance).
+ -u, --upload-results
+ Upload results to flashrom.org.
+ -v, --voltage
+ Chip voltage in millivolts (usually 1800 or 3300).
+
+Long options:
+ --custom-hooks <filename>
+ Supply a script with custom hooks to run before and after commands.
+ --descriptor-region <name>
+ Specify region to use in descriptor mode (default: $DESCRIPTOR_REGION)
+ --flashmap-region <name>
+ Specify region to use in flashmap mode (default: $FLASHMAP_REGION)
+ --layout-region <name>
+ Specify region to use in layout mode (default: $LAYOUT_REGION)
+ --local-flashrom <path>
+ Path to local version of flashrom when using both a secondary programmer
+ and remote host (default: $($SUDO_CMD which flashrom))
+ --no-clean
+ Do not remove temporary files.
+ --skip-consistency-check
+ Skip the consistency check (two consecutive reads) at beginning.
+ --small-region
+ Omit tests that require large amounts of space (>16KB).
+Remote connectivity options:
+ --ssh-port <port>
+ Use a specific SSH port.
+
+See documentation for usage examples (TODO: Migrate https://goo.gl/3jNoL7
+to flashrom wiki).\n
+"
+}
+
+getopt -T
+if [ $? -ne 4 ]; then
+ printf "GNU-compatible getopt(1) required.\n"
+ exit $EXIT_FAILURE
+fi
+
+LONGOPTS="backup-image:,help,,new:,old:,remote-host:,upload-results:"
+LONGOPTS="${LONGOPTS},primary-programmer:,secondary-programmer:,local-flashrom:"
+LONGOPTS="${LONGOPTS},custom-hooks:,mode:,skip-consistency-check,small-region"
+LONGOPTS="${LONGOPTS},type:,voltage:"
+LONGOPTS="${LONGOPTS},layout-file:,descriptor-region:,flashmap-region:,layout-region:"
+LONGOPTS="${LONGOPTS},no-clean"
+LONGOPTS="${LONGOPTS},ssh-port:"
+
+ARGS=$(getopt -o b:hl:m:n:o:p:r:s:t:u -l "$LONGOPTS" -n "$0" -- "$@");
+if [ $? != 0 ] ; then printf "Terminating...\n" >&2 ; exit 1 ; fi
+eval set -- "$ARGS"
+while true ; do
+ case "$1" in
+ # Generic options
+ -b|--backup-image)
+ shift
+ BACKUP_IMAGE="$1"
+ ;;
+ -h|--help)
+ show_help
+ exit $EXIT_SUCCESS
+ ;;
+ -l|--layout-file)
+ shift
+ LAYOUT_FILE="$1"
+ ;;
+ -m|--mode)
+ shift
+ if [ "$1" = "clobber" ]; then
+ REGION_MODE=$REGION_MODE_CLOBBER
+ elif [ "$1" = "descriptor" ]; then
+ REGION_MODE=$REGION_MODE_DESCRIPTOR
+ elif [ "$1" = "flashmap" ]; then
+ REGION_MODE=$REGION_MODE_FLASHMAP
+ elif [ "$1" = "layout" ]; then
+ REGION_MODE=$REGION_MODE_LAYOUT
+ else
+ printf "Unknown mode: $1\n"
+ exit $EXIT_FAILURE
+ fi
+ ;;
+ -n|--new)
+ shift
+ NEW_FLASHROM="$1"
+ ;;
+ -o|--old)
+ shift
+ OLD_FLASHROM="$1"
+ ;;
+ -p|--primary_programmer)
+ shift
+ PRIMARY_OPTS="-p $1"
+ ;;
+ -s|--secondary_programmer)
+ shift
+ SECONDARY_OPTS="-p $1"
+ ;;
+ -t|--type)
+ shift
+ if [ "$1" = "single" ]; then
+ TEST_TYPE=$TEST_TYPE_SINGLE
+ elif [ "$1" = "endurance" ]; then
+ TEST_TYPE=$TEST_TYPE_ENDURANCE
+ else
+ printf "Unknown type: $1\n"
+ exit $EXIT_FAILURE
+ fi
+ ;;
+ -r|--remote-host)
+ DO_REMOTE=1
+ shift
+ REMOTE_HOST="$1"
+ ;;
+ -u|--upload-results)
+ UPLOAD_RESULTS=1
+ ;;
+ -v|--voltage)
+ shift
+ VOLTAGE="$1"
+ ;;
+
+ # Longopts only
+ --custom-hooks)
+ shift
+ CUSTOM_HOOKS_FILENAME="$1"
+ ;;
+ --descriptor-region)
+ shift
+ DESCRIPTOR_REGION="$1"
+ ;;
+ --flashmap-region)
+ shift
+ FLASHMAP_REGION="$1"
+ ;;
+ --layout-region)
+ shift
+ LAYOUT_REGION="$1"
+ ;;
+ --local-flashrom)
+ shift
+ LOCAL_FLASHROM="$1"
+ ;;
+ --no-clean)
+ NO_CLEAN=1
+ ;;
+ --skip-consistency-check)
+ SKIP_CONSISTENCY_CHECK=1
+ ;;
+ --small-region)
+ SMALL_REGION=1
+ ;;
+
+ # Remote testing options
+ --ssh-port)
+ shift
+ REMOTE_PORT_OPTION="-p $1"
+ ;;
+
+ # error handling
+ --)
+ shift
+ if [ -n "$*" ]; then
+ printf "Non-option parameters detected: '$*'\n"
+ exit $EXIT_FAILURE
+ fi
+ break
+ ;;
+ *)
+ printf "error processing options at '$1'\n"
+ exit $EXIT_FAILURE
+ esac
+ shift
+done
+
+# TODO: Implement this.
+if [ $UPLOAD_RESULTS -eq 1 ]; then
+ printf "TODO: Implement ability to upload results.\n"
+ exit $EXIT_FAILURE
+fi
+
+#
+# Source helper scripts
+#
+export REMOTE_HOST REMOTE_PORT_OPTION
+export LOCAL REMOTE FATAL NONFATAL EXIT_SUCCESS EXIT_FAILURE
+export CUSTOM_HOOKS_FILENAME SUDO_CMD VOLTAGE
+. "$(pwd)/util/testing/cmd.sh"
+
+# We will set up a logs directory within the tmpdirs to store
+# all output logs.
+LOGS="logs"
+
+# Setup temporary working directories:
+# LOCAL_TMPDIR: Working directory on local host.
+# REMOTE_TMPDIR: Working directory on remote host.
+# TMPDIR: The temporary directy in which we do most of the work. This is
+# convenient for commands that depend on $DO_REMOTE.
+LOCAL_TMPDIR=$(mktemp -d --tmpdir flashrom_test.XXXXXXXX)
+if [ $? -ne 0 ] ; then
+ printf "Could not create temporary directory\n"
+ exit $EXIT_FAILURE
+fi
+mkdir "${LOCAL_TMPDIR}/${LOGS}"
+
+if [ $DO_REMOTE -eq 1 ]; then
+ REMOTE_TMPDIR=$(ssh root@${REMOTE_HOST} mktemp -d --tmpdir flashrom_test.XXXXXXXX)
+ if [ $? -ne 0 ] ; then
+ printf "Could not create temporary directory\n"
+ exit $EXIT_FAILURE
+ fi
+ scmd $REMOTE "mkdir ${REMOTE_TMPDIR}/${LOGS}"
+fi
+
+if [ $DO_REMOTE -eq 0 ]; then
+ TMPDIR="$LOCAL_TMPDIR"
+else
+ TMPDIR="$REMOTE_TMPDIR"
+fi
+
+#
+# Test command-line validity.
+#
+if [ $TEST_TYPE -eq $TEST_TYPE_UNKNOWN ]; then
+ printf "Must specify a test type (-t/--type).\n"
+ exit $EXIT_FAILURE
+elif [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
+ if [ $REGION_MODE -eq $REGION_MODE_UNKNOWN ]; then
+ printf "Must specify a region access mode (-m/--mode).\n"
+ exit $EXIT_FAILURE
+ elif [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
+ if [ -z "$LAYOUT_FILE" ]; then
+ printf "Must specify a layout file when using layout mode.\n"
+ exit $EXIT_FAILURE
+ fi
+
+ scmd $DO_REMOTE "stat $LAYOUT_FILE"
+ if [ $? -ne 0 ]; then
+ if [ $DO_REMOTE -eq 1 ]; then
+ tmp=" on remote host $REMOTE_HOST."
+ else
+ tmp=" on local host."
+ fi
+ printf "Layout file $LAYOUT_FILE not found${tmp}\n"
+ exit $EXIT_FAILURE
+ fi
+
+ if [ $DO_REMOTE -eq 1 ]; then
+ scp root@"${REMOTE_HOST}:$LAYOUT_FILE" "${LOCAL_TMPDIR}/" 2>&1 >/dev/null
+ else
+ cp "$LAYOUT_FILE" "${LOCAL_TMPDIR}/"
+ fi
+ fi
+fi
+
+if [ -n "$VOLTAGE" ]; then
+ echo "$VOLTAGE" | grep -q '[^0-9]'
+ if [ $? -ne 1 ]; then
+ printf "Voltage must be an integer with units of millivolts."
+ exit $EXIT_FAILURE
+ fi
+fi
+
+if [ $DO_REMOTE -eq 1 ]; then
+ # Test connection to remote host
+ test_cmd $DO_REMOTE "ls /" $NONFATAL
+ if [ $? -ne 0 ]; then
+ printf "Could not connect to remote host ${REMOTE_HOST}\n"
+ exit $EXIT_FAILURE
+ fi
+fi
+
+# Remote host and secondary programmer are in use, so either the user must
+# specify a local version of flashrom to control the secondary programmer
+# or it must be found in the default path.
+if [ $DO_REMOTE -eq 1 ] && [ -n "$SECONDARY_OPTS" ]; then
+ if [ -z "$LOCAL_FLASHROM" ]; then
+ LOCAL_FLASHROM="$($SUDO_CMD which flashrom)"
+ fi
+
+ if [ ! -e "$LOCAL_FLASHROM" ]; then
+ printf "$LOCAL_FLASHROM does not exist\n"
+ exit $EXIT_FAILURE
+ fi
+fi
+
+#
+# Dependencies
+#
+
+# cmp is used to compare files
+test_cmd $DO_REMOTE "cmp" $FATAL
+
+if [ ! -e "/dev/urandom" ]; then
+ printf "This script uses /dev/urandom\n"
+ exit $EXIT_FAILURE
+fi
+
+if [ ! -e "/dev/zero" ]; then
+ printf "This script uses /dev/zero\n"
+ exit $EXIT_FAILURE
+fi
+
+#
+# Setup.
+#
+
+# Naive path check
+if [ ! -e "$TEST_SCRIPT_PATH" ] ; then
+ printf "Script must be run from root of flashrom directory\n"
+ exit $EXIT_FAILURE
+fi
+
+if [ -z "$OLD_FLASHROM" ]; then
+ if [ $DO_REMOTE -eq 1 ]; then
+ OLD_FLASHROM="$(ssh root@${REMOTE_HOST} which flashrom)"
+ else
+ OLD_FLASHROM="$($SUDO_CMD which flashrom)"
+ fi
+fi
+test_cmd $DO_REMOTE "$OLD_FLASHROM --help" $NONFATAL
+if [ $? -ne 0 ]; then
+ printf "Old flashrom binary is not usable.\n"
+ exit $EXIT_FAILURE
+fi
+
+# print $1 and store it in the script log file
+print_and_log()
+{
+ printf "$1" | tee -a "${LOCAL_TMPDIR}/${LOGS}/${SCRIPT_LOGFILE}"
+}
+
+# Copy files from local tmpdir to remote host tmpdir
+copy_to_remote()
+{
+ for F in $@; do
+ scp "${LOCAL_TMPDIR}/${F}" root@"${REMOTE_HOST}:${REMOTE_TMPDIR}" 2>&1 >/dev/null
+ done
+}
+
+# Copy files from remote host tmpdir to local tmpdir
+copy_from_remote()
+{
+ for F in $@; do
+ scp root@"${REMOTE_HOST}:${REMOTE_TMPDIR}/${F}" "${LOCAL_TMPDIR}/" 2>&1 >/dev/null
+ done
+}
+
+# A wrapper for scmd calls to flashrom when we want to log the output
+# $1: 0 ($LOCAL) to run command locally,
+# 1 ($REMOTE) to run remotely if remote host defined
+# $2: arguments to be passed into scmd
+# $3: context of the flashrom call (to be used in the logfile)
+flashrom_log_scmd()
+{
+ local logfile="flashrom-${3}.txt"
+ local rc
+
+ if [ $1 -eq $REMOTE ]; then
+ tmpdir=$REMOTE_TMPDIR
+ else
+ tmpdir=$LOCAL_TMPDIR
+ fi
+
+ scmd $1 "$2 -o ${tmpdir}/${LOGS}/${logfile}"; rc=$?
+ # if the call was successful, we don't want to save the log (only save failure logs)
+ if [ $rc -eq $EXIT_SUCCESS ]; then
+ scmd $1 "rm -f ${tmpdir}/${LOGS}/${logfile}"
+ else
+ # if the log was stored remotely, we want to copy it over to local tmpdir
+ if [ $1 -eq $REMOTE ]; then
+ scp root@"${REMOTE_HOST}:${REMOTE_TMPDIR}/${LOGS}/${logfile}" "${LOCAL_TMPDIR}/${LOGS}" 2>&1 >/dev/null
+ fi
+ fi
+
+ return $rc
+}
+
+# Read current image as backup in case one hasn't already been specified.
+if [ -z "$BACKUP_IMAGE" ]; then
+ backup_file="backup.bin"
+ if [ $DO_REMOTE -eq 1 ]; then
+ BACKUP_IMAGE="${REMOTE_TMPDIR}/${backup_file}"
+ else
+ BACKUP_IMAGE="${LOCAL_TMPDIR}/${backup_file}"
+ fi
+
+ print_and_log "Reading backup image..."
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $BACKUP_IMAGE" "read_backup"
+
+ if [ $? -ne 0 ]; then
+ print_and_log "Failed to read backup image, aborting.\n"
+ exit $EXIT_FAILURE
+ fi
+
+ if [ $DO_REMOTE -eq 1 ]; then
+ copy_from_remote "$backup_file"
+ fi
+else
+ if [ $DO_REMOTE -eq 1 ]; then
+ scmd $DO_REMOTE "cp $BACKUP_IMAGE $REMOTE_TMPDIR"
+ copy_from_remote "$(basename $BACKUP_IMAGE)"
+ fi
+fi
+
+# The copy of flashrom to test. If unset, we'll assume the user wants to test
+# a newly built flashrom binary in the current directory.
+if [ -z "$NEW_FLASHROM" ] ; then
+ if [ -x "flashrom" ]; then
+ NEW_FLASHROM="flashrom"
+ else
+ print_and_log "Must supply new flashrom version to test\n"
+ exit $EXIT_FAILURE
+ fi
+fi
+
+print_and_log "Stable flashrom binary: ${OLD_FLASHROM}\n"
+print_and_log "New flashrom binary to test: ${NEW_FLASHROM}\n"
+print_and_log "Local temporary files will be stored in ${LOCAL_TMPDIR}\n"
+if [ $DO_REMOTE -eq 1 ]; then
+ print_and_log "Remote temporary files will be stored in ${REMOTE_HOST}:${REMOTE_TMPDIR}\n"
+ print_and_log "Backup image: ${REMOTE_HOST}:${BACKUP_IMAGE}\n"
+ print_and_log "Backup image also stored at: ${LOCAL_TMPDIR}/$(basename ${BACKUP_IMAGE})\n"
+else
+ print_and_log "Backup image: ${BACKUP_IMAGE}\n"
+fi
+
+#
+# Now the fun begins.
+#
+cmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS --flash-size" "${LOCAL_TMPDIR}/old_chip_size.txt.orig"
+cmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS --flash-size" "${LOCAL_TMPDIR}/new_chip_size.txt.orig"
+# get rid of banner and other superfluous output from flashrom
+tail -n 1 "${LOCAL_TMPDIR}/old_chip_size.txt.orig" > "${LOCAL_TMPDIR}/old_chip_size.txt"
+tail -n 1 "${LOCAL_TMPDIR}/new_chip_size.txt.orig" > "${LOCAL_TMPDIR}/new_chip_size.txt"
+tmp=$(cat ${LOCAL_TMPDIR}/old_chip_size.txt)
+CHIP_SIZE=$(cat ${LOCAL_TMPDIR}/new_chip_size.txt)
+CHIP_SIZE_KB=$(($CHIP_SIZE / $K))
+CHIP_SIZE_HALF=$(($CHIP_SIZE / 2))
+if [ $CHIP_SIZE -ne $tmp ]; then
+ print_and_log "New flashrom and old flashrom disagree on chip size. Aborting.\n"
+ exit $EXIT_FAILURE
+else
+ print_and_log "Chip size: $CHIP_SIZE_KB KiB\n"
+fi
+
+# Upload results
+#do_upload()
+#{
+# # TODO: implement this
+#}
+
+# Remove temporary files
+do_cleanup()
+{
+ if [ $NO_CLEAN -eq 1 ]; then
+ print_and_log "Skipping cleanup.\n"
+ return $EXIT_SUCCESS
+ fi
+
+ rm -rf "$LOCAL_TMPDIR"
+ if [ -n "$REMOTE_HOST" ]; then
+ ssh root@${REMOTE_HOST} rm -rf "$REMOTE_TMPDIR"
+ fi
+
+ return $EXIT_SUCCESS
+}
+
+# $1: Message to display to user.
+test_fail()
+{
+ print_and_log "$1\n"
+ printf "Skipping cleanup (logs saved).\n"
+ exit $EXIT_FAILURE
+}
+
+write_backup_image()
+{
+ print_and_log "Writing backup image.\n"
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -w $BACKUP_IMAGE" "write_backup"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to write backup image.\n"
+ fi
+}
+
+# Read a region twice and compare results
+# $1: address of region (in bytes)
+# $2: length of region (in bytes)
+double_read_test()
+{
+ local cmp1="${TMPDIR}/read_test1.bin"
+ local cmp2="${TMPDIR}/read_test2.bin"
+ local layout="double_read_test_layout.txt"
+ local len=$(($2 / $K))
+
+ print_and_log "Doing double read test, size: $len KiB\n"
+ # FIXME: Figure out how to do printf remotely...
+ printf "%06x:%06x region\n" $1 $(($1 + $2 - 1)) > "${LOCAL_TMPDIR}/${layout}"
+ if [ $DO_REMOTE -eq 1 ]; then copy_to_remote "$layout" ; fi
+
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -l ${TMPDIR}/${layout} -i region -r ${cmp1}" "double_read_1"
+ # FIXME: second (or maybe third?) read should be done using secondary programmer, if applicable.
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -l ${TMPDIR}/${layout} -i region -r ${cmp2}" "double_read_2"
+ scmd $DO_REMOTE "cmp $cmp1 $cmp2"
+ if [ $? -ne 0 ]; then
+ test_fail "Double-read test failed, aborting."
+ fi
+}
+
+PARTIAL_WRITE_TEST_REGION_SIZE=0
+PARTIAL_WRITE_TEST_ALIGN_SIZE_KB=0
+# FIXME: Hack due to lack of region-sized file handling.
+PARTIAL_WRITE_TEST_REGION_BASE_OFFSET=-1
+
+# helper function to reduce repetitiveness of partial_write_test
+partial_write_test_helper()
+{
+ local test_name="$1"
+ local pattern_offset_kb=$2
+ local pattern_size_kb=$3
+ local hex="$4"
+ local oct=""
+ local base_offset_kb=$(($PARTIAL_WRITE_TEST_REGION_BASE_OFFSET / $K))
+
+ oct="\\$(printf "%03o" $hex)"
+ cp "${LOCAL_TMPDIR}/random_4k_test.bin" "${LOCAL_TMPDIR}/${test_name}.bin"
+ dd if=/dev/zero bs=1k count=${pattern_size_kb} 2>/dev/null | tr "\000" "$oct" > "${LOCAL_TMPDIR}/${hex}_${pattern_size_kb}k.bin"
+
+ while [ $(($(($pattern_offset_kb + $pattern_size_kb)) * $K)) -lt $PARTIAL_WRITE_TEST_REGION_SIZE ]; do
+ dd if="${LOCAL_TMPDIR}/${hex}_${pattern_size_kb}k.bin" of="${LOCAL_TMPDIR}/${test_name}.bin" bs=1k count=$pattern_size_kb seek=$(($base_offset_kb + $pattern_offset_kb)) conv=notrunc 2>/dev/null
+ pattern_offset_kb=$(($pattern_offset_kb + $PARTIAL_WRITE_TEST_ALIGN_SIZE_KB))
+ done
+}
+
+# Regional partial write test. Given a region name, this will write patterns
+# of bytes designed to test corner cases.
+#
+# We assume that eraseable block size can be either 4KB or 64KB and
+# must test for both. For simplicity, we'll assume the region size is
+# at least 256KB.
+#
+# $1: Region name
+partial_write_test()
+{
+ local opts="--noverify-all"
+ local secondary_opts="" # for secondary programmer
+ local region_name="$1"
+ local filename=""
+ local test_num=0
+ local prev_test_num=0
+
+ # FIXME: Hack due to lack of region-sized file handling.
+ if [ $((PARTIAL_WRITE_TEST_REGION_SIZE)) -eq 0 ]; then
+ print_and_log "Size of $region_name unknown\n"
+ return $EXIT_FAILURE
+ fi
+ if [ $((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) -lt 0 ]; then
+ print_and_log "Offset of $region_name is unknown\n"
+ return $EXIT_FAILURE
+ fi
+
+ if [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
+ if [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
+ opts="$opts -l $LAYOUT_FILE"
+ secondary_opts="$opts"
+ elif [ $REGION_MODE -eq $REGION_MODE_CLOBBER ]; then
+ printf "000000:%06x RW\n" $(($CHIP_SIZE - 1)) > "${LOCAL_TMPDIR}/clobber_mode_layout.txt"
+ if [ $DO_REMOTE -eq 1 ]; then
+ copy_to_remote "clobber_mode_layout.txt"
+ fi
+ secondary_opts="$opts -l ${LOCAL_TMPDIR}/clobber_mode_layout.txt"
+ opts="$opts -l ${TMPDIR}/clobber_mode_layout.txt"
+ fi
+ fi
+
+ if [ $SMALL_REGION -eq 1 ]; then
+ PARTIAL_WRITE_TEST_ALIGN_SIZE_KB=16
+ else
+ PARTIAL_WRITE_TEST_ALIGN_SIZE_KB=256
+ fi
+
+ # FIXME: Add sanity checks.
+
+ print_and_log "Doing region-based partial write test on region \"$region_name\"\n"
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -r ${TMPDIR}/${region_name}.bin" "read_region_${region_name}"
+ if [ $DO_REMOTE -eq 1 ]; then
+ copy_from_remote "${region_name}.bin"
+ fi
+
+ if [ $(($PARTIAL_WRITE_TEST_REGION_SIZE % $(($PARTIAL_WRITE_TEST_ALIGN_SIZE_KB)))) -ne 0 ]; then
+ print_and_log "Region $region_name is not aligned to $PARTIAL_WRITE_TEST_ALIGN_SIZE_KB\n"
+ return $EXIT_FAILURE
+ fi
+
+ # Test procedure:
+ # Clobber region with random content first. Then do writes using the
+ # following sequences for each 128KB:
+ # 0-2K : 0x00 (\000) Partial 4KB sector, lower half
+ # 2K-6K : 0x11 (\021) Crossover 4KB sector boundary
+ # 6K-8K : 0x22 (\042) Partial 4KB sector, upper half
+ # 8K-16K : 0x33 (\063) Full 4KB sectors
+ #
+ # Repeat the above sequence for 64KB-aligned sizes
+ # 0-32K : 0x44 (\104) Partial 64KB block, lower half
+ # 32K-96K : 0x55 (\125) Crossover 64KB block boundary
+ # 96K-128K : 0x66 (\146) Partial 64KB block, upper half
+ # 128K-256K : 0x77 (\167) Full 64KB blocks
+
+ test_num=0
+ dd if=/dev/zero of="${LOCAL_TMPDIR}/random_4k_test.bin" bs=1k count=$CHIP_SIZE_KB 2>/dev/null
+ dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_4k_test.bin" bs=4k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((4 * $K)))) seek=$(($((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) / $((4 * $K)))) conv=notrunc 2>/dev/null
+
+ # 0-2K : 0x00 (\000) Partial 4KB sector, lower half
+ partial_write_test_helper "4k_test_${test_num}" 0 2 "0x00"
+ prev_test_num=$test_num
+ test_num=$(($test_num + 1))
+
+ # 2K-6K : 0x11 (\021) Crossover 4KB sector boundary
+ partial_write_test_helper "4k_test_${test_num}" 2 4 "0x11"
+ test_num=$(($test_num + 1))
+
+ # 6K-8K : 0x22 (\042) Partial 4KB sector, upper half
+ partial_write_test_helper "4k_test_${test_num}" 6 2 "0x22"
+ test_num=$(($test_num + 1))
+
+ # 8K-16K : 0x33 (\063) Full 4KB sectors
+ partial_write_test_helper "4k_test_${test_num}" 8 8 "0x33"
+
+ for F in ${LOCAL_TMPDIR}/random_4k_test.bin ${LOCAL_TMPDIR}/4k_test_*.bin ; do
+ filename=$(basename $F)
+ if [ $DO_REMOTE -eq 1 ]; then
+ copy_to_remote $filename
+ fi
+
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -w ${TMPDIR}/${filename}" "write_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to write $filename to $region_name"
+ fi
+
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -v ${TMPDIR}/${filename}" "verify_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to verify write of $filename to $region_name"
+ fi
+
+ if [ -n "$SECONDARY_OPTS" ]; then
+ flashrom_log_scmd $LOCAL "$LOCAL_FLASHROM $SECONDARY_OPTS $secondary_opts -i ${region_name} -v ${LOCAL_TMPDIR}/${filename}" "verify_secondary_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to verify write of $filename to $region_name using secondary programmer"
+ fi
+ fi
+
+ print_and_log "\tWrote $filename to $region_name region successfully.\n"
+ done
+
+ if [ $SMALL_REGION -eq 1 ]; then
+ return $EXIT_SUCCESS
+ fi
+
+ #
+ # Second half: Tests for 64KB chunks
+ #
+ test_num=0
+# dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=128k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((128*$K)))) 2>/dev/null
+ dd if=/dev/zero of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=1k count=$CHIP_SIZE_KB 2>/dev/null
+ dd if=/dev/urandom of="${LOCAL_TMPDIR}/random_64k_test.bin" bs=128k count=$(($PARTIAL_WRITE_TEST_REGION_SIZE / $((128 * $K)))) seek=$(($((PARTIAL_WRITE_TEST_REGION_BASE_OFFSET)) / $((128 * $K)))) conv=notrunc 2>/dev/null
+
+ # 0-32K : 0x44 (\104) Partial 64KB block, lower half
+ partial_write_test_helper "64k_test_${test_num}" 0 32 "0x44"
+ prev_test_num=$test_num
+ test_num=$(($test_num + 1))
+
+ # 32K-96K : 0x55 (\125) Crossover 64KB block boundary
+ partial_write_test_helper "64k_test_${test_num}" 32 64 "0x55"
+ test_num=$(($test_num + 1))
+
+ # 96K-128K : 0x66 (\146) Partial 64KB block, upper half
+ partial_write_test_helper "64k_test_${test_num}" 96 32 "0x66"
+ test_num=$(($test_num + 1))
+
+ # 128K-256K : 0x77 (\167) Full 64KB blocks
+ partial_write_test_helper "64k_test_${test_num}" 128 128 "0x77"
+
+ for F in ${LOCAL_TMPDIR}/random_64k_test.bin ${LOCAL_TMPDIR}/64k_test_*.bin ; do
+ filename=$(basename $F)
+ if [ $DO_REMOTE -eq 1 ]; then
+ copy_to_remote $filename
+ fi
+
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -w ${TMPDIR}/${filename}" "write_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to write $filename to $region_name"
+ fi
+
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS $opts -i ${region_name} -v ${TMPDIR}/${filename}" "verify_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to verify write of $filename to $region_name"
+ fi
+
+ if [ -n "$SECONDARY_OPTS" ]; then
+ flashrom_log_scmd $LOCAL "$LOCAL_FLASHROM $SECONDARY_OPTS $secondary_opts -i ${region_name} -v ${LOCAL_TMPDIR}/${filename}" "verify_secondary_${filename}"
+ if [ $? -ne 0 ]; then
+ test_fail "Failed to verify write of $filename to $region_name using secondary programmer"
+ fi
+ fi
+
+ print_and_log "\tWrote $filename to $region_name region successfully.\n"
+ done
+
+ return $EXIT_SUCCESS
+}
+
+# Before anything else, check to see if Flashrom can succesfully probe
+# for and find the flash chips. If not, we will abort.
+flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS" "verify_probe"
+if [ $? -ne 0 ]; then
+ test_fail "Failed to find flash chips while probing, aborting."
+fi
+
+# Read ROM twice to test for consistency.
+if [ $SKIP_CONSISTENCY_CHECK -eq 0 ]; then
+ double_read_test 0 $CHIP_SIZE
+fi
+
+if [ $TEST_TYPE -eq $TEST_TYPE_SINGLE ]; then
+ if [ $REGION_MODE -eq $REGION_MODE_CLOBBER ]; then
+ random_file="${TMPDIR}/random_${CHIP_SIZE_KB}K.bin"
+ cmp_file="${TMPDIR}/cmp.bin"
+
+ scmd $DO_REMOTE "dd if=/dev/urandom of=${random_file} bs=1k count=${CHIP_SIZE_KB}"
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -w $random_file" "clobber_write"
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $cmp_file" "clobber_verify"
+ scmd $DO_REMOTE "cmp $random_file $cmp_file"
+ if [ $? -ne 0 ]; then
+ write_backup_image
+ test_fail "Failed to clobber entire ROM."
+ fi
+ elif [ $REGION_MODE -eq $REGION_MODE_DESCRIPTOR ]; then
+ # FIXME: Need region-sized file handling or some way to get region info
+ print_and_log "Currently broken due to lack of region-sized file handling."
+ exit $EXIT_FAILURE
+ elif [ $REGION_MODE -eq $REGION_MODE_FLASHMAP ]; then
+ # FIXME: Need region-sized file handling or some way to get region info
+ print_and_log "Currently broken due to lack of region-sized file handling."
+ exit $EXIT_FAILURE
+ elif [ $REGION_MODE -eq $REGION_MODE_LAYOUT ]; then
+ rw_layout=""
+ addr=""
+ end=""
+ size=""
+ size_kb=""
+
+ # Look for a region name with any amount of leading whitespace
+ # and no trailing whitespace or characters.
+ rw_layout=$(grep "\s${LAYOUT_REGION}$" "${LOCAL_TMPDIR}/$(basename $LAYOUT_FILE)" | head -n 1)
+ if [ -z "$rw_layout" ]; then
+ print_and_log "No region matching \"${LAYOUT_REGION}\" found layout file \"${LAYOUT_FILE}\"\n"
+ test_fail ""
+ fi
+
+ addr="0x$(echo "$rw_layout" | cut -d ' ' -f -1 | awk -F ':' '{ print $1 }')"
+ end="0x$(echo "$rw_layout" | cut -d ' ' -f -1 | awk -F ':' '{ print $2 }')"
+ size="$(($end - $addr + 1))"
+ size_kb="$(($size / $K))"
+
+ # FIXME: Hack to make this work without region-sized file handling.
+ PARTIAL_WRITE_TEST_REGION_BASE_OFFSET=$addr
+ PARTIAL_WRITE_TEST_REGION_SIZE=$size
+
+ print_and_log "\"$LAYOUT_REGION\" region address: ${addr}, size: $size_kb KiB\n"
+ partial_write_test "$LAYOUT_REGION"
+ if [ $? -ne 0 ]; then
+ print_and_log "Layout mode test failed\n"
+ RC=$EXIT_FAILURE
+ fi
+ fi
+elif [ $TEST_TYPE -eq $TEST_TYPE_ENDURANCE ]; then
+ iteration=1
+ terminate=0
+ random_file="${TMPDIR}/random_${CHIP_SIZE_KB}K.bin"
+ cmp_file="${TMPDIR}/cmp.bin"
+ # TODO: We can measure how long the tests take on average, throughput, etc.
+ # i.e. { time $NEW_FLASHROM $PRIMARY_OPTS -w $random_file ; } 2>&1 | grep user | cut -f2
+
+ # For this test we want to run clobber mode until failure
+ while [ $terminate -eq 0 ]
+ do
+ print_and_log "Running iteration #${iteration}\n"
+
+ scmd $DO_REMOTE "dd if=/dev/urandom of=${random_file} bs=1k count=${CHIP_SIZE_KB}"
+ flashrom_log_scmd $DO_REMOTE "$NEW_FLASHROM $PRIMARY_OPTS -w $random_file" "endurance_write_${iteration}"
+ flashrom_log_scmd $DO_REMOTE "$OLD_FLASHROM $PRIMARY_OPTS -r $cmp_file" "endurance_verify_${iteration}"
+ scmd $DO_REMOTE "cmp $random_file $cmp_file"
+ if [ $? -ne 0 ]; then
+ terminate=1
+ fi
+ scmd $DO_REMOTE "rm -f $cmp_file $random_file"
+
+ iteration=$(($iteration + 1))
+ done
+
+ # TODO: Determine what to return for the endurance test exit status
+ # i.e. what constitutes a test pass and what constitutes a test fail?
+ print_and_log "Failed on iteration $iteration\n"
+ # TODO - Print performance metrics?
+fi
+
+# restore and cleanup
+write_backup_image
+
+if [ $RC -eq 0 ]; then
+ print_and_log "Test status: PASS\n"
+else
+ print_and_log "Test status: FAIL\n"
+fi
+do_cleanup
+
+exit $RC

To view, visit change 38788. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I1af55d5088c54ee33853009797adbd535a506b49
Gerrit-Change-Number: 38788
Gerrit-PatchSet: 4
Gerrit-Owner: David Hendricks <david.hendricks@gmail.com>
Gerrit-Reviewer: David Hendricks <david.hendricks@gmail.com>
Gerrit-Reviewer: Edward O'Callaghan <quasisec@chromium.org>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@users.sourceforge.net>
Gerrit-MessageType: merged