diff --git a/Doc/AnalysisSoftwareUserGuide.docx b/Doc/AnalysisSoftwareUserGuide.docx
new file mode 100644
index 0000000..be425a8
--- /dev/null
+++ b/Doc/AnalysisSoftwareUserGuide.docx
Binary files differ
diff --git a/Doc/AnalysisSoftwareUserGuide.pdf b/Doc/AnalysisSoftwareUserGuide.pdf
new file mode 100644
index 0000000..f37d595
--- /dev/null
+++ b/Doc/AnalysisSoftwareUserGuide.pdf
Binary files differ
diff --git a/Doc/windows8-hardware-cert-requirements-device.pdf b/Doc/windows8-hardware-cert-requirements-device.pdf
new file mode 100644
index 0000000..2d68524
--- /dev/null
+++ b/Doc/windows8-hardware-cert-requirements-device.pdf
Binary files differ
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..efdef9c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.chromium b/README.chromium
new file mode 100644
index 0000000..77f3ac0
--- /dev/null
+++ b/README.chromium
@@ -0,0 +1,5 @@
+DESCRIPTION="Library for analyzing touch panel validation test results"
+LOCAL_GIT_REPO="https://chromium.googlesource/com/chromiumos/third_party/optofidelity_TPPT_analysis
+LOCAL_BUGSDB="https://crbug.com"
+LICENSE="4-clause BSD"
+LICENSE_FILE="LICENSE"
diff --git a/TPPTAnalysisSW/__init__.py b/TPPTAnalysisSW/__init__.py
new file mode 100644
index 0000000..764351c
--- /dev/null
+++ b/TPPTAnalysisSW/__init__.py
@@ -0,0 +1,27 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+# Version is in the form A.B.C.D
+# A: Fixed to 5 for TnT GT
+# B: UI release version.
+# C: Project ID. Zero for platform.
+# D: Project release version. Zero is initial release to customer.
+__version__ = "5.1.4555.0"
diff --git a/TPPTAnalysisSW/analyzers.py b/TPPTAnalysisSW/analyzers.py
new file mode 100644
index 0000000..f828541
--- /dev/null
+++ b/TPPTAnalysisSW/analyzers.py
@@ -0,0 +1,510 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+#Analysis functions for analyzing measurements
+import numpy as np
+from .settings import settings, precision
+import math
+from collections import deque
+from decimal import Decimal
+import TPPTAnalysisSW.transform2d as transform2d
+from .plotinfo import *
+
+#
+# Rounding
+#
+
+
+def round_dec(number):
+
+    if number is None:
+        return None
+    else:
+        return Decimal.quantize(Decimal(number), precision)
+
+
+def round_dec_array(number_array):
+    rounded = []
+    for item in number_array:
+        rounded.append(Decimal.quantize(Decimal(item), precision))
+
+    return rounded
+
+def float_for_db(value):
+    """
+    Prepare float value for database.
+    Often float values are cast to numpy float or are set to None by default and these
+    are not compatible with e.g. mysql DECIMAL.
+    """
+    if value is None or math.isnan(value):
+        return None
+
+    return float(value)
+
+def float_for_db_array(number_array):
+    rounded = []
+    for item in number_array:
+        rounded.append(float_for_db(item))
+
+    return rounded
+
+#
+# Checking if value is NaN (not a number)
+#
+
+def is_nan(value):
+    return value != value
+
+#
+# Edge analysis for tap and multifinger tap (and others?)
+#
+
+def is_edge_point(point, dutinfo):
+    ''' Checks if given target point is in the edge area of DUT '''
+    # Check if we are in the edge area
+    edge = False
+    if point[0] <= settings['edgelimit']:
+        edge = True
+    elif point[1] <= settings['edgelimit']:
+        edge = True
+    elif point[0] >= dutinfo.dimensions[0] - float(settings['edgelimit']):
+        edge = True
+    elif point[1] >= dutinfo.dimensions[1] - float(settings['edgelimit']):
+        edge = True
+
+    return edge
+
+
+def get_max_error(point, dutinfo):
+    ''' Returns the maximum error for given target point (tests edge area) '''
+    max_error = float('nan')
+    edge = False
+    # Check if we should do edge analysis
+    if settings['edgelimit'] >= 0:
+        edge = is_edge_point(point,dutinfo)
+    if edge:
+        # edge area
+        max_error = settings['edgepositioningerror']
+    else:
+        # Normal point
+        max_error = settings['maxposerror']
+
+    return max_error
+
+#
+# Coordinate transform functions
+#
+
+def panel_to_target(points, dutinfo):
+    """ Maps panel pixel coordinates - (x,y) tuple or list of tuples - to target coordinates. """
+    return panel_to_target_transform(dutinfo).transform(points)
+
+def panel_to_target_angle(angle):
+    """ Maps panel angles (radians) to degrees. """
+    return round_dec(np.degrees(angle))
+
+def panel_to_target_transform(dutinfo):
+    """ Returns the Transform2D object that does the transform from panel to target coordinate system """
+    dimensions = dutinfo.dimensions             # Size of target (in mm)
+    resolution = dutinfo.digitizer_resolution   # Resolution of target (in pixels)
+    offset = dutinfo.offset                     # Offset of panel->target conversion (in mm)
+
+    # First: possible switches
+    tinit = transform2d.Transform2D.identity()
+
+    if dutinfo.switchxy:
+        tinit = tinit + transform2d.Transform2D([[0, 1, 0], [1, 0, 0]])
+    if dutinfo.flipx:
+        # Make a mirroring transform along x-axis
+        tinit = tinit + transform2d.Transform2D([[-1, 0, resolution[0]], [0, 1, 0]])
+    if dutinfo.flipy:
+        tinit = tinit + transform2d.Transform2D([[1, 0, 0], [0, -1, resolution[1]]])
+
+    # Pixels per mm values
+    sx = float(dimensions[0])/float(resolution[0])
+    sy = float(dimensions[1])/float(resolution[1])
+
+    scale = transform2d.Transform2D.scale(sx,sy)
+    toffset = transform2d.Transform2D.offset(offset[0],offset[1])
+
+    transition = tinit + scale + toffset
+
+    return transition
+
+def robot_to_target(points, dutinfo):
+    """Maps robot pixel coordinates - (x,y) tuple or list of tuples - to target coordinates."""
+
+    # Currently does nothing
+    return points
+
+def robot_to_target_angle(angle, dutinfo):
+    """Maps robot angles (degrees) to radians. """
+    # Currently does nothing
+    return angle
+
+def robot_to_target_transform(dutinfo):
+    """ Returns the Transform2D object that does the transform from robot to target coordinate system """
+    # Currently does nothing
+    return transform2d.Transform2D.offset(0,0) # Identity
+
+def target_to_swipe(points, swipe_start, swipe_end):
+    """Maps swipe (target) coordinates - (x,y) tuple or list of tuples - to swipe (length, offset) coordinates."""
+    return target_to_swipe_transform(swipe_start, swipe_end).transform(points)
+
+def target_to_swipe_transform(swipe_start, swipe_end):
+    """ Returns the Transform2D object that does the transform from swipe (target) coordinates to swipe (length, offset) coordinates """
+    direction = (swipe_end[0] - swipe_start[0], swipe_end[1] - swipe_start[1]) # vector swipe start->end
+    angle = math.atan2(direction[1], direction[0]) # Angle of the swipe (start->end)
+    transform = transform2d.Transform2D.offset(-swipe_start[0], -swipe_start[1]) + transform2d.Transform2D.rotate_radians(-angle)
+    return transform
+
+#
+# Test session information functions
+#
+
+def panel_mm_per_pixel(dutinfo):
+    """ Returns the pixels per mm value of the target panel in a tuple (x_resolution, y_resolution) """
+    dimensions = dutinfo.dimensions
+    resolution = dutinfo.digitizer_resolution
+
+    sx = float(dimensions[0])/float(resolution[0])
+    sy = float(dimensions[1])/float(resolution[1])
+
+    return (sx, sy)
+
+#
+# Analysis functions
+#
+
+def analyze_swipe_jitter(points, window_length=10.0):
+    """ Analyzes jitter for swipe points that have been transformed to coordinate system
+        (swipe-direction, perpendicular-to-swipe) with origo at swipe begin and positive x-axle to
+        swipe direction. Jitter is calculated with sliding window of length window_length
+
+        Returns dictionary {'jitters' (list), 'max_jitter', 'backwards_points' (count), 'repeated_points' (count)}
+
+        First point jitter is always None, and in case of
+        backwards movement or repeated measurements jitter is float('nan') to signal failed point """
+
+    assert(window_length > 0.0)
+
+    if len(points) == 0:
+        return{'jitters': [],
+               'jitters_no_none': [],
+               'jitter_avg': float('nan'),
+               'max_jitter': float('nan'),
+               'jitter_stdev': float('nan'),
+               'backwards_points': float('nan'),
+               'repeated_points': float('nan')}
+
+    jitters = []
+    previous_x = None
+    previous_y = None
+    backwards_points = 0
+    repeated_points = 0
+    window = deque()
+    max_jitter = None
+
+    for point in points:
+        if previous_x is None:
+            previous_x = point[0]
+            previous_y = point[1]
+            jitters.append(None)
+            window.append(point)
+        elif point[0] < previous_x:
+            # Backwards movement
+            backwards_points += 1
+            jitters.append(float('nan'))
+        elif point[0] == previous_x and point[1] == previous_y:
+            # Repeated measurement
+            repeated_points += 1
+            jitters.append(float('nan'))
+        else:
+            # Moving forward or at least not backwards...
+            window.append(point)
+            while window[0][0] < (point[0] - window_length):
+                window.popleft() # Can never remove the point itself
+
+            # Find out the minimum and maximum offsets in window
+            offsets = [p[1] for p in window]
+            window_min = min(offsets)
+            window_max = max(offsets)
+            jitter = window_max - window_min        # Peak-to-peak
+            jitters.append(jitter)
+            if max_jitter is None or jitter > max_jitter:
+                max_jitter = jitter
+
+    # None and NaN values need to be removed for statistical calculation.
+    jitters_no_none = [value for value in jitters if value is not None and not math.isnan(value)]
+
+    jitter_avg = None
+    jitter_stdev = None
+
+    if len(jitters_no_none) > 0:
+        jitter_avg = np.mean(jitters_no_none)
+
+        # Jitter is a deviation quantity so the standard deviation is the RMS of jitter values.
+        jitter_stdev = np.sqrt(np.mean(np.power(jitters_no_none, 2)))
+
+    results = {'jitters': jitters,
+               'jitters_no_none': jitters_no_none,
+               'jitter_avg': jitter_avg,
+               'max_jitter': max_jitter,
+               'jitter_stdev': jitter_stdev,
+               'backwards_points': backwards_points,
+               'repeated_points': repeated_points}
+
+    return results
+
+def analyze_swipe_linearity(points):
+    """
+    Calculates linear fit for a single swipe line
+    Determine max, avg, stdev and rms errors from linear fit
+    """
+    if len(points) == 0:
+        results = {'linear_error': [],
+                   'fitted_y': [],
+                   'lin_error_avg': float('nan'),
+                   'lin_error_stdev': float('nan'),
+                   'lin_error_max': float('nan'),
+                   'lin_error_rms': float('nan'),
+                   'linear_fit': []}
+        return results
+
+    x = []
+    y = []
+    for point in points:
+        x.append(point[0])
+        y.append(point[1])
+
+    # Linearfit to fit the data 
+    # Linearcoef has slope (1) and intercept (2)
+    linearcoef = np.polyfit(x, y, 1)
+    linearfit = np.polyval(linearcoef, x)
+
+    # Starndard form of linear equation
+    # ax + by + c = 0
+    a = linearcoef[0]
+    b = -1
+    c = linearcoef[1]
+
+    # Point y-coordinates in the "fitted line coordinate frame" where the fitted line is the x-axis.
+    # These are signed values, not unsigned distances.
+    fitted_y = (a * np.array(x) + b * np.array(y) + c) / math.sqrt(a**2 + b**2)
+
+    # Max deviation calc: orthogonal distance 
+    # from fit line to data set
+    lin_error = np.absolute(fitted_y)
+
+    lin_error_max = max(lin_error)
+    lin_error_avg = np.mean(lin_error)
+    lin_error_rms = np.sqrt(np.mean(np.power(lin_error, 2)))
+
+    # Standard deviation is calculated from the y-coordinates in the "fitted line coordinate frame".
+    # Sample averaging is used so ddof parameter is 1.
+    lin_error_stdev = np.std(fitted_y, ddof=1)
+
+    results = {'linear_error': lin_error.tolist(),
+               'fitted_y': fitted_y.tolist(),
+               'lin_error_avg': lin_error_avg,
+               'lin_error_stdev': lin_error_stdev,
+               'lin_error_max': lin_error_max,
+               'lin_error_rms': lin_error_rms,
+               'linear_fit': linearfit}
+
+    return results
+
+def analyze_swipe_offset(points):
+    '''
+    Calculates statistical values for swipe offset values
+    :param points: list of tuples (distance, offset) on robot
+    drawn line
+    '''
+    if len(points) == 0:
+        return {'offset_mean': float('nan'),
+                'offset_stdev': float('nan'),
+                'offset_max': float('nan'),
+                'offset_rms_mean': float('nan'),
+                'offsets': []}
+
+    offsets = [abs(point[1]) for point in points]
+
+    # Standard deviation is calculated from the signed y-coordinates in the swipe line frame.
+    # Sample averaging is used so ddof parameter is 1.
+    offset_stdev = np.std([point[1] for point in points], ddof=1)
+
+    return {'offset_mean': np.mean(offsets),
+            'offset_stdev': offset_stdev,
+            'offset_max': max(offsets),
+            'offset_rms_mean': np.sqrt(np.mean(np.power(offsets, 2))),
+            'offsets': offsets
+            }
+
+
+
+def calculate_report_rates(points):
+
+    previous_timestamp = 0.0
+    report_rates = []
+
+    for point in points:
+
+        if previous_timestamp == 0.0:
+            previous_timestamp = point.time
+        else:
+            delay = point.time - previous_timestamp
+
+            if delay > 0:
+                report_rate = 1.0 / (delay / 1000.0)
+                report_rates.append(report_rate)
+                previous_timestamp = point.time
+
+    return report_rates
+
+#
+# Multifinger functions
+#
+
+
+def find_closest_id_match(normsdict):
+    """ Finds the closest match for set of ids to an array. Used in the
+        multifinger tap and multifinger swipe. The normsdict is a dictionary,
+        whose keys are the finger_ids from database, and each dictionary element
+        contains array of distances to the points (lines) to which the ids are to be mapped.
+        The function tries to find the closest match from id to a point and returns
+        an array, where each index holds the closest point (line) """
+
+    numids = len(normsdict.keys())
+
+    # Attempt #1: closest point
+    fingerids = None
+    for id, norms in normsdict.items():
+        if fingerids is None:
+            # Only in the first round
+            numpoints = len(norms)
+            fingerids = [None] * numpoints
+
+        mindist = np.argmin(norms)
+        if fingerids[mindist] is None:
+            fingerids[mindist] = [id]
+        else:
+            fingerids[mindist].append(id)
+
+    if fingerids.count(None) == 0 or fingerids.count(None) == numpoints - numids:
+        # We have a match
+        #print "Match from round #1: " + str(fingerids)
+        pass
+    else:
+        # Attempt #2: find the closest match using brute force search. As a norm use minimum of sum of squares
+        # WARNING: This is slow algorithm if number fo finger_ids grows too large...
+        fids = find_smallest_error(normsdict)
+
+        # Found match
+        #print "Match from round #2: " + str(fids)
+        fingerids = fids
+
+    return fingerids
+
+def find_smallest_error(normsdict):
+    """ Finds a best match for least-square matching problem, where each point is
+        referenced only one, or every point has just one id or less """
+
+    # Recursive algorithm using brute force search
+    # Current best norm is used as a threshold - if the norm would be larger, search is not continued
+    ids = list(normsdict.keys())
+    norm, smallest_fids = find_smallest_remaining(normsdict, ids, [None] * len(normsdict[ids[0]]), 0.0, float('inf'))
+
+    return smallest_fids
+
+def find_smallest_remaining(normsdict, unset_ids, fixed_ids, current_norm, threshold_norm):
+    ''' Recursive algorithm: unset_ids are the ids not yet set, fixed ids is the array,
+        to which the ids are set/collected, threshold norm is the norm, after which the calculation is cut off '''
+
+    # Recursion round: take the first id
+    current_id = unset_ids[0]
+    remaining_ids = unset_ids[1:]
+    min_norm = threshold_norm
+    min_ids = None
+
+    for i, dist in enumerate(normsdict[current_id]):
+        if current_norm + dist >= min_norm:
+            # Do not continue calculation -> the result would be larger
+            # than current minimum
+            continue
+
+        # Fix the current id at position i (attempt)
+        new_fixed = list(fixed_ids) # Have to make a copy - lists are mutable
+        if new_fixed[i] is None:
+            new_fixed[i] = [current_id]
+        else:
+            # Check if this attempt would be legal
+            if new_fixed.count(None) > len(remaining_ids):
+                # Not enough ids left to fill the remaining empty places
+                continue
+            new_fixed[i] = list(new_fixed[i]) # Ditto
+            new_fixed[i].append(current_id)
+
+        # Calculate the new norm with this assumption
+        if len(remaining_ids) > 0:
+            new_norm, new_ids = find_smallest_remaining(normsdict, remaining_ids, new_fixed, current_norm + dist**2, min_norm)
+        else:
+            # This was last id
+            new_norm = current_norm + dist**2
+            new_ids = new_fixed
+
+        if new_ids is not None:
+            max_length = max([0 if l is None else len(l) for l in new_ids])
+            if None in new_ids and max_length > 1:
+                # Illegal solution: empty spaces combined with arrays with length > 1
+                pass
+            elif new_norm < min_norm:
+                min_norm = new_norm
+                min_ids = new_ids
+
+    return (min_norm, min_ids)
+
+def bounding_box(vector):
+    """ Returns bounding box for an array of points [[x,y], [x,y], ...] """
+    min_x, min_y = np.min(vector, axis=0)
+    max_x, max_y = np.max(vector, axis=0)
+    return np.array([(min_x, min_y), (max_x, min_y), (max_x, max_y), (min_x, max_y)])
+
+def filter_points(points):
+    """
+    Return list that has only points between the first touch down event and
+    the last touch up event including the touch down and touch up event points.
+    In case either does not exist, returns an empty list.
+    """
+
+    events = [point.event for point in points]
+
+    try:
+        # Index to first instance of touch down event.
+        ix_touch_down = events.index(0)
+
+        # Index to last instance of touch up event.
+        ix_touch_up = len(events) - 1 - events[::-1].index(1)
+    except ValueError: # Raised by index().
+        return []
+
+    return points[ix_touch_down:ix_touch_up+1]
+
diff --git a/TPPTAnalysisSW/base_page.py b/TPPTAnalysisSW/base_page.py
new file mode 100644
index 0000000..3f51bb1
--- /dev/null
+++ b/TPPTAnalysisSW/base_page.py
@@ -0,0 +1,29 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import TPPTAnalysisSW.measurementdb
+import TPPTAnalysisSW.plotters
+
+#Every page inherits this class
+class BasePage(object):
+	def __init__(self):
+		super(BasePage, self).__init__()
diff --git a/TPPTAnalysisSW/copy_testcase.py b/TPPTAnalysisSW/copy_testcase.py
new file mode 100644
index 0000000..590474e
--- /dev/null
+++ b/TPPTAnalysisSW/copy_testcase.py
@@ -0,0 +1,238 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from .measurementdb import *
+import sqlalchemy
+import inspect
+import TPPTAnalysisSW.measurementdb as measurementdb
+
+
+def copy_test(source_path, destination_path, test_id):
+    source_db = ResultDatabase(source_path)
+    destination_db = ResultDatabase(destination_path)
+
+    session = source_db.session()
+
+    # Tables to be fetched:
+    #   "test_item"
+    #     [test_object]
+    #     [test_results] (list)
+    #     "test_result"
+    #   "test_dut"
+    #   "test_type"
+    #   "test_session"
+    #
+    # ???
+    #   "dut_parameters"
+    #   "session_parameters"
+    #   "dut_information_test"
+
+    # Get the test_item, test object, test_result
+    test_item = session.query(TestItem).filter_by(id=test_id).first()
+    if test_item is None:
+        print("Error: test_item with ID", test_id, "not found.")
+        return
+
+    test_object = None
+    test_result = None
+
+    # Get the test object related to this test
+    for name, obj in inspect.getmembers(measurementdb):
+        if inspect.isclass(obj) and hasattr(obj, '__tablename__') and hasattr(obj, 'test_id'):
+            test = session.query(obj).filter_by(test_id=test_item.id).first()
+            if test is not None:
+                if test.__tablename__ == 'test_result':
+                    test_result = test
+                else:
+                    test_object = test
+
+    results = None
+    if test_object is None:
+        print("test_item has no tests")
+    else:
+        # Get the results related to this test
+        for name, obj in inspect.getmembers(measurementdb):
+            if inspect.isclass(obj) and hasattr(obj, '__tablename__'):
+                if hasattr(obj, 'point_id'):
+                    results = session.query(obj).filter_by(point_id=test_object.id).all()
+                    break
+                elif hasattr(obj, 'swipe_id'):
+                    results = session.query(obj).filter_by(swipe_id=test_object.id).all()
+                    break
+
+    test_dut = test_item.dut
+    test_type = test_item.type
+    test_session = test_item.testsession
+
+    dut_parameters = session.query(DutParameters).filter_by(
+        dut_id=test_dut.id).first()
+    session_parameters = session.query(SessionParameters).filter_by(
+        testsession_id=test_session.id).first()
+    dut_information_test = session.query(DUTInformationTest).filter_by(
+        testsession_id=test_session.id).first()
+
+    destination_session = destination_db.session()
+
+    # Remove all object instances from the source session
+    """
+    session.expunge(test_item.testsession)
+    session.expunge(test_item.dut)
+    session.expunge(test_item.type)
+    session.expunge(test_item)
+    session.expunge(test_object)
+    session.expunge(test_result)
+    session.expunge(session_parameters)
+    session.expunge(dut_information_test)
+    session.expunge(dut_parameters)
+    """
+    session.expunge_all()
+
+    if test_item.dut is not None:
+        sqlalchemy.orm.session.make_transient(test_item.dut)
+    if test_item.type is not None:
+        sqlalchemy.orm.session.make_transient(test_item.type)
+    if test_item.testsession is not None:
+        sqlalchemy.orm.session.make_transient(test_item.testsession)
+
+    if dut_parameters is not None:
+        sqlalchemy.orm.session.make_transient(dut_parameters)
+
+    sqlalchemy.orm.session.make_transient(test_item)
+
+    if session_parameters is not None:
+        sqlalchemy.orm.session.make_transient(session_parameters)
+    if dut_information_test is not None:
+        sqlalchemy.orm.session.make_transient(dut_information_test)
+    if test_object is not None:
+        sqlalchemy.orm.session.make_transient(test_object)
+    if test_result is not None:
+        sqlalchemy.orm.session.make_transient(test_result)
+
+    # Change the keys for all tables in order to avoid conflicts, update foreign keys
+
+    # test_dut
+    dest_duts = destination_session.query(TestDUT).all()
+    test_dut.id = get_largest_id(dest_duts) + 1
+
+    # test_type
+    dest_types = destination_session.query(TestType).all()
+    test_type.id = get_largest_id(dest_types) + 1
+
+    # test_session
+    dest_testsessions = destination_session.query(TestSession).all()
+    test_session.id = get_largest_id(dest_testsessions) + 1
+
+    # dut_parameters
+    dest_dutparams = destination_session.query(DutParameters).all()
+    dut_parameters.id = get_largest_id(dest_dutparams) + 1
+    dut_parameters.dut_id = test_dut.id
+
+    # test_item
+    dest_testitems = destination_session.query(TestItem).all()
+    test_item.id = get_largest_id(dest_testitems) + 1
+    try:
+        test_item.dut_id = test_dut.id
+        test_item.testsession_id = test_session.id
+        test_item.testtype_id = test_type.id
+    except:
+        pass
+
+    # session_parameters
+    if session_parameters is not None:
+        dest_session_params = destination_session.query(SessionParameters).all()
+        session_parameters.id = get_largest_id(dest_session_params) + 1
+        session_parameters.testsession_id = test_session.id
+
+    # dut_information_test
+    if dut_information_test is not None:
+        dest_information_tests = destination_session.query(DUTInformationTest).all()
+        dut_information_test.id = get_largest_id(dest_information_tests) + 1
+        dut_information_test.testsession_id = test_session.id
+
+    # [test_object]
+    if test_object is not None:
+        dest_testobjects = destination_session.query(type(test_object)).all()
+        test_object.id = get_largest_id(dest_testobjects) + 1
+        test_object.test_id = test_item.id
+
+    # test_result
+    if test_result is not None:
+        dest_testresult = destination_session.query(TestResult).all()
+        test_result.id = get_largest_id(dest_testresult) + 1
+        test_result.test_id = test_item.id
+
+    # [results]
+    if results is not None:
+        all_results = destination_session.query(type(results[0])).all()
+        largest_id = get_largest_id(all_results)
+        i = 1
+        for r in results:
+            #session.expunge(r)
+            sqlalchemy.orm.session.make_transient(r)
+            r.id = largest_id + i
+            if hasattr(r, 'swipe_id'):
+                r.swipe_id = test_object.id
+            else:
+                r.point_id = test_object.id
+            i += 1
+
+    # Add the tables to the database starting from results
+    if results is not None:
+        destination_session.add_all(results)
+
+    if test_object is not None:
+        destination_session.add(test_object)
+    if test_result is not None:
+        destination_session.add(test_result)
+
+    destination_session.add(dut_parameters)
+    destination_session.add(test_item)
+
+    if session_parameters is not None:
+        destination_session.add(session_parameters)
+    if dut_information_test is not None:
+        destination_session.add(dut_information_test)
+
+    destination_session.add(test_dut)
+    destination_session.add(test_type)
+    destination_session.add(test_session)
+
+    # Done, commit
+    destination_session.commit()
+    print("Test item copied and committed successfully")
+
+
+def get_largest_id(results):
+    largest_id = 0
+    for r in results:
+        if r.id > largest_id:
+            largest_id = r.id
+
+    return largest_id
+
+
+if __name__ == "__main__":
+    path_src = r"C:\Users\hkleme\Downloads\TPPT\J\database_separation.sqlite"
+    path_dst = r"C:\Users\hkleme\Downloads\TPPT\J\database.sqlite"
+    test_id = 2
+
+    copy_test(path_src, path_dst, test_id)
diff --git a/TPPTAnalysisSW/imagefactory.py b/TPPTAnalysisSW/imagefactory.py
new file mode 100644
index 0000000..e143ca0
--- /dev/null
+++ b/TPPTAnalysisSW/imagefactory.py
@@ -0,0 +1,158 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from cherrypy.lib.static import serve_file
+import os.path
+import threading
+import re
+
+import TPPTAnalysisSW.testbase as testbase
+import TPPTAnalysisSW.plotinfo as plotinfo
+from .base_page import BasePage
+import TPPTAnalysisSW.plot_factory as plot_factory
+from .measurementdb import get_database
+from .plot_factory import *
+
+# generator functions for the different images - will be filled by the decorator
+_generators = {}
+
+#decorator class
+class reportimagecreator(object):
+    """ Creates images for the report. Gets the generated image names as parameter """
+
+    _generators = {}
+
+    def __init__(self, *args, **kwargs):
+        self.args = args
+        self.kwargs = kwargs
+        pass
+
+    def __call__(self, f):
+        global _generators
+        for arg in self.args:
+            _generators[arg] = f
+        return f
+
+class ImageFactory(BasePage):
+
+
+    # configuration values, these are the defaults, override in main
+    configuration = { 'static_dir': 'static/img/generated/',
+                      'root_dir': '',
+                    }
+
+    # lock object for the image creation
+    _imagelock = threading.RLock()
+
+    def __init__(self, *args, **kwargs):
+        super(ImageFactory, self).__init__(*args, **kwargs)
+
+    exposed = True
+
+    def GET(self,imagename=None, **kwargs):
+        if imagename is None:
+            error = cherrypy.HTTPError(403)
+            error.set_response()
+            return "Image generator directory browsing disabled"
+
+        # Check if image exists
+        target_name = os.path.join(ImageFactory.configuration['root_dir'], ImageFactory.configuration['static_dir'], imagename)
+        # print "Target: " + target_name
+        force_refresh = ('refresh' in kwargs)
+
+        try:
+            ImageFactory._imagelock.acquire()
+            # Round 1: if image does not exist - check if its currently being generated
+            if not os.path.isfile(target_name) and not force_refresh:
+                #print ">>> Waiting..."
+                plot_factory.waitForPlot()
+                #print ">>> Wait ended..."
+
+            # Round 2: if image still does not exist, generate it
+            if force_refresh or not os.path.isfile(target_name):
+                #print "Generating image " + target_name
+                # Split image name into tokens
+                if imagename.endswith(".png"):
+                    imagename = imagename[:-4]
+                tokens = imagename.split('_')
+
+                # For now: Check if new style generator exists
+                #print str(tokens)
+
+                if len(tokens) > 1:
+                    reportclass = testbase.TestBase.create(tokens[0], **kwargs)[0]
+                    if reportclass:
+                        #print "class found: " + str(reportclass)
+                        reportclass.createimage(target_name, *tokens[1:], **kwargs)
+                    elif tokens[1] in _generators:
+                       _generators[tokens[1]](*tokens)
+                    else:
+                        raise cherrypy.HTTPError(404, "No such image in configuration")
+
+            # Wait for the possible plotting to finish before serving the image because premature serving can create
+            # content length header issues causing the image not to show in browser
+            plot_factory.waitForPlot()
+            return serve_file(target_name, content_type='image/png')
+
+        finally:
+            ImageFactory._imagelock.release()
+
+    @staticmethod
+    def delete_all_images():
+        directory = os.path.join(ImageFactory.configuration['root_dir'], ImageFactory.configuration['static_dir'])
+        files = os.listdir(directory)
+
+        for file in files:
+            # remove only files with the correct name format
+            if re.match("^\d+_\w+", file):
+                os.remove(os.path.join(directory, file))
+
+    @staticmethod
+    def delete_images(test_id):
+        directory = os.path.join(ImageFactory.configuration['root_dir'], ImageFactory.configuration['static_dir'])
+        files = os.listdir(directory)
+
+        for file in files:
+            # remove only files with the correct name format
+            if re.match("%s_\w+" % str(test_id), file):
+                os.remove(os.path.join(directory, file))
+
+        pass
+
+    @staticmethod
+    def create_image_path(test_id, imagename, *args):
+        """ Returns the image name in the filesystem (with full path) """
+        filename = "_".join([str(test_id), str(imagename)])
+        if len(args) > 0:
+            filename += '_' + '_'.join(args)
+        filename = filename + ".png"
+        path = os.path.join(ImageFactory.configuration['root_dir'], ImageFactory.configuration['static_dir'], filename)
+        return path
+
+    @staticmethod
+    def create_image_name(test_id, imagename, *args):
+        """ Returns the image name in the report (with path from the root) """
+        imagename = "_".join([str(test_id), imagename])
+        if len(args) > 0:
+            imagename += '_' + '_'.join(args)
+        return '/img/' + imagename + ".png"
diff --git a/TPPTAnalysisSW/info/__init__.py b/TPPTAnalysisSW/info/__init__.py
new file mode 100644
index 0000000..7a1c127
--- /dev/null
+++ b/TPPTAnalysisSW/info/__init__.py
@@ -0,0 +1,21 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
\ No newline at end of file
diff --git a/TPPTAnalysisSW/info/version.py b/TPPTAnalysisSW/info/version.py
new file mode 100644
index 0000000..51111b1
--- /dev/null
+++ b/TPPTAnalysisSW/info/version.py
@@ -0,0 +1,134 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+class MetaVersion(type):
+    # DON'T CHANGE THE ATTRIBUTE BELOW: These are updated programmatically when
+    # CI builds an installation package.
+    #
+    # _major    -- Major version
+    # _minor    -- Release version increases by one on every public release
+    # _build    -- CI build number increases by one on every CI build (~commit)
+    # _revision -- SVN revision number (VCS used by CI for the build)
+    # _data     -- date of the build
+    #
+    _major = "2"
+    _minor = "0"
+    _build = "0 (rnd)"
+    _revision = "0"
+    _date = ""
+
+    @property
+    def major(cls):
+        """ Major version """
+        return cls._major
+
+    @property
+    def build(cls):
+        """ Build number """
+        return cls._build
+
+    @property
+    def minor(cls):
+        """ Release number """
+        return cls._minor
+
+    @property
+    def revision(cls):
+        """ Revision number """
+        return cls._revision
+
+    @property
+    def date(cls):
+        """ Build date """
+        return cls._date
+
+    @property
+    def simple(cls):
+        """
+        Software version: <major>.<release>
+
+        Access software version from software:
+            #>>> from info.version import Version
+            ... Version.simple
+        """
+        return "%s.%s" % (
+            cls.major,
+            cls.minor)
+
+    @property
+    def software(cls):
+        """
+        Software version: <major>.<release>.<build> rev. <number> [date]
+
+        Access software version from software:
+         from info.version import Version
+            ... Version.software
+        """
+        return "%s.%s.%s rev. %s %s" % (
+            cls.major,
+            cls.minor,
+            cls.build,
+            cls.revision,
+            cls.date)
+
+    @property
+    def api(self):
+        """
+        RESTful API version: <major>.<minor>
+
+        Major -- Change(s) breaking current API increases major number by one:
+
+            * Not backwards compatible
+            * Removing something from API (methods or parameters)
+            * Changing how method functions or meaning of a parameter
+
+        Minor -- Changes(s) adding something to API but not breaking it
+        increases the minor version by one:
+
+            * 100% backwards compatible
+            * Adding new methods (e.g., robot/Move)
+            * Adding new parameters (e.g., robot/Move + x=2)
+
+        API version is always a string. Access from software:
+            #>>> from info.version import Version
+            ... Version.api_version
+
+        """
+        return '1.0'
+
+#
+# Example of API update
+#
+# API 1.2
+#   Finger API:
+#       * Tap [x, y, z, duration]
+#       * DoubleTap [x, y, z, duration, lift, interval]
+#
+class Version(object,  metaclass=MetaVersion):
+    """
+    API 1.0
+        Initial version by Sami Laine
+    """
+
+    #__metaclass__ = MetaVersion
+
+
+__version__ = Version.software
diff --git a/TPPTAnalysisSW/main_page.py b/TPPTAnalysisSW/main_page.py
new file mode 100644
index 0000000..63fc487
--- /dev/null
+++ b/TPPTAnalysisSW/main_page.py
@@ -0,0 +1,218 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+import genshi
+
+from genshi.template import MarkupTemplate
+import sqlalchemy.sql.default_comparator
+import sqlalchemy.ext.baked
+
+import shutil
+import json
+import glob
+import cherrypy
+import os.path
+
+import TPPTAnalysisSW.measurementdb as db
+from .base_page import BasePage
+from .test_session import TestSession
+from .info.version import Version
+from .settings import settings
+import collections
+import TPPTAnalysisSW.progressstatus as progressstatus
+import TPPTAnalysisSW.test_refs as test_refs
+import TPPTAnalysisSW.imagefactory as imagefactory
+
+
+#Main page controller
+class MainPage(BasePage):
+
+    def __init__(self):
+        super(MainPage, self).__init__()
+
+    exposed = True
+
+    def GET(self, *args, **kwargs):
+
+        if "event" in kwargs:
+            cherrypy.response.headers["Content-Type"] = "text/event-stream"
+            cherrypy.response.headers["Transfer-Encoding"] = "identity"
+            return "data: " + str(progressstatus.progress) + "\ndata:\nretry:500\n\n"
+
+        if os.path.isfile("static/AnalysisSoftwareUserGuide.pdf") and os.path.isfile("../../Docs/AnalysisSoftwareUserGuide.pdf"):
+            if os.path.getmtime("static/AnalysisSoftwareUserGuide.pdf") < os.path.getmtime("../../Docs/AnalysisSoftwareUserGuide.pdf"):
+                try:
+                    shutil.copy("../../Docs/AnalysisSoftwareUserGuide.pdf", "static/AnalysisSoftwareUserGuide.pdf")
+                except IOError:
+                    print("Copying user guide failed.")
+        else:
+            try:
+                shutil.copy("../../Docs/AnalysisSoftwareUserGuide.pdf", "static/AnalysisSoftwareUserGuide.pdf")
+            except IOError:
+                print("Copying user guide failed.")
+
+        dbsession = db.get_database().session()
+        testsessions = dbsession.query(db.TestSession).order_by(db.TestSession.id)
+
+        sessions = []
+
+        for ts in testsessions:
+
+            tests, test_in_database, results, curved = TestSession.sessionResultsFromDB(ts, dbsession)
+            if "Error" in results:
+                result = "Error"
+            elif "Fail" in results and "Requires recalculate" not in results:
+                result = "Fail"
+            elif ("N/A" in results or len(results) == 0):
+                result = "N/A"
+            elif "Requires recalculate" in results:
+                result = "Requires recalculate"
+            else:
+                result = "Pass"
+
+            sessions.append((ts, result, TestSession.session_samples_progs_manus(ts, dbsession), curved))
+
+        # Show test sessions
+        pagenumber = 1
+        if ('page' in kwargs):
+            pagenumber = max(1, int(kwargs['page']))
+        sessions_per_page = 30
+        if len(sessions) >= sessions_per_page:
+            latest = sessions[(-1 - sessions_per_page * (pagenumber - 1)):(-sessions_per_page - sessions_per_page * (pagenumber - 1)):-1]
+        else:
+            latest = sessions[::-1]
+
+        files = glob.glob("C:/OptoFidelity/TPPT/*.sqlite")
+        current = db.get_database().dbpath.replace("\\", "/")
+
+        paths = {}
+
+        for f in files:
+            if current == f.replace("\\", "/"):
+                paths[f] = "selected"
+            else:
+                paths[f] = None
+
+        # Tree: Manufacturers - Program
+        manufacturers = self.manufacturers_tree(dbsession, sessions)
+
+        with open("templates/testsessions_index.html") as f:
+            template = MarkupTemplate(f)
+
+            stream = template.generate(latest=latest,
+                                   manufacturers=manufacturers,
+                                   version=Version,
+                                   pagenumber=pagenumber,
+                                   dbfiles=collections.OrderedDict(sorted(paths.items(), key=lambda t: t[0])))
+
+            return stream.render('xhtml', doctype='html5')
+
+    def POST(self, filepath=None, *args, **kwargs):
+        dbsession = db.get_database().session()
+
+        param = ""
+
+        if 'params' in kwargs:
+            param = kwargs['params']
+        elif filepath:
+            test_refs.testclass_refs.clear()
+            imagefactory.ImageFactory.delete_all_images()
+            db.get_database().changeDatabase(filepath)
+            return self.GET()
+
+        if param == "recalculate":
+
+            # clear cache
+            test_refs.testclass_refs.clear()
+            imagefactory.ImageFactory.delete_all_images()
+            dbsessions = dbsession.query(db.TestSession).values(db.TestSession.id)
+            sessionids = [ts[0] for ts in dbsessions]
+            length = len(sessionids)
+            for idx, ts in enumerate(sessionids):
+                TestSession.eval_tests_results(dbsession, ts)
+                if idx == 0:
+                    progressstatus.progress = 0
+                else:
+                    progressstatus.progress = round(idx / float(length), 2)
+
+            progressstatus.progress = 0
+
+            return "Analysis recalculated."
+
+        if param == "delete":
+            print ("Deleting test session id %s and all related data..." % (kwargs['id'],))
+            session = dbsession.query(db.TestSession).filter(db.TestSession.id == kwargs['id']).first()
+            for item in session.test_items:
+                if str(item.id) in test_refs.testclass_refs:
+                    imagefactory.ImageFactory.delete_images(str(item.id))
+                    test_refs.testclass_refs.pop(str(item.id))
+            dbsession.query(db.TestSession).filter(db.TestSession.id == kwargs['id']).delete()
+            dbsession.commit()
+
+            return "Deletion successful."
+
+    def manufacturers_tree(self, dbsession, sessions):
+
+        # Structure of the list.
+        # [(manufacturer_name, [(program_name, [testsession1, testsession2, ...]), ...]), ...]
+        manufacturers = []
+
+        for dut in dbsession.query(db.TestDUT):
+            # Manufacturer
+            man = dut.manufacturer
+            if man is None or len(man) == 0:
+                man = "[Empty]"
+
+            p_list = None
+            for m in manufacturers:
+                if m[0] == man:
+                    p_list = m[1]
+            if p_list is None:
+                p_list = []
+                manufacturers.append((man, p_list))
+
+            # Program
+            prog = dut.program
+            if prog is None or len(prog) == 0:
+                prog = "[Empty]"
+
+            prog_set = None
+            for p in p_list:
+                if p[0] == prog:
+                    prog_set = p[1]
+            if prog_set is None:
+                prog_set = []
+                p_list.append((prog, prog_set))
+
+            # Append the test id's to the program set
+            for test in dut.test_items:
+                if test.testsession_id not in prog_set:
+                    prog_set.append(test.testsession_id)
+
+        # Replace testsession id's with test session lists
+        testsessions = {ts[0].id: ts for ts in sessions}
+        for man in manufacturers:
+            for prog in man[1]:
+                for i in range(len(prog[1])):
+                    prog[1][i] = testsessions[prog[1][i]]
+
+        return manufacturers
+
diff --git a/TPPTAnalysisSW/measurementdb.py b/TPPTAnalysisSW/measurementdb.py
new file mode 100644
index 0000000..5739f5f
--- /dev/null
+++ b/TPPTAnalysisSW/measurementdb.py
@@ -0,0 +1,920 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+import traceback
+import argparse
+import json
+import time
+import sqlite3
+
+from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Boolean, Text, BLOB
+from sqlalchemy.orm import relation, backref, sessionmaker
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import create_engine
+from sqlalchemy import event
+from .measurementdb_sqlite import create_sqlite_indices
+
+Base = declarative_base()
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--check', action="store_true", default=False, help='Startup check for CI usage')
+parser.add_argument('--database', type=str, default='C:/OptoFidelity/TPPT/database.sqlite', help='Path to used database file')
+parser.add_argument('--config', type=str, default='C:/OptoFidelity/TPPT/config.json', help='Path to used configuration file')
+parser.add_argument('--dbconfig', type=str, default='C:/OptoFidelity/TPPT Analysis/dbconfig.yaml',
+                        help='Path to database configuration file')
+args = parser.parse_args()
+
+database = args.database
+config = args.config
+
+def on_connect(conn, record):
+    conn.execute('pragma foreign_keys=ON')
+
+
+def saveLastPath(path):
+    f = open(config, 'w')
+    f.write(json.dumps({"lastDB": path}))
+    f.close()
+
+
+def getLastPath():
+    try:
+        f = open(config, 'r')
+        data = json.load(f)
+
+        if "lastDB" in data:
+            return data['lastDB']
+        else:
+            return database
+
+    except Exception as e:
+        print(str(e))
+        return database
+
+
+class ResultDatabase:
+
+    def __init__(self, filename):
+        self.db = None
+        self.session = None
+        self.dbpath = None
+
+        self.initialize(filename)
+        saveLastPath(filename)
+
+    def initialize(self, filename):
+
+        self.dbpath = filename
+        self.db = create_engine('sqlite:///' + filename)
+        event.listen(self.db, 'connect', on_connect)
+        self.session = sessionmaker(bind=self.db, autoflush=False)
+        Base.metadata.create_all(self.db)
+        create_sqlite_indices(filename)
+
+        # Check if ResultDatabase already contains test types below.
+        try:
+            session = self.session()
+            session.add( TestType( 0, 'One Finger Tap Test' ) )
+            session.add( TestType( 1, 'One Finger Swipe Test' ) )
+            session.add( TestType( 5, 'MultiFinger Swipe Test' ) )
+            session.add( TestType( 6, 'DUT Information test') )
+            session.add( TestType( 8, 'MultiFinger Tap Test'))
+            session.add( TestType( 9, 'One Finger Stationary Jitter'))
+            session.add( TestType( 10, 'One Finger Tap Repeatability'))
+            session.add( TestType( 11, 'One Finger Stationary Reporting Rate Test'))
+            session.add( TestType( 12, 'One Finger Non Stationary Reporting Rate Test'))
+            session.add( TestType( 13, 'Linearity Test'))
+            session.add( TestType( 14, 'Two Finger Separation Test'))
+            session.add( TestType( 15, 'Grid Accuracy Test'))
+            session.add( TestType( 16, 'Stationary Jitter Static Noise Test'))
+            session.add(TestType(17, 'One Finger Tapping Repeatability Test'))
+            session.commit()
+            session.close()
+        except:
+            # Already created
+            pass
+        try:
+            # Grid accuracy settings
+            self.checksetting(
+                Setting('max_error_edge', 1.5, 'mm', 'Max error in edge area (not including 4 corners and notch)'))
+            self.checksetting(
+                Setting('max_error_edge_corner_notch', 2.0, 'mm',
+                        'Max error in edge area (including 4 corners and notch'))
+            self.checksetting(
+                Setting('max_error_center', 1.0, 'mm', 'Max error in center area'))
+            self.checksetting(
+                Setting('grid_acc_missing_points', 10, '%', 'Max amount of missing points in percents'))
+
+            # Linearity settings
+            self.checksetting(
+                Setting('max_avg_of_max_errors', 0.75, 'mm',
+                        'Maximum allowed max of averages of max linearity errors '))
+            self.checksetting(
+                Setting('max_rms_error',0.5, 'mm', 'Maximum allowed rms linearity error'))
+            self.checksetting(
+                Setting('min_report_rate', 120, 'Hz', 'Minimum reporting rate in active mode'))
+            self.checksetting(
+                Setting('min_report_rate_noise_inj_single', 120, 'Hz',
+                        'Minimum reporting rate with noise injected in active mode at single touch'))
+            self.checksetting(
+                Setting('min_report_rate_noise_inj_multi', 100, 'Hz',
+                        'Minimum reporting rate with noise injected in active mode at multi touch'))
+            self.checksetting(
+                Setting('max_missing_swipes', 10, '%', 'Maximum amount of missing swipes in percents'))
+            self.checksetting(
+                Setting('max_broken_lines', 0, 'pcs', 'Maximum amount of broken lines'))
+            self.checksetting(
+                Setting('max_ghost_fingers', 0, 'pcs', 'Maximum amount of ghost fingers'))
+            self.checksetting(Setting('jitter_mask', 10.0, "mm", "Non stationary jitter search mask"))
+
+            # Stationary jitter static noise settings
+            self.checksetting(
+                Setting('max_stat_jitter_no_noise', 0.5, 'mm', 'Max stationary jitter with no noise injected'))
+            self.checksetting(
+                Setting('max_stat_jitter_noise', 1.0, 'mm', 'Max stationary jitter with noise injected'))
+            self.checksetting(
+                Setting('max_noise_test_jitter', 1.0, 'mm', 'Max stationary jitter in static noise test'))
+            self.checksetting(
+                Setting('jitter_missing_points', 10, '%', 'Max percentage of allowed missing points'))
+
+            # Tapping repeatability settings
+            self.checksetting(
+                Setting('max_error_edge_down', 1.5, 'mm', 'Maximum repeatability error at the edge on pen down'))
+            self.checksetting(
+                Setting('max_error_edge_up', 1.5, 'mm', 'Maximum repeatability error at the edge on pen lift-off'))
+            self.checksetting(
+                Setting('max_error_corner_down', 1.5, 'mm', 'Maximum repeatability error in the corner on pen down'))
+            self.checksetting(
+                Setting('max_error_corner_up', 1.5, 'mm', 'Maximum repeatability error in the corner on pen lift-off'))
+            self.checksetting(
+                Setting('max_error_center_down', 1.0, 'mm', 'Maximum repeatability error at the center on pen down'))
+            self.checksetting(
+                Setting('max_error_center_up', 1.0, 'mm', 'Maximum repeatability error at the center on pen lift-off'))
+            self.checksetting(
+                Setting('repeatability_missing_points', 10, '%',
+                        'Maximum amount of allowed missing points in repeatability'))
+
+            # Legacy settings
+            self.checksetting(Setting('maxjitter', 1.0, "mm", "Maximum allowed non stationary jitter"))
+            self.checksetting(Setting('maxstationaryjitter', 1.0, "mm", "Maximum allowed stationary jitter"))
+            self.checksetting(Setting('maxstationaryjitter_with_noise', 1.0, "mm", "Maximum allowed stationary jitter with noise source"))
+            self.checksetting(Setting('jittermask', 10.0, "mm", "Non stationary jitter search mask"))
+            self.checksetting(Setting('maxactiveresponselatency', 25.0, "ms", "Maximum allowed response latency from an active state for the initial input"))
+            self.checksetting(Setting('maxidleresponselatency', 50.0, "ms", "Maximum allowed response latency from an idle state"))
+            self.checksetting(Setting('minreportingrate', 100.0, "Hz", "Minimum allowed reporting rate"))
+            self.checksetting(Setting('maxposerror',1.0,"mm","Maximum allowed accuracy error"))
+            self.checksetting(Setting('maxmissing',0.0,"pcs","Maximum allowed missing inputs"))
+            self.checksetting(Setting('maxoffset',1.0, "mm","Maximum allowed offset"))
+            self.checksetting(Setting('maxseparation',12.0,"mm","Maximum allowed finger separation distance (vertical and horizontal)"))
+            self.checksetting(Setting('maxdiagseparation',15.0,"mm","Maximum allowed finger separation distance (diagonal)"))
+            self.checksetting(Setting('minppi',200.0,"ppi","Minimum display resolution"))
+            self.checksetting(Setting('maxhoveroffset',1.0,"mm","Maximum allowed hover offset"))
+            self.checksetting(Setting('maxrepeaterror',1.0,"mm","Maximum tap repeatability error"))
+            self.checksetting(Setting('edgelimit',-1.0,"mm","Edge area distance from edge in Tap test"))
+            self.checksetting(Setting('edgepositioningerror',1.0,"mm","Maximum allowed accuracy error in edge area"))
+            self.checksetting(Setting('maxedgemissing',0.0,"pcs","Maximum allowed missing edge inputs"))
+            self.checksetting(Setting('maxmissingswipes',0.0,"pcs","Maximum allowed missing swipes in swipe test"))
+            self.checksetting(Setting('maxbrokenswipes', 0.0, "pcs", "Maximum allowed broken swipes in linearity test"))
+            self.checksetting(Setting('maxghostfingerswipes', 0.0, "pcs", "Maximum allowed swipes with ghost finger in linearity test"))
+            self.checksetting(Setting('maxmissinghover',0.0,"pcs","Maximum allowed missing swipes in hover test"))
+            self.checksetting(Setting('maxhoverjitter',1.0,"mm","Maximum allowed jitter in hover test"))
+
+            # When adding settings, remember to add them to settings.py categories
+        except: #IntegrityError:
+            print(traceback.format_exc())
+            # Already created
+            pass
+
+    def changeDatabase(self, path):
+        self.initialize(path)
+        saveLastPath(path)
+
+    def add( self, data, commit = True ):
+        session = self.session()
+        session.add( data )
+        if commit == True:
+            self.session_commit(session)
+
+    def addAll( self, data, commit = True ):
+        session = self.session()
+        session.add_all( data )
+        if commit == True:
+            self.session_commit(session)
+
+    def getEngine(self):
+        return self.db
+
+    def update(self, data):
+        session = self.session()
+        session.merge(data)
+        self.session_commit(session)
+
+    def commit(self):
+        session = self.session()
+        self.session_commit(session)
+
+    def session_commit(self, session):
+        # If database is locked, try again until timeout occurs
+        max_wait_time = 15
+        start = time.time()
+        while(True):
+            try:
+                session.commit()
+                break
+            except sqlite3.OperationalError as e:
+                if time.time() - start > max_wait_time:
+                    raise e
+                else:
+                    pass
+
+    def get_test_sessions( self, dbsession=None ):
+        if dbsession is None:
+            dbsession = self.session()
+        return dbsession.query( TestSession ).all()
+
+    def get_test_session( self, session_id ):
+        session = self.session()
+        print("#########GET TEST SESSION")
+        return session.query( TestSession ).filter_by( id=session_id ).first()
+
+    def get_test_results( self, test_id ):
+        session = self.session()
+        retval =  session.query(OneFingerTapTest).filter_by( test_id=test_id ).all()
+        session.close()
+        return retval
+
+    def get_TestType( self, type_id ):
+        session = self.session()
+        return session.query(TestType).filter_by( id=type_id ).all()
+
+    def get_TestTypes( self ):
+        session = self.session()
+        return session.query(TestType).all()
+
+    def get_programs( self ):
+        session = self.session()
+        return session.query( TestSession.program).order_by(TestSession.program)
+
+    def get_manufacturers( self, Program ):
+        session = self.session()
+        return session.query( TestSession.manufacturer).order_by(TestSession.manufacturer).all()
+
+    def checksetting( self, setting ):
+        session = self.session()
+        dbsetting = session.query(Setting).filter_by(id=setting.id).first()
+        if dbsetting is None:
+            # Setting does not exist
+            session.add(setting)
+            self.session_commit(session)
+        session.close()
+
+# Define database tables
+
+class TestSession( Base ):
+
+# TestSession is constant to all test cases
+
+    __tablename__ = 'test_session'
+
+    id = Column( Integer, primary_key=True )
+    operator = Column( String )
+    starttime = Column( String )
+    endtime = Column( String )
+    invalid = Column( Boolean )
+    notes = Column( String )
+    tnt_version = Column( String )
+    tppt_version = Column( String )
+    station_id = Column( String )
+
+
+class TestDUT( Base ):
+
+    # A DUT that is tested in one or multiple test sessions and referenced to in Test Items
+    __tablename__ = 'test_dut'
+    id = Column( Integer, primary_key=True )
+
+    # Dut parameters
+    program = Column( String )
+    manufacturer = Column( String )
+    batch = Column( String )
+    serial = Column( String )
+    sample_id = Column( String )
+    svg_data = Column( BLOB )
+
+
+class TestType( Base ):
+
+    #Device digitizer touch test types stored here
+
+    __tablename__ = 'test_type'
+
+    id = Column( Integer, primary_key = True )
+    name = Column( String )
+
+    def __init__( self, id, name ):
+        self.id = id
+        self.name = name
+
+class TestItem( Base ):
+
+    #A single test related to device digitizer touch is defined here
+    __tablename__ = 'test_item'
+
+    id = Column( Integer, primary_key= True )
+    testsession_id = Column( Integer, ForeignKey('test_session.id', ondelete='CASCADE'), nullable=False )
+    testsession = relation( TestSession, backref = backref('test_items', order_by =  id) )
+    dut_id = Column( Integer, ForeignKey('test_dut.id'), nullable=False )
+    dut = relation( TestDUT, backref = backref('test_items', order_by =  id) )
+    starttime = Column( String )
+    endtime = Column( String )
+    slot_id = Column( Integer )
+    finger_type = Column( String )
+    invalid = Column( Boolean )
+    testtype_id = Column( Integer, ForeignKey('test_type.id', ondelete='CASCADE'), nullable=False )
+    type = relation( TestType, backref = backref('test_items', order_by = id) )
+    kmsg_log = Column( Text )
+
+class SessionParameters( Base ):
+
+    #Session parameters are defined here
+    __tablename__ = 'session_parameters'
+
+    id = Column( Integer, primary_key = True )
+    testsession_id = Column( Integer, ForeignKey('test_session.id', ondelete='CASCADE'), nullable=False )
+    testsession = relation(TestSession, backref = backref('session_parameters', order_by = id ) )
+    name = Column( String )
+    valueFloat = Column( Float )
+    valueString = Column( String )
+    isFloat = Column( Boolean )
+
+class DutParameters( Base ):
+
+    #DUT parameters are defined here
+    __tablename__ = 'dut_parameters'
+
+    id = Column( Integer, primary_key = True )
+    dut_id = Column( Integer, ForeignKey('test_dut.id', ondelete='CASCADE'), nullable=False )
+    dut = relation(TestDUT, backref = backref('dut_parameters', order_by = id ) )
+    name = Column( String )
+    valueFloat = Column( Float )
+    valueString = Column( String )
+    isFloat = Column( Boolean )
+
+class DUTInformationTest( Base ):
+
+    __tablename__ = 'dut_information_test'
+
+    id = Column(Integer, primary_key=True)
+    testsession_id = Column( Integer, ForeignKey('test_session.id', ondelete='CASCADE'), nullable=False )
+    testsession = relation( TestSession, backref = backref('dut_information_test', order_by =  id) )
+
+    name = Column( String )
+    valueFloat = Column( Float )
+    valueString = Column( String )
+    isFloat = Column( Boolean )
+
+class OneFingerTapTest( Base ):
+
+    #One-finger tap results are defined here
+    __tablename__ = 'one_finger_tap_test'
+
+    id = Column(Integer, primary_key=True)
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref=backref('one_finger_tap_test', order_by=id) )
+
+    #Are results single tap or jitter
+    jitter = Column( Boolean )
+
+    #Common parameters
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+    robot_z = Column( Float )
+    point_number = Column( Integer )
+
+    #Results
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    finger_id = Column( Integer )
+    delay = Column( Float )
+    time = Column( Float )
+
+class OneFingerTapRepeatabilityTest( Base ):
+
+    #One-finger tap results are defined here
+    __tablename__ = 'one_finger_tap_repeatability_test'
+
+    id = Column(Integer, primary_key=True)
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref=backref('one_finger_tap_repeatability_test', order_by=id) )
+
+    #Common parameters
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+    robot_z = Column( Float )
+    point_number = Column( Integer )
+
+    #Results
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    finger_id = Column( Integer )
+    delay = Column( Float )
+    time = Column( Float )
+    event = Column( Integer )
+
+
+class OneFingerTappingRepeatabilityTest(Base):
+    # One-finger tap results are defined here
+    __tablename__ = 'one_finger_tapping_repeatability_test'
+
+    id = Column(Integer, primary_key=True)
+    test_id = Column(Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False)
+    test = relation(TestItem, backref=backref('one_finger_tapping_repeatability_test', order_by=id))
+
+    # Common parameters
+    robot_x = Column(Float)
+    robot_y = Column(Float)
+    robot_z = Column(Float)
+    point_number = Column(Integer)
+
+    border_width = Column(Float)
+    finger_name = Column(Text)
+    finger_type = Column(Text)
+    finger_size = Column(Text)
+    display_background = Column(Text)
+    number_of_random_locations_center = Column(Integer)
+    number_of_random_locations_edge = Column(Integer)
+    number_of_random_locations_corner = Column(Integer)
+    number_of_taps_at_each_location = Column(Integer)
+    lift_off_distance = Column(Float)
+    ground_status = Column(Text)
+    noise_status = Column(Text)
+    touch_area = Column(Text)
+
+
+class OneFingerTappingRepeatabilityResults(Base):
+    # One-finger tap results are defined here
+    __tablename__ = 'one_finger_tapping_repeatability_results'
+
+    id = Column(Integer, primary_key=True)
+    point_id = Column(Integer, ForeignKey('one_finger_tapping_repeatability_test' + '.id', ondelete='CASCADE'), nullable=False)
+    point = relation(OneFingerTappingRepeatabilityTest, backref=backref('one_finger_tapping_repeatability_results', order_by=id))
+
+    tap_id = Column(Integer)
+    point_number = Column(Integer)
+    panel_x = Column(Float)
+    panel_y = Column(Float)
+    sensitivity = Column(Float)
+    delay = Column(Float)
+    finger_id = Column(Integer)
+    time = Column(Float)
+    event = Column(Integer)
+
+
+class OneFingerSwipeTest( Base ):
+
+    #One-finger swipe test is defined here
+    __tablename__ = 'one_finger_swipe_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('one_finger_swipe_test', order_by = id) )
+
+    #For straight lines, start and stop positions are defined
+    start_x = Column( Float )
+    start_y = Column( Float )
+    end_x = Column( Float )
+    end_y = Column( Float )
+
+    #For circular lines, also through position and radius in x and y directions are defined
+    through_x = Column( Float )
+    through_y = Column( Float )
+    radius_x = Column( Float )
+    radius_y = Column( Float )
+
+class OneFingerSwipeResults( Base ):
+
+    #One-finger swipe results are defined here
+    __tablename__ = 'one_finger_swipe_results'
+
+    id = Column( Integer, primary_key = True )
+    swipe_id = Column( Integer, ForeignKey('one_finger_swipe_test.id', ondelete='CASCADE'), nullable=False )
+    swipe = relation( OneFingerSwipeTest, backref = backref('one_finger_swipe_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class LinearityTest( Base ):
+
+    #Linearity results are defined here
+    __tablename__ = 'linearity_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('linearity_test', order_by = id) )
+
+    # For straight lines, start and stop positions are defined
+    start_x = Column(Float)
+    start_y = Column(Float)
+    end_x = Column(Float)
+    end_y = Column(Float)
+    #speed = Column(Float)
+    test_type = Column(Text)
+
+    # Additional metadata for the analysis to use and to pass further
+    finger_name = Column(Text)
+    finger_type = Column(Text)  # Metal or soft
+    finger_size = Column(Float)
+    num_fingers = Column(Float)
+    border_width = Column(Float)
+    touch_area = Column(Text)  # center/edge
+    display_background = Column(Text)
+    step_size = Column(Float)
+    swipe_speed = Column(Integer)
+    swipe_direction = Column(Integer)  # horizontal, vertical or diagonal
+    lift_off_distance = Column(Float)
+    ground_status = Column(Text)
+    noise_status = Column(Text)
+
+class LinearityTestResults( Base ):
+
+    #Linearity results are defined here
+    __tablename__ = 'linearity_results'
+
+    id = Column( Integer, primary_key = True )
+    line_id = Column( Integer, ForeignKey('linearity_test.id', ondelete='CASCADE'), nullable=False )
+    line = relation( LinearityTest, backref = backref('linearity_results', order_by = id) )
+
+    panel_x = Column(Float)
+    panel_y = Column(Float)
+    finger_id = Column(Integer)
+    delay = Column(Float)
+    time = Column(Float)
+    event = Column(Integer)
+    sensitivity = Column(Float)
+
+class OneFingerStationaryReportingRateTest( Base ):
+
+    #One Finger Stationary Reporting Rate Test is defined here
+    __tablename__ = 'one_finger_stationary_reporting_rate_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('one_finger_stationary_reporting_rate_test', order_by = id) )
+
+    #For straight lines, start and stop positions are defined
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+
+class OneFingerStationaryReportingRateResults( Base ):
+
+    #One Finger Stationary Reporting Rate results are defined here
+    __tablename__ = 'one_finger_stationary_reporting_rate_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('one_finger_stationary_reporting_rate_test.id', ondelete='CASCADE'), nullable=False )
+    point = relation( OneFingerStationaryReportingRateTest, backref = backref('one_finger_stationary_reporting_rate_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class OneFingerNonStationaryReportingRateTest( Base ):
+
+    #One Finger Non Stationary Reporting Rate Test is defined here
+    __tablename__ = 'one_finger_non_stationary_reporting_rate_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('one_finger_non_stationary_reporting_rate_test', order_by = id) )
+
+    #For straight lines, start and stop positions are defined
+    start_x = Column( Float )
+    start_y = Column( Float )
+    end_x = Column( Float )
+    end_y = Column( Float )
+
+class OneFingerNonStationaryReportingRateResults( Base ):
+
+    #One Finger Non Stationary Reporting Rate results are defined here
+    __tablename__ = 'one_finger_non_stationary_reporting_rate_results'
+
+    id = Column( Integer, primary_key = True )
+    swipe_id = Column( Integer, ForeignKey('one_finger_non_stationary_reporting_rate_test.id', ondelete='CASCADE'), nullable=False )
+    swipe = relation( OneFingerNonStationaryReportingRateTest, backref = backref('one_finger_non_stationary_reporting_rate_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class OneFingerStationaryJitterTest( Base ):
+
+    #One Finger Non Stationary Reporting Rate Test is defined here
+    __tablename__ = 'one_finger_stationary_jitter_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('one_finger_stationary_jitter_test', order_by = id) )
+
+    #For straight lines, start and stop positions are defined
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+
+
+class OneFingerStationaryJitterResults( Base ):
+
+    #One Finger Non Stationary Reporting Rate results are defined here
+    __tablename__ = 'one_finger_stationary_jitter_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('one_finger_stationary_jitter_test.id', ondelete='CASCADE'), nullable=False )
+    point = relation( OneFingerStationaryJitterTest, backref = backref('one_finger_stationary_jitter_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class SeparationTest( Base ):
+
+    #Separation results are defined here
+    __tablename__ = 'separation_test'
+
+    id = Column(Integer, primary_key=True)
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref=backref('separation_test', order_by=id) )
+
+    #Is measurement 2-, 3-, 4-, or 5-finger
+    number_of_fingers = Column( Integer )
+
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+    robot_z = Column( Float )
+    separation_distance = Column( Float )
+    separation_angle = Column( Float )
+    first_finger_offset = Column( Float )
+    tool_separation = Column( Float )
+    finger1_diameter = Column( Float )
+    finger2_diameter = Column( Float )
+
+class SeparationResults( Base ):
+
+    #Separation results are defined here
+    __tablename__ = 'separation_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('separation_test.id', ondelete='CASCADE') )
+    point = relation( SeparationTest, backref = backref('separation_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class MultifingerTapTest( Base ):
+
+    #Multifinger tap results are defined here
+    __tablename__ = 'multi_finger_tap_test'
+
+    id = Column(Integer, primary_key=True)
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref=backref('multi_finger_tap_test', order_by=id) )
+
+    #Is measurement 2-, 3-, 4-, or 5-finger
+    number_of_fingers = Column( Integer )
+
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+    robot_z = Column( Float )
+    separation_distance = Column( Float )
+    separation_angle = Column( Float )
+    first_finger_offset = Column( Float )
+
+class MultifingerTapResults( Base ):
+
+    #Multifinger Tap results are defined here
+    __tablename__ = 'multi_finger_tap_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('multi_finger_tap_test.id', ondelete='CASCADE') )
+    point = relation( MultifingerTapTest, backref = backref('multi_finger_tap_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class MultifingerSwipeTest( Base ):
+
+    #One-finger swipe test is defined here
+    __tablename__ = 'multi_finger_swipe_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('multi_finger_swipe_test', order_by = id) )
+
+    #Is measurement 2-, 3-, 4-, or 5-finger
+    number_of_fingers = Column( Integer )
+
+    #For straight lines, start and stop positions are defined
+    start_x = Column( Float )
+    start_y = Column( Float )
+    end_x = Column( Float )
+    end_y = Column( Float )
+    separation_distance = Column( Float )
+    separation_angle = Column( Float )
+    first_finger_offset = Column( Float )
+
+    #Is test zoom, pinch or swipe
+    test_type = Column( String )
+
+
+class MultifingerSwipeResults( Base ):
+
+    #Multifinger pinch results are defined here
+    __tablename__ = 'multi_finger_swipe_results'
+
+    id = Column( Integer, primary_key = True )
+    swipe_id = Column( Integer, ForeignKey('multi_finger_swipe_test.id', ondelete='CASCADE'), nullable=False )
+    swipe = relation( MultifingerSwipeTest, backref = backref('multi_finger_swipe_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class GridAccuracyTest(Base):
+
+    # Test is defined here
+    __tablename__ = 'grid_accuracy_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('grid_accuracy_test', order_by = id) )
+
+    # Robot tap position
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+
+    border_width = Column(Float)
+
+    finger_name = Column(Text)
+    finger_type = Column(Text) # Metal or soft
+    finger_size = Column(Float)
+    num_fingers = Column(Float)
+
+    lift_off_distance = Column(Float)
+    step_size = Column(Float)
+    ground_status = Column(Text) # "ground" or "low_ground"
+    noise_status = Column(Text)  # charger name
+    display_background = Column(Text)
+    touch_area = Column(Text) # "edge_area" or "center_area"
+    contact_duration = Column(Float) # duration in ms
+
+
+class GridAccuracyResults(Base):
+
+    # Results are defined here
+    __tablename__ = 'grid_accuracy_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('grid_accuracy_test' + '.id', ondelete='CASCADE'), nullable=False )
+    point = relation( GridAccuracyTest, backref = backref('grid_accuracy_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class StationaryJitterStaticNoiseTest(Base):
+
+    # Test is defined here
+    __tablename__ = 'stationary_jitter_static_noise_test'
+
+    id = Column( Integer, primary_key = True )
+    test_id = Column( Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('stationary_jitter_static_noise_test', order_by = id) )
+
+    # Robot tap position
+    robot_x = Column( Float )
+    robot_y = Column( Float )
+
+    border_width = Column(Float)
+    test_type = Column(Text)
+
+    finger_name = Column(Text)
+    finger_type = Column(Text) # Metal or soft
+    finger_size = Column(Float)
+    finger2_name = Column(Text)
+    separation = Column(Float)
+
+    lift_off_distance = Column(Float)
+    step_size = Column(Float)
+    ground_status = Column(Text) # "ground" or "low_ground"
+    noise_status = Column(Text) # charger name
+    display_background = Column(Text)
+    touch_area = Column(Text) # "edge_area" or "center_area"
+    contact_duration = Column(Float) # duration in ms
+    number_of_fingers_on_screen = Column(Integer)
+
+
+class StationaryJitterStaticNoiseResults(Base):
+
+    # Results are defined here
+    __tablename__ = 'stationary_jitter_static_noise_results'
+
+    id = Column( Integer, primary_key = True )
+    point_id = Column( Integer, ForeignKey('stationary_jitter_static_noise_test' + '.id', ondelete='CASCADE'), nullable=False )
+    point = relation( StationaryJitterStaticNoiseTest, backref = backref('stationary_jitter_static_noise_results', order_by = id) )
+
+    panel_x = Column( Float )
+    panel_y = Column( Float )
+    sensitivity = Column( Float )
+    delay = Column( Float )
+    finger_id = Column( Integer )
+    time = Column( Float )
+    event = Column( Integer )
+
+class Setting(Base):
+
+    __tablename__ = 'settings'
+    id = Column(String,primary_key = True)
+    value = Column(Float,nullable=False)
+    unit = Column(String)
+    desc = Column(String)
+    def __init__(self,id,value,unit,desc):
+        self.id = id
+        self.value = value
+        self.unit = unit
+        self.desc = desc
+
+class TestResult(Base):
+    __tablename__ = 'test_result'
+    id = Column(Integer, primary_key = True)
+    test_id = Column(Integer, ForeignKey('test_item.id', ondelete='CASCADE'), nullable=False )
+    test = relation( TestItem, backref = backref('test_results') )
+    result = Column(String)
+    calculated = Column(DateTime)
+
+
+# The global database singleton instance
+db = None
+
+""" Returns the global database instance """
+# If there is an existing database given as config, let's use that one
+# If not, a database with that name is created, if there is no config
+# the last used datapath is used
+def get_database():
+    global db
+    if db is None and database is None:
+        db = ResultDatabase(getLastPath())
+    elif db is None and database is not None:
+        db = ResultDatabase(database)
+    return db
diff --git a/TPPTAnalysisSW/measurementdb_sqlite.py b/TPPTAnalysisSW/measurementdb_sqlite.py
new file mode 100644
index 0000000..729965e
--- /dev/null
+++ b/TPPTAnalysisSW/measurementdb_sqlite.py
@@ -0,0 +1,88 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+import sqlite3
+import time
+
+_indices = {'dut_information_test_fkey': ['dut_information_test', 'testsession_id'],
+            'dut_parameters_fkey': ['dut_parameters', 'dut_id'],
+            'multi_finger_swipe_results_fkey': ['multi_finger_swipe_results', 'swipe_id'],
+            'multi_finger_swipe_test_fkey': ['multi_finger_swipe_test', 'test_id'],
+            'multi_finger_tap_results_fkey': ['multi_finger_tap_results', 'point_id'],
+            'multi_finger_tap_test_fkey': ['multi_finger_tap_test', 'test_id'],
+            'one_finger_non_stationary_reporting_rate_results_fkey': ['one_finger_non_stationary_reporting_rate_results', 'swipe_id'],
+            'one_finger_non_stationary_reporting_rate_test_fkey': ['one_finger_non_stationary_reporting_rate_test', 'test_id'],
+            'one_finger_stationary_jitter_results_fkey': ['one_finger_stationary_jitter_results', 'point_id'],
+            'one_finger_stationary_jitter_test_fkey': ['one_finger_stationary_jitter_test','test_id'],
+            'one_finger_stationary_reporting_rate_results_fkey': ['one_finger_stationary_reporting_rate_results', 'point_id'],
+            'one_finger_stationary_reporting_rate_test_fkey': ['one_finger_stationary_reporting_rate_test', 'test_id'],
+            'one_finger_swipe_results_fkey': ['one_finger_swipe_results', 'swipe_id'],
+            'one_finger_swipe_test_fkey': ['one_finger_swipe_test', 'test_id'],
+            'one_finger_tap_repeatability_test_fkey': ['one_finger_tap_repeatability_test', 'test_id'],
+            'one_finger_tap_test_fkey': ['one_finger_tap_test', 'test_id'],
+            'one_finger_tapping_repeatability_test_fkey': ['one_finger_tapping_repeatability_test', 'test_id'],
+            'separation_results_fkey': ['separation_results', 'point_id'],
+            'separation_test_fkey': ['separation_test', 'test_id'],
+            'linearity_test_fkey': ['linearity_test', 'test_id'],
+            'linearity_results_fkey': ['linearity_results', 'line_id'],
+            'grid_accuracy_test_fkey': ['grid_accuracy_test', 'test_id'],
+            'grid_accuracy_results_fkey': ['grid_accuracy_results', 'point_id'],
+            'stationary_jitter_static_noise_test_fkey': ['stationary_jitter_static_noise_test', 'test_id'],
+            'stationary_jitter_static_noise_results_fkey': ['stationary_jitter_static_noise_results', 'point_id'],
+            'session_parameters_fkey': ['session_parameters', 'testsession_id'],
+            'test_item_fkey': ['test_item', 'testsession_id'],
+            'test_result_fkey': ['test_result', 'test_id'],
+            }
+
+def create_sqlite_indices(database_file):
+    """ Creates indices to the SQLite database """
+    max_wait_time = 15
+    start = time.time()
+    while(True):
+        db = sqlite3.connect(database_file, timeout=1)
+        try:
+            curindices = get_current_indices(db)
+            break
+        except sqlite3.OperationalError as e:
+            if time.time() - start > max_wait_time:
+                raise e
+            else:
+                pass
+
+    for index_name, index_values in _indices.items():
+        if index_name not in curindices:
+            print ("Creating database index %s" % index_name)
+            create_index(db, index_name, index_values)
+
+    db.close()
+
+def get_current_indices(database):
+    """ Returns an array of currently declared indices in the database """
+
+    c = database.cursor()
+    c.execute("SELECT name FROM sqlite_master WHERE type = 'index'")
+    indices = [r[0] for r in c.fetchall()]
+
+    return indices
+
+def create_index(database, index_name, index_values):
+    """ Creates the specified index in the database """
+    database.execute('CREATE INDEX IF NOT EXISTS %s ON %s ( %s )' % (index_name, index_values[0], index_values[1]))
diff --git a/TPPTAnalysisSW/plot_factory.py b/TPPTAnalysisSW/plot_factory.py
new file mode 100644
index 0000000..20eb8b8
--- /dev/null
+++ b/TPPTAnalysisSW/plot_factory.py
@@ -0,0 +1,1494 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+# -*- coding: utf-8 -*-
+from .measurementdb import *
+import numpy as np
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+import matplotlib.gridspec as gridspec
+from matplotlib.patches import Ellipse, Rectangle
+import TPPTAnalysisSW.measurementdb as measurementdb
+from matplotlib import cm
+from mpl_toolkits.mplot3d import Axes3D
+
+import TPPTAnalysisSW.plotters as plotters
+from hashlib import md5
+import random
+import TPPTAnalysisSW.analyzers as analyzers
+from .settings import settings
+from threading import Semaphore
+from datetime import datetime
+from TPPTAnalysisSW.utils import Timer
+
+# Used for mutual exclusion. Only one thread can use matplotlib as a time
+plotSemaphore = Semaphore()
+
+# Usage of matplotlib figure numbers
+# 1 - Preview image (800 x 600)
+# 2 - Detailed image (2000 x 2000)
+# 3 - Large details image (800 x 800)
+# 4 - Wide details image (1000 x 600)
+# 5 - Narrow details image (600 x 600)
+# 6 - Large details image (1000 x 800)
+
+# Color constants
+_PASS = '#00FF00'
+_FAIL = '#FF0000'
+_DEFAULT = 'r'
+_STATIONARY_EDGE_PINCH = '#DFDF51'
+
+# Scatter plot marker size (in points)
+_markersize = 40
+
+# Z-orders for different elements
+_zorder = {'pass': 3,
+           'fail': 4,
+           'edges': 1,  # Panel borders
+           'lines': 2,
+           }
+
+# Decorator for easy locking
+def synchronized(f):
+    global plotSemaphore
+    def locker(*args, **kwargs):
+        with plotSemaphore:
+            return f(*args, **kwargs)
+    return locker
+
+def waitForPlot():
+    """ Waits until there is no plot running. Does not hold the lock, so the next drawing may commence after waitForPlot() returns"""
+    plotSemaphore.acquire()
+    plotSemaphore.release()
+
+# Template for new image plotting functions:
+#
+#@synchronized
+#def plot_xxx(imagepath, *args, **kwargs):
+#    fig = plt.figure(1)
+#    plt.clf()
+
+#    drawing_code_here...
+
+#    # Create the image
+#    fig.savefig(imagepath)
+
+@synchronized
+def plot_dummy_image(imagepath, plotinfo, *args, **kwargs):
+    """ Plots a dummy image for dummy test """
+
+    t = Timer(3)
+
+    fig = plt.figure(1)
+    plt.clf()
+
+    #plt.axis([-5.0, 5.0, 5.0, -5.0])
+    x = [p[0] for p in plotinfo['points']]
+    y = [p[1] for p in plotinfo['points']]
+    plt.scatter(x, y, s=_markersize, c=_DEFAULT)
+    t.Time("Plots")
+
+    # Here we can use parameters
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+    t.Time("Labels")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Ready")
+
+@synchronized
+def plot_passfail_on_target(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots passed and failed points on target.
+        plotinfo argument must be a dictionary containing lists 'passed_points' and
+        'failed_points' of points (x,y) on target coordinates """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(1)
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Passed points
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    plt.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+    # Failed points
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='k')
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_passfail_labels_on_target(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots a graph with labelled points. Plotinfo contains 'passed_points' and
+        'failed_points' arrays of tuples (x, y, s) where s is the label for a point """
+    # Used by: first contact latency, stationary_reporting_rate, repeatability, stationary jitter
+    t = Timer(3)
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Passed points
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    s = [str(p[2]) for p in plotinfo['passed_points']]
+    plt.scatter(x, y, s=50, c=_PASS, zorder=_zorder['pass'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x,y), xytext=(5, 5), textcoords='offset points')
+    # Failed points
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    s = [str(p[2]) for p in plotinfo['failed_points']]
+    plt.scatter(x, y, s=50, c=_FAIL, zorder=_zorder['fail'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x,y), xytext=(5, 5), textcoords='offset points')
+
+    t.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Save")
+
+
+@synchronized
+def plot_tapping_passfail_labels_on_target(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots a graph with labelled points. Plotinfo contains 'passed_points' and
+        'failed_points' arrays of tuples (x, y, s) where s is the label for a point """
+    # Used by: tapping repeatability
+    t = Timer(3)
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20, 20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8, 6))
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1], zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot edge area separator line
+    border_width = float(plotinfo['border_width'])
+    plt.plot([dutinfo.dimensions[0], 0], [border_width, border_width], color='blue',
+             linestyle='dashed')
+    plt.plot([border_width, border_width], [0, dutinfo.dimensions[1]], color='blue',
+             linestyle='dashed')
+    plt.plot([0, dutinfo.dimensions[0]],
+             [dutinfo.dimensions[1] - border_width, dutinfo.dimensions[1] - border_width], color='blue',
+             linestyle='dashed')
+    plt.plot([dutinfo.dimensions[0] - border_width, dutinfo.dimensions[0] - border_width],
+             [0, dutinfo.dimensions[1]], color='blue', linestyle='dashed')
+
+    # Passed points
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    s = [str(p[2]) for p in plotinfo['passed_points']]
+    plt.scatter(x, y, s=50, c=_PASS, zorder=_zorder['pass'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x, y), xytext=(5, 5), textcoords='offset points')
+    # Failed points
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    s = [str(p[2]) for p in plotinfo['failed_points']]
+    plt.scatter(x, y, s=50, c=_FAIL, zorder=_zorder['fail'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x, y), xytext=(5, 5), textcoords='offset points')
+
+    t.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Save")
+
+
+@synchronized
+def plot_passfail_labels(imagepath, plotinfo, *args, **kwargs):
+    """ Plots a graph with labelled points. Plotinfo contains 'passed_points' and
+        'failed_points' arrays of tuples (x, y, s) where s is the label for a point.
+       An optional 'center' point in plotinfo gives the center of the graph """
+    # Used by: stationary_jitter
+    t = Timer(3)
+    fig = plt.figure(1)
+    plt.clf()
+
+    # Plot panel borders
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Passed points
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    s = [str(p[2]) for p in plotinfo['passed_points']]
+    plt.scatter(x, y, s=50, c=_PASS, zorder=_zorder['pass'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x,y), xytext=(5, 5), textcoords='offset points')
+    # Failed points
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    s = [str(p[2]) for p in plotinfo['failed_points']]
+    plt.scatter(x, y, s=50, c=_FAIL, zorder=_zorder['fail'])
+    for (x, y, s) in zip(x, y, s):
+        plt.annotate(s, (x,y), xytext=(5, 5), textcoords='offset points')
+
+    robot_x = plotinfo['robot_point'][0].robot_x
+    robot_y = plotinfo['robot_point'][0].robot_y
+    robot_point = [(robot_x, robot_y),]
+
+    plt.scatter(robot_x, robot_y, s=50, c="k")
+    plt.annotate("Reference", (robot_x, robot_y), xytext=(30, 10), textcoords='offset points', color='k',
+                    arrowprops=dict(arrowstyle="simple", fc="k", ec="none",
+                                    connectionstyle="arc3,rad=0.3"))
+    # Set axis
+    passed_range = plotters.get_range(plotinfo['passed_points'] + plotinfo['failed_points'] + robot_point)
+    if 'center' in plotinfo:
+        center = plotinfo['center']
+        x_width = max(center[0] - passed_range[0], passed_range[2] - center[0])
+        y_width = max(center[1] - passed_range[1], passed_range[3] - center[1])
+        plt.axis([center[0] - x_width - 0.5, center[0] + x_width + 0.5, center[1] + y_width + 0.5, center[1] - y_width - 0.5])
+    elif passed_range is None:
+        # Empty lists
+        plt.axis([-5.0, 5.0, 5.0, -5.0])
+    else:
+        # This might result in non-equal axis...
+        plt.axis([passed_range[0] - 0.5, passed_range[2] + 0.5, passed_range[3] + 0.5, passed_range[1] - 0.5])
+
+    t.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Save")
+
+@synchronized
+def plot_repeatability_details(imagepath, plotinfo, *args, **kwargs):
+    """ Plots repeatability diagram: a diagram of points and a circle with center at the
+        average value of point coordinates. Points are in arrays 'passed_points', 'failed_points',
+        'average_point' and 'robot_point' (the coordinates to which the robot has pressed) """
+    # Used by: repeatability
+
+    t = Timer(3)
+    t.Time("START")
+
+    fig = plt.figure(5, figsize=(6,6), dpi=100)
+    plt.clf()
+
+    plt.axis('equal')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot individual measurements
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    s = [20 if n == 1 else 50 for n in plotinfo['passed_points_count']]
+    plt.scatter(x, y, s=s, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    for (x, y, s) in zip(x, y, plotinfo['passed_points_count']):
+        if s > 1:
+            plt.annotate(str(s), (x,y), xytext=(5, 5), textcoords='offset points')
+
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    s = [20 if n == 1 else 50 for n in plotinfo['failed_points_count']]
+    plt.scatter(x, y, s=s, c=_FAIL, zorder=_zorder['fail'])
+    for (x, y, s) in zip(x, y, plotinfo['failed_points_count']):
+        if s > 1:
+            plt.annotate(str(s), (x,y), xytext=(5, 5), textcoords='offset points')
+
+    # Plot robot point
+    robot_x = plotinfo['robot_point'][0]
+    robot_y = plotinfo['robot_point'][1]
+    plt.scatter(robot_x, robot_y, s=50, c="k")
+    plt.annotate("Reference", (robot_x,robot_y), xytext=(30, 10), textcoords='offset points', color='k',
+                    arrowprops=dict(arrowstyle="simple", fc="k", ec="none",
+                                    connectionstyle="arc3,rad=0.3"))
+
+    # Plot error square
+    if 'reference_point' in plotinfo:
+        rx, ry = plotinfo['reference_point']
+        d = float(plotinfo['distance'])
+        # Draw a square
+        x = [rx, rx + d, rx + d, rx, rx]
+        y = [ry, ry, ry + d, ry + d, ry]
+        plt.plot(x, y, "k")
+
+    # Reverse y scale
+    ax = plt.gca()
+    ax.set_ylim(ax.get_ylim()[::-1])
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("END")
+
+
+@synchronized
+def plot_tapping_repeatability_details(imagepath, plotinfo, *args, **kwargs):
+    """ Plots tapping repeatability diagram: a diagram of points and a circle with center at the
+        average value of point coordinates. Points are in arrays 'passed_points', 'failed_points',
+        'average_point' and 'robot_point' (the coordinates to which the robot has pressed) """
+    # Used by: tapping repeatability
+
+    t = Timer(3)
+    t.Time("START")
+
+    fig = plt.figure(5, figsize=(6, 6), dpi=100)
+    plt.clf()
+
+    plt.axis('equal')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot individual measurements
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    s = [20 if n == 1 else 50 for n in plotinfo['passed_points_count']]
+    plt.scatter(x, y, s=s, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+    for (x, y, s) in zip(x, y, plotinfo['passed_points_count']):
+        if s > 1:
+            plt.annotate(str(s), (x, y), xytext=(5, 5), textcoords='offset points')
+
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    s = [20 if n == 1 else 50 for n in plotinfo['failed_points_count']]
+    plt.scatter(x, y, s=s, c=_FAIL, zorder=_zorder['fail'])
+    for (x, y, s) in zip(x, y, plotinfo['failed_points_count']):
+        if s > 1:
+            plt.annotate(str(s), (x, y), xytext=(5, 5), textcoords='offset points')
+
+    # Plot reference point
+    reference_x = plotinfo['reference_point'][0]
+    reference_y = plotinfo['reference_point'][1]
+    plt.scatter(reference_x, reference_y, s=50, c="k")
+    plt.annotate("Reference point", (reference_x, reference_y), xytext=(30, 10), textcoords='offset points', color='k',
+                 arrowprops=dict(arrowstyle="simple", fc="k", ec="none",
+                                 connectionstyle="arc3,rad=0.3"))
+
+    # Plot max error circle
+    d = float(plotinfo['error_radius'])
+    circle = plt.Circle((reference_x, reference_y), d, fill=False, linestyle='--', color='r')
+
+    ax = plt.gca()
+    # Reverse y scale
+    ax.set_ylim(ax.get_ylim()[::-1])
+    ax.add_artist(circle)
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("END")
+
+
+@synchronized
+def plot_swipes_on_target_with_labels(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots swipe diagram -  'target_points' of points (x,y) on target coordinates and
+        'lines' that are tuple of (x,y) coordinates giving swipe start and end coordinates.
+       alternatively, 'target_points' can be replaced by 'passed_points' and 'failed_points' """
+    # Used by: hover, one finger swipe, non-stationary reporting rate
+    t = Timer(3)
+
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot arrows in the image
+    for line_id, line in zip(plotinfo['swipe_ids'], plotinfo['lines']):
+        plt.arrow(line[0][0], line[0][1],
+                    line[1][0] - line[0][0],
+                    line[1][1] - line[0][1],
+                    width=0.1, length_includes_head=True)
+        plt.annotate("Line ID " + str(line_id), (line[0][0], line[0][1]), xytext=(25, 5), textcoords='offset points', color='k',
+                            arrowprops=dict(arrowstyle="simple", fc="k", ec="none",
+                                            connectionstyle="arc3,rad=0.3"))
+
+    t.Time("Arrows")
+
+    # points
+    if 'target_points' in plotinfo:
+        x = [p[0] for p in plotinfo['target_points']]
+        y = [p[1] for p in plotinfo['target_points']]
+        plt.scatter(x, y, s=_markersize, c=_DEFAULT)
+    else:
+        x = [p[0] for p in plotinfo['passed_points']]
+        y = [p[1] for p in plotinfo['passed_points']]
+        plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+        x = [p[0] for p in plotinfo['failed_points']]
+        y = [p[1] for p in plotinfo['failed_points']]
+        plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    t.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Save")
+
+@synchronized
+def plot_swipes_on_target(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots swipe diagram -  'target_points' of points (x,y) on target coordinates and
+        'lines' that are tuple of (x,y) coordinates giving swipe start and end coordinates.
+       alternatively, 'target_points' can be replaced by 'passed_points' and 'failed_points' """
+    # Used by: hover, one finger swipe, non-stationary reporting rate
+    t = Timer(3)
+
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot arrows in the image
+    for line in plotinfo['lines']:
+        plt.arrow(line[0][0], line[0][1],
+                    line[1][0] - line[0][0],
+                    line[1][1] - line[0][1],
+                    width=0.1, length_includes_head=True)
+
+    t.Time("Arrows")
+
+    # points
+    if 'target_points' in plotinfo:
+        x = [p[0] for p in plotinfo['target_points']]
+        y = [p[1] for p in plotinfo['target_points']]
+        plt.scatter(x, y, s=_markersize, c=_DEFAULT)
+    else:
+        x = [p[0] for p in plotinfo['passed_points']]
+        y = [p[1] for p in plotinfo['passed_points']]
+        plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+        x = [p[0] for p in plotinfo['failed_points']]
+        y = [p[1] for p in plotinfo['failed_points']]
+        plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    t.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    t.Time("Save")
+
+@synchronized
+def plot_jitter_diagram(imagepath, plotinfo, dutinfo, **kwargs):
+    """ Plots jitter diagram - two subplots with target and swipe information
+        plotinfo argument must be a dictionary containing lists 'target_points'
+        and 'swipe_points' of points (x,y) on target coordinates """
+    # Used by: hover, one finger swipe
+
+    s = Timer(3)
+    fig = plt.figure(num=4, dpi=100, figsize=(10,6))
+    plt.clf()
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot panel borders
+    plt.subplot(121)
+    plot_one_finger_swipe_on_target(plotinfo, dutinfo)
+
+    # Swipe
+    plt.subplot(122)
+    plot_one_finger_swipe_offset_jitter(plotinfo)
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath, bbox_inches="tight")
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_linearity_details(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """
+        Plots linearity subplots for single line.
+
+        Requires:
+            swipe_points (tuples of (traveled_distance, offset))
+            linear_error (linear errors from least squares fit to reported coordinates)
+            offset_error (offset errors from least squares fit to robot line)
+
+    """
+
+    s = Timer(3)
+    fig = plt.figure(num=4, dpi=100, figsize=(12, 8))
+    plt.clf()
+
+    x = [p[0] for p in plotinfo['swipe_points']]
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    gs = gridspec.GridSpec(3, 1, height_ratios=[1, 1, 2])
+
+    # Plot panel borders
+    ax = plt.subplot(gs[0])
+    plt.xlabel('Distance traveled [mm]')
+    plt.ylabel('Linearity error [mm]')
+
+    plt.plot(x, plotinfo['linearity']['linear_error'], color='b')
+    plt.vlines(x, 0.0, plotinfo['linearity']['linear_error'], alpha=0.5)
+
+    # Swipe
+    plt.subplot(gs[1])
+    plt.xlabel('Distance traveled [mm]')
+    plt.ylabel('Offset error [mm]')
+
+    plt.plot(x, plotinfo['linearity']['offset_error'], color='b')
+    plt.vlines(x, 0.0, plotinfo['linearity']['offset_error'], alpha=0.5)
+
+    plt.subplot(gs[2])
+    plt.axis('equal')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+
+    plotters.plot_panel_borders(dutinfo.dimensions[0],
+                                dutinfo.dimensions[1],
+                                zorder=_zorder['edges'])
+
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0,
+             dutinfo.dimensions[1] + 5.0, -5.0])
+
+    x = [p[0] for p in plotinfo['passed_points']]
+    y = [p[1] for p in plotinfo['passed_points']]
+    plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='black')
+
+    x = [p[0] for p in plotinfo['failed_points']]
+    y = [p[1] for p in plotinfo['failed_points']]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='black')
+
+    s.Time("Plots")
+
+    plt.tight_layout(h_pad=0.3)
+    plt.subplots_adjust(top=0.95)
+
+    # Create the image
+    fig.savefig(imagepath, bbox_inches="tight")
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_linearity_detailed_histograms(imagepath, plotinfo, dutinfo, *args, **kwargs):
+
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(15, 13))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(14, 8))
+
+    if 'title' in kwargs:
+        fig.suptitle(kwargs['title'])
+
+    prefix = ''
+    if 'exclude_edges' in kwargs:
+        if kwargs['exclude_edges']:
+            prefix = 'center_'
+
+
+    columns = (
+        ('horizontal', 'Horizontal'),
+        ('vertical', 'Vertical'),
+        ('diagonal', 'Diagonal'),
+        ('all', 'Overall'))
+
+    for column, (column_id, column_name) in enumerate(columns):
+
+        ax = fig.add_subplot(3, 4, column + 1)
+
+        hist, bins = np.histogram(plotinfo[column_id][prefix + 'linearity_errors'], bins='auto')
+        width = 0.7 * (bins[1] - bins[0])
+        center = (bins[:-1] + bins[1:]) / 2
+
+        ax.bar(center, hist, align='center', width=width)
+        ax.set_ylabel('Count')
+        ax.set_xlabel('{} Linearity [mm]'.format(column_name))
+        skip = int(math.ceil(len(center) / 8.0))
+        ax.set_xticks(center[::skip])
+        plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+        ax = fig.add_subplot(3, 4, column + 5)
+
+        hist, bins = np.histogram(plotinfo[column_id][prefix + 'jitters'], bins='auto')
+        width = 0.7 * (bins[1] - bins[0])
+        center = (bins[:-1] + bins[1:]) / 2
+
+        ax.bar(center, hist, align='center', width=width)
+        ax.set_ylabel('Count')
+        ax.set_xlabel('{} Jitter [mm]'.format(column_name))
+        skip = int(math.ceil(len(center) / 8.0))
+        ax.set_xticks(center[::skip])
+        plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+        ax = fig.add_subplot(3, 4, column + 9)
+
+        hist, bins = np.histogram(plotinfo[column_id][prefix + 'offset_errors'], bins='auto')
+        width = 0.7 * (bins[1] - bins[0])
+        center = (bins[:-1] + bins[1:]) / 2
+
+        ax.bar(center, hist, align='center', width=width)
+        ax.set_ylabel('Count')
+        ax.set_xlabel('{} Offset [mm]'.format(column_name))
+        skip = int(math.ceil(len(center) / 8.0))
+        ax.set_xticks(center[::skip])
+        plt.xticks()
+        plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+    fig.tight_layout()
+    fig.subplots_adjust(top=0.9)
+    fig.savefig(imagepath)
+    plt.close(fig)
+
+def plot_one_finger_swipe_on_target(plotinfo, dutinfo):
+    """ Plots one swipe on panel. See plot_jitter_diagram() for parameters.
+        This is used in normal one finger swipe and in angle swipe.
+    """
+
+    plt.axis('equal')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+
+    plotters.plot_panel_borders(dutinfo.dimensions[0],
+                                dutinfo.dimensions[1],
+                                zorder=_zorder['edges'])
+
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0,
+             dutinfo.dimensions[1] + 5.0, -5.0])
+
+    # Target
+    if 'target_points' in plotinfo:
+        x = [p[0] for p in plotinfo['target_points']]
+        y = [p[1] for p in plotinfo['target_points']]
+        plt.scatter(x, y, s=_markersize, c=_DEFAULT)
+
+    else:
+        x = [p[0] for p in plotinfo['passed_points']]
+        y = [p[1] for p in plotinfo['passed_points']]
+        plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+
+        x = [p[0] for p in plotinfo['failed_points']]
+        y = [p[1] for p in plotinfo['failed_points']]
+        plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    if 'line_start' in plotinfo:
+        plt.arrow(plotinfo['line_start'][0], plotinfo['line_start'][1],
+                  plotinfo['line_end'][0] - plotinfo['line_start'][0],
+                  plotinfo['line_end'][1] - plotinfo['line_start'][1],
+                  width=0.1, length_includes_head=True)
+
+
+def plot_one_finger_swipe_offset_jitter(plotinfo):
+    """ Plots single swipe offset/jitter graph.
+        See plot_jitter_diagram() for parameters.
+        This is used in normal one finger swipe and in angle swipe.
+    """
+
+    plt.xlabel('distance traveled [mm]')
+
+    x = [p[0] for p in plotinfo['swipe_points']]
+    y = [p[1] for p in plotinfo['swipe_points']]
+
+    #plt.plot(x, y, "o-", color='k', mec='k', mfc='r')
+    plt.plot(x, y, color='b')
+    plt.vlines(x, 0.0, y, alpha=0.5)
+    plt.plot(x, plotinfo['jitters'], color=_DEFAULT)
+    plt.legend(("offset", "jitter"),
+               bbox_to_anchor=(1.05, 1),
+               loc=2,
+               borderaxespad=0)
+
+@synchronized
+def plot_one_finger_swipe_with_linear_fit(imagepath, plotinfo, dutinfo, **kwargs):
+    """ Plots linear fit diagram - two subplots with target and swipe information
+        plotinfo argument must be a dictionary containing lists 'target_points'
+        and 'swipe_points' of points (x,y) on target coordinates """
+    # Used by: one finger swipe
+
+    s = Timer(3)
+    fig = plt.figure(num=1, dpi=100, figsize=(10,11))
+    plt.clf()
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot points on regression line
+    plt.subplot2grid((4,2), (0,0), colspan=2, rowspan=1).set_title('Points on regression line')
+    plot_one_finger_swipe_with_linear_fit_on_target(plotinfo)
+
+    # Deviation from linear fit
+    plt.subplot2grid((4,2), (1,0), colspan=2, rowspan=1).set_title('Linear fit error calculated from regression line')
+    plot_one_finger_deviation_from_linear_fit(plotinfo)
+
+    # Plot panel borders
+    plt.subplot2grid((4,2), (2,0), colspan=1, rowspan=2).set_title('Points on robot drawn line')
+    plot_one_finger_swipe_on_target(plotinfo, dutinfo)
+
+    # Swipe
+    plt.subplot2grid((4,2), (2,1), colspan=1, rowspan=2).set_title('Jitter with a sliding window')
+    plot_one_finger_swipe_offset_jitter(plotinfo)
+
+    fig.subplots_adjust(hspace=0.7)
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath, bbox_inches="tight")
+    plt.close('all')
+    s.Time("Save")
+
+def plot_one_finger_swipe_with_linear_fit_on_target(plotinfo):
+    """ Plots one swipe on panel. See plot_jitter_diagram() for parameters.
+        This is used in normal one finger swipe and in angle swipe.
+    """
+
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+
+    x = [p[0] for p in plotinfo['swipe_points']]
+    y = [p[1] for p in plotinfo['swipe_points']]
+
+    plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+
+    if len(plotinfo['swipe_points']) > 0:
+        plt.axis([-0.2 + min(x), max(x) + 0.2,
+                 max(y) + 0.2, min(y) - 0.2])
+        fit = np.polyfit(x, y, 1)
+        fit_fn = np.poly1d(fit)
+        plt.plot(x, fit_fn(x), 'r', zorder=10)
+    else:
+        plt.plot([], [], 'r', zorder=10)
+
+def plot_one_finger_deviation_from_linear_fit(plotinfo):
+    """ Plots single swipe deviation from linear fit graph.
+        This is used in one finger swipe and in angle swipe.
+    """
+
+    plt.xlabel('distance traveled [mm]')
+
+    x = [p[0] for p in plotinfo['swipe_points']]
+    y = plotinfo['linear_error']
+
+    if len(plotinfo['swipe_points']) > 0:
+        plt.axis([-5.0 + min(x), max(x) + 5.0,
+                 0.0, max(y) + max(y) / 4])
+
+    linear_error, = plt.plot(x, y, color=_DEFAULT)
+
+    # Create a blank rectangle for adding additional info to legend
+    blank = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
+    max_err = round(plotinfo['lin_error_max'], 2)
+    avg_err = round(plotinfo['lin_error_avg'], 2)
+    rms_err = round(plotinfo['lin_error_rms'], 2)
+
+    plt.legend([linear_error, blank, blank, blank],
+               ("Linear fit error", "Max: %s" % max_err, "Avg: %s" % avg_err, "Rms: %s" % rms_err),
+               bbox_to_anchor=(1.02, 1),
+               loc=2,
+               borderaxespad=0,
+               fontsize=11)
+
+@synchronized
+def plot_reporting_rate(imagepath, plotinfo, **kwargs):
+    """ Plots reporting rate diagram. plotinfo argument must be a dictionary containing
+        'delays': list of delays, and 'passed' & 'failed' of tuples (0-based index, delay).
+       If there is max_delay in plotinfo, it is used to scale the axis """
+    # Used by: non-stationary reporting rate, stationary reporting rate
+
+    s = Timer(3)
+    fig = plt.figure(num=4, dpi=100, figsize=(10,6))
+    plt.clf()
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Delays
+    x = range(1, len(plotinfo['delays']) + 1)
+    plt.plot(x,plotinfo['delays'], "-", color='k')
+
+    x = [(p[0]+1) for p in plotinfo['passed']]
+    y = [p[1] for p in plotinfo['passed']]
+    plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    x = [(p[0]+1) for p in plotinfo['failed']]
+    y = [p[1] for p in plotinfo['failed']]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    plt.xlim(0, len(plotinfo['delays']) + 2)
+    if 'max_delay' in plotinfo and plotinfo['max_delay'] is not None:
+        plt.ylim(0, plotinfo['max_delay'] * 1.1)
+
+    if 'max_allowed_delay' in plotinfo:
+        plt.plot([0, len(plotinfo['delays']) + 2], [plotinfo['max_allowed_delay']] * 2, c=_FAIL)
+
+    plt.ylabel("Delay [ms]")
+    plt.xlabel("Point index")
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath, bbox_inches="tight")
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_taptest_on_target(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots one finger tap targets and points. Requires 'target-points',
+        'passed_points', and 'failed_points', last two are tuples of (x,y) tuples:
+        (target, actual_hit). If args[0] is 'detailed', a
+        more accurate version is plotted"""
+
+    s = Timer(3)
+
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+    plt.clf()
+
+    plt.axis('equal')
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+    else:
+        plt.suptitle('Overview plot')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    s.Time("Borders")
+
+    # plot targets
+    cx = np.cos(np.linspace(0,np.pi*2, num=32))
+    cy = np.sin(np.linspace(0,np.pi*2, num=32))
+    x = []
+    y = []
+    for p in plotinfo['hits']:
+        x.extend([p[0][0] + float(p[1])*c for c in cx])
+        y.extend([p[0][1] + float(p[1])*c for c in cy])
+        x.append(None)
+        y.append(None)
+    plt.plot(x, y, color="#000000")
+    x = []
+    y = []
+    for p in plotinfo['missing']:
+        x.extend([p[0][0] + float(p[1])*c for c in cx])
+        y.extend([p[0][1] + float(p[1])*c for c in cy])
+        x.append(None)
+        y.append(None)
+    plt.plot(x, y, color=_FAIL, zorder=_zorder['lines'])
+    s.Time("Targets")
+
+    # Passed points
+    lines_x = []
+    lines_y = []
+    for p in plotinfo['passed_points']:
+        lines_x.extend((p[0][0], p[1][0], None))
+        lines_y.extend((p[0][1], p[1][1], None))
+    px = [p[1][0] for p in plotinfo['passed_points']]
+    py = [p[1][1] for p in plotinfo['passed_points']]
+    plt.plot(lines_x, lines_y, color=_PASS, zorder=_zorder['lines'])
+    plt.scatter(px, py, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    s.Time("Plots")
+
+    # Failed points
+    lines_x = []
+    lines_y = []
+    for p in plotinfo['failed_points']:
+        lines_x.extend((p[0][0], p[1][0], None))
+        lines_y.extend((p[0][1], p[1][1], None))
+    px = [p[1][0] for p in plotinfo['failed_points']]
+    py = [p[1][1] for p in plotinfo['failed_points']]
+    plt.plot(lines_x, lines_y, color=_FAIL, zorder=_zorder['lines'])
+    plt.scatter(px, py, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+
+@synchronized
+def plot_dxdy_graph(imagepath, plotinfo, limited, *args, **kwargs):
+    """ Plots dx-dy graph with two histograms. If args[0] is 'detailed', a
+        more accurate version is plotted. The plotinfo parameter is a dectionary,
+        which contains passed_points (tuple (target_point, hit)), failed points
+        and 'maxposerror'. If edge are plot is to be printed, the 'maxposerror' is
+        replaced by 'edgepositioningerror' """
+    #used by: one finger tap
+    s = Timer(3)
+
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+
+    plt.clf()
+
+    # setup subpolots
+    plt.axis('equal')
+    gs = gridspec.GridSpec(2, 2, width_ratios = [3, 1], height_ratios = [3, 1])
+    ax = plt.subplot(gs[0])
+
+    # Axis labels
+    plt.xlabel('linearity error X [mm]')
+    plt.ylabel('linearity error Y [mm]')
+    ax.grid(True)
+    ax.axhline(color="#000000")
+    ax.axvline(color="#000000")
+
+    # Draw acceptance circle
+    if 'edge_only' not in kwargs:
+        radius = float(plotinfo['maxposerror'])
+        x = radius*np.cos(np.linspace(0,np.pi*2))
+        y = radius*np.sin(np.linspace(0,np.pi*2))
+        plt.plot(x, y, "k")
+
+    if 'edgepositioningerror' in plotinfo and 'center_only' not in kwargs:
+        # Draw second acceptance limit to the edge areas
+        radius = float(plotinfo['edgepositioningerror'])
+        x = radius*np.cos(np.linspace(0,np.pi*2))
+        y = radius*np.sin(np.linspace(0,np.pi*2))
+        plt.plot(x, y, "k")
+
+    if limited:
+        ax.set_xlim(-radius, radius)
+        ax.set_ylim(-radius, radius)
+        ax.set_aspect('equal')
+        if 'center_only' in kwargs:
+            plt.title('Center input error scatter plot (limited area)')
+        elif 'edge_only' in kwargs:
+            plt.title('Edge input error scatter plot (limited area)')
+        else:
+            plt.title('Input error scatter plot (limited area)')
+    else:
+        ax.set_aspect('equal')
+        plt.title('Input error scatter plot')
+
+    passed_points_x = [(p[1][0] - p[0][0]) for p in plotinfo['passed_points']]
+    passed_points_y = [(p[1][1] - p[0][1]) for p in plotinfo['passed_points']]
+    failed_points_x = [(p[1][0] - p[0][0]) for p in plotinfo['failed_points']]
+    failed_points_y = [(p[1][1] - p[0][1]) for p in plotinfo['failed_points']]
+    ax.scatter(passed_points_x, passed_points_y, s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    ax.scatter(failed_points_x, failed_points_y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    # Set yaxis location and tick location
+    ax.yaxis.tick_right()
+    ax.set_ylim(ax.get_ylim()[::-1])
+
+
+
+    # plot histograms
+    ax1 = plt.subplot(gs[1], sharey=ax)
+    # Set histogram bins according to the ticks in the axis
+    bins = ax1.get_yticks()
+    bins = plotters.split_bins(bins, 3)
+    plt.setp(ax1.get_yticklabels(), visible=False)
+    #ax1.set_xticklabels([])
+    plt.hist([passed_points_y, failed_points_y], bins=bins, orientation='horizontal', color=[_PASS, _FAIL], stacked=True, edgecolor='k')
+    labels = [int(l) for l in ax1.get_xticks()]
+    for i in range(1, len(labels) - 1):
+        labels[i] = ''
+    ax1.set_xticklabels(labels)
+
+    ax2 = plt.subplot(gs[2], sharex=ax)
+    #ax2.set_yticklabels([])
+    #ax2.yaxis.tick_right()
+    plt.setp(ax2.get_xticklabels(), visible=False)
+    bins = ax2.get_xticks()
+    bins = plotters.split_bins(bins, 3)
+    plt.hist([passed_points_x, failed_points_x], bins=bins, orientation='vertical', color=[_PASS, _FAIL], stacked=True, edgecolor='k')
+    ax2.set_ylim(ax2.get_ylim()[::-1])
+    labels = [int(l) for l in ax2.get_yticks()]
+    for i in range(1, len(labels) - 1):
+        labels[i] = ''
+    ax2.set_yticklabels(labels)
+
+    if limited:
+        ax.set_xlim(-radius, radius)
+        ax.set_ylim(radius, -radius)
+        ax.set_aspect('equal')
+
+    # Create the image
+    plt.tight_layout()
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_p2p_err_histogram(imagepath, plotinfo, limited, *args, **kwargs):
+    if len(args) > 0 and args[0] == 'detailed':
+        fig = plt.figure(num=2, dpi=100, figsize=(20,20))
+    else:
+        fig = plt.figure(num=1, dpi=100, figsize=(8,6))
+
+    acc_errors = plotinfo['distances']
+
+    num_bins = 30
+    plt.hist(acc_errors, bins=num_bins, color='gray', stacked=True, edgecolor='k')
+    plt.xlabel('Accuracy [mm]')
+    plt.ylabel('Frequency')
+    plt.title('Input Error Histogram')
+
+
+    sorted_acc_errors = np.sort(acc_errors)
+    index_85_0 = round(0.85*len(acc_errors)) - 1
+    limit_85_0 = sorted_acc_errors[index_85_0]
+    index_99_7 = round(0.997*len(acc_errors)) - 1
+    limit_99_7 = sorted_acc_errors[index_99_7]
+
+    line_85 = plt.axvline(x=limit_85_0, linewidth=2, color='g')
+    line_997 = plt.axvline(x=limit_99_7, linewidth=2, color='r')
+
+    # Create a blank rectangle for adding additional info to legend
+    blank = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
+
+    legend = plt.legend([line_85, line_997, blank, blank], (u"85 % = " + str(limit_85_0) + u" mm",
+                         u"99.7 % = " + str(limit_99_7) + u" mm",
+                         "Mean: %s mm" % round(np.mean(acc_errors), 2),
+                         "Std: %s mm" % round(np.std(acc_errors), 2)), fontsize=11)
+    # Create the image
+    plt.tight_layout()
+    fig.savefig(imagepath)
+    plt.close('all')
+
+@synchronized
+def plot_multifinger_p2p(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots multifinger tap test detailed overview plot.
+        plotinfo argument is the result array from multifinger analysis """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(1)
+    plt.clf()
+
+    # Plot panel borders
+    plt.axis('equal')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    lines = []
+    passed_fingers = []
+    failed_fingers = []
+    for tap in plotinfo['taps']:
+        for point, verdict in zip(tap['targetpoints'], [f['verdict'] for f in tap['fingers']]):
+            lines.append(point)
+            if verdict:
+                passed_fingers.append(point)
+            else:
+                failed_fingers.append(point)
+        lines.append((None, None))
+
+    # Lines connecting points
+    x = [p[0] for p in lines]
+    y = [p[1] for p in lines]
+    plt.plot(x, y, color='k', zorder=_zorder['lines'])
+    # Passed points
+    x = [p[0] for p in passed_fingers]
+    y = [p[1] for p in passed_fingers]
+    plt.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+    # Failed points
+    x = [p[0] for p in failed_fingers]
+    y = [p[1] for p in failed_fingers]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='k')
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+
+
+@synchronized
+def plot_multifinger_tapdetails(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots multifinger tap detailed plot for single tap.
+        plotinfo argument is the result array from multifinger tap analysis """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(num=3, dpi=100, figsize=(8,8))
+    plt.clf()
+
+    cx = np.cos(np.linspace(0,np.pi*2, num=32))
+    cy = np.sin(np.linspace(0,np.pi*2, num=32))
+
+    num_fingers = plotinfo['num_fingers']
+
+    gs = gridspec.GridSpec(2, num_fingers, height_ratios = [3, 1])
+    ax0 = plt.subplot(gs[0, :])
+    axf = [plt.subplot(gs[1, i]) for i in range(num_fingers)]
+
+    ax0.axis('equal')
+    if 'title' in kwargs:
+        ax0.set_title(kwargs['title'])
+
+    error_c = []
+    passed_points = []
+    failed_points = []
+    failed_lines = []
+    for i, f in enumerate(plotinfo['fingers']):
+        passed_f = []
+        failed_f = []
+        failed_linesf = []
+        for id in f['points'].keys():
+            passed_f.extend([p for d, p in zip(f['distances'][id], f['points'][id]) if d <= f['maxposerror']])
+            failed_f.extend([p for d, p in zip(f['distances'][id], f['points'][id]) if d > f['maxposerror']])
+            for p in failed_f:
+                failed_linesf.extend(zip((f['target'][0], p[0], None), (f['target'][1], p[1], None)))
+        passed_points.extend(passed_f)
+        failed_points.extend(failed_f)
+        failed_lines.extend(failed_linesf)
+
+        error_cf = zip([f['target'][0] + x * float(f['maxposerror']) for x in cx],
+                       [f['target'][1] + y * float(f['maxposerror']) for y in cy])
+        error_c.extend(error_cf)
+        error_c.append((None,None))
+
+        axf[i].axis('equal')
+        axf[i].set_xticklabels([])
+        axf[i].set_yticklabels([])
+        axf[i].set_title('Finger %d' % (i + 1))
+
+        # Subplot: Passed points
+        x = [p[0] for p in passed_f]
+        y = [p[1] for p in passed_f]
+        axf[i].scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+        # Subplot: lines
+        x = [p[0] for p in error_cf]
+        y = [p[1] for p in error_cf]
+        axf[i].plot(x, y, color='k', zorder=_zorder['lines'])
+        # Subplot: Lines to failed points
+        x = [p[0] for p in failed_linesf]
+        y = [p[1] for p in failed_linesf]
+        axf[i].plot(x, y, color=_FAIL, zorder=_zorder['lines'])
+        # Subplot: Failed points
+        x = [p[0] for p in failed_f]
+        y = [p[1] for p in failed_f]
+        axf[i].scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='k')
+        diagstr = "n=%d, id: %s" % (len(passed_f) + len(failed_f), ','.join(str(k) for k in f['points'].keys()))
+        col = 'k' if len(f['points'].keys()) == 1 else _FAIL
+        axf[i].text(0.5, -0.15,diagstr, color=col, horizontalalignment='center', verticalalignment='center', transform=axf[i].transAxes)
+        axf[i].set_ylim(axf[i].get_ylim()[::-1])
+
+
+    # Annotations
+    x = [f['target'][0] for f in plotinfo['fingers']]
+    y = [f['target'][1] for f in plotinfo['fingers']]
+    d = [float(f['maxposerror']) for f in plotinfo['fingers']]
+    strings = [i + 1 for i in range(len(plotinfo['fingers']))]
+    for (x, y, d, string) in zip(x, y, d, strings):
+        ax0.annotate(string, (x+d,y+d), xytext=(1, 1), textcoords='offset points')
+
+    # Passed points
+    x = [p[0] for p in passed_points]
+    y = [p[1] for p in passed_points]
+    ax0.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+    # Circles
+    x = [p[0] for p in error_c]
+    y = [p[1] for p in error_c]
+    ax0.plot(x, y, color='k', zorder=_zorder['lines'])
+
+    # Lines to failed points
+    x = [p[0] for p in failed_lines]
+    y = [p[1] for p in failed_lines]
+    ax0.plot(x, y, color=_FAIL, zorder=_zorder['lines'])
+    # Failed points
+    x = [p[0] for p in failed_points]
+    y = [p[1] for p in failed_points]
+    ax0.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='k')
+    ax0.set_ylim(ax0.get_ylim()[::-1])
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_separation_results(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots separation general view
+        plotinfo argument is the result array from separation analysis """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(1)
+    plt.clf()
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    passed = []
+    failed = []
+    for angle, avalues in plotinfo['angles'].items():
+        for distance, dvalues in avalues['distances'].items():
+            if dvalues['verdict']:
+                passed.extend([dvalues['point'], dvalues['point2']])
+            else:
+                failed.extend([dvalues['point'], dvalues['point2']])
+
+    # Passed points
+    x = [p[0] for p in passed]
+    y = [p[1] for p in passed]
+    plt.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    # Failed points
+    x = [p[0] for p in failed]
+    y = [p[1] for p in failed]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    s.Time("Plots")
+
+    ax = plt.gca()
+    ax.autoscale(tight=True)
+    ax.set_aspect('equal', 'datalim')
+    ax.set_ylim(ax.get_ylim()[::-1])
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_separation_details(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots separation general view
+        plotinfo argument is the result array from separation analysis """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(1)
+    plt.clf()
+    plt.axis('equal')
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    passed = []
+    failed = []
+    for angle, avalues in plotinfo['angles'].items():
+        for distance, dvalues in avalues['distances'].items():
+            for tapid, taps in dvalues['taps'].items():
+                if dvalues['verdict']:
+                    passed.extend(taps)
+                else:
+                    failed.extend(taps)
+
+    # Passed points
+    x = [p[0] for p in passed]
+    y = [p[1] for p in passed]
+    plt.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    # Failed points
+    x = [p[0] for p in failed]
+    y = [p[1] for p in failed]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+
+    ax = plt.gca()
+    ax.autoscale(tight=True)
+    ax.set_aspect('equal', 'datalim')
+    ax.set_ylim(ax.get_ylim()[::-1])
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+@synchronized
+def plot_separation_tapdetails(imagepath, plotinfo, dutinfo, *args, **kwargs):
+    """ Plots separation tap details
+        plotinfo argument is the result array from separation analysis """
+    # Used by:
+
+    s = Timer(3)
+    fig = plt.figure(5, figsize=(6,6), dpi=100)
+    plt.clf()
+    plt.axis('equal')
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    radius = plotinfo['point_diameter'] / 2.0
+    x = plotinfo['point'][0] + radius*np.cos(np.linspace(0,np.pi*2))
+    y = plotinfo['point'][1] + radius*np.sin(np.linspace(0,np.pi*2))
+    plt.plot(x, y, "k", zorder=_zorder['lines'])
+    radius = plotinfo['point2_diameter'] / 2.0
+    x = plotinfo['point2'][0] + radius*np.cos(np.linspace(0,np.pi*2))
+    y = plotinfo['point2'][1] + radius*np.sin(np.linspace(0,np.pi*2))
+    plt.plot(x, y, "k", zorder=_zorder['lines'])
+
+    passed = []
+    failed = []
+    lines = []
+    for tapid, taps in plotinfo['taps'].items():
+        if plotinfo['verdict']:
+            passed.extend(taps)
+        else:
+            failed.extend(taps)
+        lines.extend(taps)
+        lines.append((None,None))
+
+    # Passed points
+    x = [p[0] for p in passed]
+    y = [p[1] for p in passed]
+    plt.scatter(x, y,  s=_markersize, c=_PASS, zorder=_zorder['pass'],edgecolors='k')
+    # Failed points
+    x = [p[0] for p in failed]
+    y = [p[1] for p in failed]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'],edgecolors='k')
+    x = [p[0] for p in lines]
+    y = [p[1] for p in lines]
+    plt.plot(x, y, "k", zorder=_zorder['lines'])
+
+    ax = plt.gca()
+    ax.set_ylim(ax.get_ylim()[::-1])
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath)
+    plt.close('all')
+    s.Time("Save")
+
+
+@synchronized
+def plot_multifinger_swipedetails(imagepath, plotinfo, dutinfo, **kwargs):
+    """ Plots multifinger swipe details diagram - two subplots with target and swipe information
+        plotinfo argument comes from multifinger swipe analysis """
+    # Used by: multifinger swipe
+
+    s = Timer(3)
+    fig = plt.figure(num=6, dpi=100, figsize=(10,8))
+    plt.clf()
+
+    if 'title' in kwargs:
+        plt.suptitle(kwargs['title'])
+
+    # Plot panel borders
+    gs = gridspec.GridSpec(len(plotinfo['fingers']), 2, hspace=0.35)
+    ax = plt.subplot(gs[:, 0])
+
+    plt.axis('equal')
+    plt.xlabel('X [mm]')
+    plt.ylabel('Y [mm]')
+    plotters.plot_panel_borders(dutinfo.dimensions[0], dutinfo.dimensions[1],zorder=_zorder['edges'])
+    plt.axis([-5.0, dutinfo.dimensions[0] + 5.0, dutinfo.dimensions[1] + 5.0, -5.0])
+
+    passed = []
+    failed = []
+
+    for finger in plotinfo['fingers']:
+        for idpoints in finger['passed_points'].values():
+            passed.extend(idpoints)
+        for idpoints in finger['failed_points'].values():
+            failed.extend(idpoints)
+        plt.arrow(finger['swipe_start'][0], finger['swipe_start'][1],
+                  finger['swipe_end'][0] - finger['swipe_start'][0],
+                  finger['swipe_end'][1] - finger['swipe_start'][1],
+                  width=0.1, length_includes_head=True)
+
+    # Target
+    x = [p[0] for p in passed]
+    y = [p[1] for p in passed]
+    plt.scatter(x, y, s=_markersize, c=_PASS, zorder=_zorder['pass'], edgecolors='k')
+    x = [p[0] for p in failed]
+    y = [p[1] for p in failed]
+    plt.scatter(x, y, s=_markersize, c=_FAIL, zorder=_zorder['fail'], edgecolors='k')
+
+    # Plot swipes
+    for i, finger in enumerate(plotinfo['fingers']):
+        axf = plt.subplot(gs[i, 1])
+        if i == len(plotinfo['fingers']) - 1:
+            plt.xlabel('distance traveled [mm]')
+
+        x = []
+        y = []
+        jitters = []
+        for fid in finger['swipe_points'].keys():
+            x.extend([p[0] for p in finger['swipe_points'][fid]])
+            y.extend([p[1] for p in finger['swipe_points'][fid]])
+            jitters.extend(finger['jitters'][fid])
+        #plt.plot(x, y, "o-", color='k', mec='k', mfc='r')
+        plt.plot(x, y, color='b')
+        plt.vlines(x, 0.0, y, alpha=0.5)
+        plt.plot(x, jitters, color=_DEFAULT)
+        if len(x) > 0:
+            axf.set_title('Finger %d id: %s, n=%d' % (i + 1, ', '.join([str(id) for id in finger['swipe_points'].keys()]), len(x)), fontsize=8)
+        else:
+            axf.set_title('Finger %d no measurements' % (i + 1), fontsize=8)
+        legend = plt.legend(("offset", "jitter"), bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0, fontsize=8)
+        for tick in axf.xaxis.get_major_ticks():
+            tick.label.set_fontsize(8)
+        for tick in axf.yaxis.get_major_ticks():
+            tick.label.set_fontsize(8)
+
+    s.Time("Plots")
+
+    # Create the image
+    fig.savefig(imagepath, bbox_inches="tight")
+    plt.close('all')
+    s.Time("Save")
+
diff --git a/TPPTAnalysisSW/plotinfo.py b/TPPTAnalysisSW/plotinfo.py
new file mode 100644
index 0000000..3e50cd0
--- /dev/null
+++ b/TPPTAnalysisSW/plotinfo.py
@@ -0,0 +1,136 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import TPPTAnalysisSW.transform2d as transform2d
+import TPPTAnalysisSW.measurementdb as db
+
+class TestSessionInfo:
+    """ Information class that holds test session information contents """
+
+    def __init__(self, testsession=None, testsession_id=None, dbsession=None):
+        """ Initializes the session info """
+
+        if testsession is None:
+            if dbsession is None:
+                dbsession = db.get_database().session()
+            testsession = dbsession.query(db.TestSession).filter(db.TestSession.id == testsession_id).first()
+
+        self.id = testsession.id
+        
+        self.operator = testsession.operator
+        self.starttime = testsession.starttime
+        self.endtime = testsession.endtime
+        self.notes = testsession.notes
+        
+        # Fetch the session parameters
+        self.parameters = {}
+        for param in testsession.session_parameters:
+            if param.isFloat:
+                self.parameters[param.name] = param.valueFloat
+            else:
+                self.parameters[param.name] = param.valueString
+
+class TestDUTInfo:
+    """ Information class that holds test session information contents """
+
+    def __init__(self, testdut=None, testdut_id=None, dbsession=None):
+        """ Initializes the DUT info """
+
+        if testdut is None:
+            if dbsession is None:
+                dbsession = db.get_database().session()
+            testdut = dbsession.query(db.TestDUT).filter(db.TestDUT.id == testdut_id).first()
+
+        self.id = testdut.id
+        
+        self.program = testdut.program
+        self.manufacturer = testdut.manufacturer
+        self.batch = testdut.batch
+        self.sample_id = testdut.sample_id
+        self.svg_data = testdut.svg_data
+        
+        # Fetch the session parameters
+        self.parameters = {}
+        for param in testdut.dut_parameters:
+            if param.isFloat:
+                self.parameters[param.name] = param.valueFloat
+            else:
+                self.parameters[param.name] = param.valueString
+
+        # Handle the parameters
+
+        # Digitizer resolution
+        self.digitizer_resolution = [float(s) for s in self.parameters['DUT resolution [x;y, p.c.]'].split(';')]
+        # Physical dimensions
+        self.dimensions = [float(s) for s in self.parameters['DUT dimensions [x;y, mm]'].split(';')]
+        # Offset to be added to the measurements
+        self.offset = [float(s) for s in self.parameters['DUT offset [x;y, mm]'].split(';')]
+        
+        # Flip x-coordinates
+        self.flipx = False
+        if 'Flip X coordinates' in self.parameters:
+            if self.parameters['Flip X coordinates'] is None or self.parameters['Flip X coordinates'] != "0":
+                self.flipx = True
+
+        # Flip x-coordinates
+        self.flipy = False
+        if 'Flip Y coordinates' in self.parameters:
+            if self.parameters['Flip Y coordinates'] is None or self.parameters['Flip Y coordinates'] != "0":
+                self.flipy = True
+
+        # Switch X->Y
+        self.switchxy = False
+        if '(X,Y) --> (Y,X)' in self.parameters:
+            if self.parameters['(X,Y) --> (Y,X)'] is None or self.parameters['(X,Y) --> (Y,X)'] != "0":
+                self.switchxy = True
+    
+    def save(self, dbsession=None):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+
+        testdut = dbsession.query(db.TestDUT).filter(db.TestDUT.id == self.id).first()
+        saveparams = {
+                      'DUT resolution [x;y, p.c.]': ";".join(str(f) for f in self.digitizer_resolution),
+                      'DUT dimensions [x;y, mm]': ';'.join(str(f) for f in self.dimensions),
+                      'DUT offset [x;y, mm]': ';'.join(str(f) for f in self.offset),
+                      'Flip X coordinates': '1' if self.flipx else '0',
+                      'Flip Y coordinates': '1' if self.flipy else '0',
+                      '(X,Y) --> (Y,X)': '1' if self.switchxy else '0',
+                      }
+
+        testdut.manufacturer = self.manufacturer
+        testdut.program = self.program
+        testdut.batch = self.batch
+        testdut.sample_id = self.sample_id
+
+        for param in testdut.dut_parameters:
+            if param.name in saveparams:
+                # Update existing value
+                param.valueString = saveparams[param.name]
+                param.isFloat = None
+                del saveparams[param.name]
+
+        for key, value in saveparams.items():
+            # Add non-existing values (a strange situation...)
+            dbsession.add(db.DutParameters(dut_id=self.id, name=key, valueString=value))
+
+        dbsession.commit()
diff --git a/TPPTAnalysisSW/plotters.py b/TPPTAnalysisSW/plotters.py
new file mode 100644
index 0000000..1f791d5
--- /dev/null
+++ b/TPPTAnalysisSW/plotters.py
@@ -0,0 +1,70 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+# Contains functions which do the math and plot figures
+# These functions do not cause side effects
+
+import numpy as np
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+from numpy import diff
+from matplotlib import cm
+
+def plot_panel_borders(panelwidthmm, panelheightmm, zorder=1):
+    # Plots panel borders to the plot
+    plt.plot([panelwidthmm,0],[0,0], color="black", zorder=zorder)
+    plt.plot([0,0],[0,panelheightmm], color="black", zorder=zorder)
+    plt.plot([0,panelwidthmm],[panelheightmm,panelheightmm], color="black", zorder=zorder)
+    plt.plot([panelwidthmm,panelwidthmm],[0,panelheightmm], color="black", zorder=zorder)
+
+def plot_3d_panel_borders(ax, panelwidthmm, panelheightmm, zorder=1):
+    # Plots panel borders to the plot
+    x = np.array([0, panelwidthmm])
+    y = np.array([0, panelheightmm])
+    x, y = np.meshgrid(x, y)
+    z = np.zeros(x.shape)
+    surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.gray,
+                           linewidth=1, antialiased=False, zorder=zorder,
+                           alpha=0.6)
+
+def split_bins(bins, factor):
+    """ Splits the equally sized bins into smaller bins of equal size, each bin is splitted into factor new bins """
+    retval = [bins[0]]
+    diffs = diff(bins) # Bin sizes
+
+    # This loop extends the array item by item by inserting (factor - 1) new values in each bin
+    for b, d in zip(bins[1:], diffs):
+        retval.extend([(b - i*d/factor) for i in range(factor - 1, -1, -1)])
+
+    return retval
+
+def get_range(points):
+    """ Gets the range of list of (x, y) points. Returns tuple of (min_x, min_y, max_x, max_y) 
+        The point tuples may contain other values that are discarded. Returns None if
+        there are no points in the list """
+    if points is None or len(points) == 0:
+        return None
+
+    x = [p[0] for p in points]
+    y = [p[1] for p in points]
+    return (min(x), min(y), max(x), max(y))
diff --git a/TPPTAnalysisSW/progressstatus.py b/TPPTAnalysisSW/progressstatus.py
new file mode 100644
index 0000000..38d0209
--- /dev/null
+++ b/TPPTAnalysisSW/progressstatus.py
@@ -0,0 +1,24 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+def initProgress():
+    global progress
+    progress = 0.0
diff --git a/TPPTAnalysisSW/requirements.txt b/TPPTAnalysisSW/requirements.txt
new file mode 100644
index 0000000..ae2d0dd
--- /dev/null
+++ b/TPPTAnalysisSW/requirements.txt
@@ -0,0 +1,6 @@
+genshi
+sqlalchemy
+pymysql
+numpy
+matplotlib
+cherrypy
\ No newline at end of file
diff --git a/TPPTAnalysisSW/settings.py b/TPPTAnalysisSW/settings.py
new file mode 100644
index 0000000..1da061a
--- /dev/null
+++ b/TPPTAnalysisSW/settings.py
@@ -0,0 +1,59 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from decimal import Decimal
+from .measurementdb import Setting
+
+settings = {}
+
+precision = Decimal("0.001") # Precision to use in calculations
+
+setting_categories = {'One Finger Non-Stationary Reporting Rate': ['minreportingrate'],
+                      'One Finger Swipe': ['maxoffset', 'maxjitter', 'jittermask', 'maxmissingswipes'],
+                      'Linearity': ['max_avg_of_max_errors', 'max_rms_error', 'min_report_rate',
+                                    'min_report_rate_noise_inj_single', 'min_report_rate_noise_inj_multi',
+                                    'max_missing_swipes', 'max_broken_lines', 'max_ghost_fingers', 'jitter_mask'],
+                      'One Finger Tap': ['edgelimit', 'maxposerror', 'maxmissing', 'edgepositioningerror', 'maxedgemissing'],
+                      'Grid Accuracy': ['max_error_edge', 'max_error_edge_corner_notch', 'max_error_center',
+                                        'grid_acc_missing_points'],
+                      'One Finger Tap Repeatability': ['maxrepeaterror'],
+                      'One Finger Tapping Repeatability Test': ['max_error_edge_down', 'max_error_edge_up',
+                                                                'max_error_center_down', 'max_error_center_up',
+                                                                'max_error_corner_down', 'max_error_corner_up',
+                                                                'repeatability_missing_points'],
+                      'One Finger Stationary Jitter': ['maxstationaryjitter'],
+                      'Stationary Jitter Static Noise': ['max_stat_jitter_no_noise', 'max_stat_jitter_noise',
+                                                         'max_noise_test_jitter', 'jitter_missing_points'],
+                      'One Finger Stationary Reporting Rate': ['minreportingrate'],
+                      'MultiFinger Tap': ['edgelimit', 'maxposerror', 'maxmissing', 'edgepositioningerror', 'maxedgemissing'],
+                      'MultiFinger Swipe': ['maxoffset', 'maxjitter', 'jittermask', 'maxmissingswipes'],
+                      'Two Finger Separation': ['maxseparation', 'maxdiagseparation'],
+                      }
+
+csvchars = ".,"
+
+def loadSettings(dbsession):
+    global settings
+    dbSettings = dbsession.query(Setting).all()
+
+    for s in dbSettings:
+        settings[s.id] = Decimal.quantize(Decimal(s.value), precision)
diff --git a/TPPTAnalysisSW/settings_page.py b/TPPTAnalysisSW/settings_page.py
new file mode 100644
index 0000000..cb961ed
--- /dev/null
+++ b/TPPTAnalysisSW/settings_page.py
@@ -0,0 +1,178 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import traceback
+import json
+
+import cherrypy
+from cherrypy import HTTPError
+from genshi.template import MarkupTemplate
+
+from .base_page import BasePage
+from .measurementdb import get_database, Setting
+import TPPTAnalysisSW.test_session as test_session
+import TPPTAnalysisSW.imagefactory as imagefactory
+from .settings import settings, setting_categories, loadSettings
+from .info.version import Version
+import TPPTAnalysisSW.progressstatus as progressstatus
+import TPPTAnalysisSW.test_refs as test_refs
+
+
+#Settings controller for settings-view
+class SettingsController(BasePage):
+
+    SAVEPATH = ""
+
+    def GET(self, *args, **kwargs):
+
+        if "event" in kwargs:
+            cherrypy.response.headers["Content-Type"] = "text/event-stream"
+            cherrypy.response.headers["Transfer-Encoding"] = "identity"
+            return "data: " + str(progressstatus.progress) + "\ndata:\nretry:500\n\n"
+
+        dbsession = get_database().session()
+        with open("templates/settings.html") as f:
+
+            tmpl = MarkupTemplate(f)
+            settings = dbsession.query(Setting).all()
+            groups = self.settings_by_group(settings)
+            stream = tmpl.generate(groups=groups, version=Version)
+
+            return stream.render('xhtml')
+
+    def POST(self, *args, **kwargs):
+
+        dbsession = get_database().session()
+        data = json.loads(kwargs['params'])
+
+        for i in data:
+            setting = dbsession.query(Setting).filter(Setting.id == i['id']).first()
+            try:
+                strvalue = i['value']
+                strvalue = strvalue.replace(',', '.') # Allow comma decimal separator
+                setting.value = float(strvalue)
+            except ValueError:
+                print(traceback.format_exc())
+                dbsession.rollback()
+                raise HTTPError("500", "Float value required for %s" % setting.desc)
+
+        dbsession.commit()
+        loadSettings(dbsession) # from settings.py
+
+        # clear cache
+        test_refs.testclass_refs.clear()
+        imagefactory.ImageFactory.delete_all_images()
+
+        if kwargs['mode'] == "recalculate":
+
+            testsessions = get_database().get_test_sessions()
+            length = len(testsessions)
+
+            for idx, ts in enumerate(testsessions):
+                test_session.TestSession.eval_tests_results(dbsession, ts.id)
+                if idx == 0:
+                    progressstatus.progress = 0
+                else:
+                    progressstatus.progress = round(idx / float(length), 2)
+
+            progressstatus.progress = 0
+
+            return "Settings saved and analyses recalculated."
+
+        testsessions = get_database().get_test_sessions()
+
+        for ts in testsessions:
+            test_session.TestSession.eval_tests_results(dbsession, ts.id, recalculate=False)
+
+        return "Settings saved but analyses were not recalculated."
+
+    def settings_by_group(self, settings):
+        # Copy settings to safety
+        settings = list(settings)
+        groups, groups_settings = self.parse_groups()
+
+        # Replace setting_id with given setting
+        for group_settings in groups_settings:
+            for i, setting_id in enumerate(group_settings):
+                setting = [s for s in settings if s.id == setting_id]
+                if len(setting) == 0:
+                    raise HTTPError(status="500", message="Internal error: setting %s not found in database" % setting)
+                else:
+                    settings.remove(setting[0])
+                    group_settings[i] = setting[0]
+
+        if len(settings) > 0:
+            # There are non-categorized settings
+            groups.append(None)
+            groups_settings.append(settings)
+
+        # Note: this will break if some of the settings given in settings_categories
+        # is not found in the database. This should be rare condition, as missing
+        # settings are inserted in the startup sequence
+
+        return zip(groups, groups_settings)
+
+    def parse_groups(self):
+        """
+        Parses the group to list of categories. Creates separate categories
+        for settings that are in multiple categories
+        """
+
+        settings_dict = {}
+
+        # Create settings list (reverse: setting_id -> categories)
+        # Note: generated lists are equal if they are included in the same categories
+        for name, settings_list in setting_categories.items():
+            for setting_id in settings_list:
+                if setting_id in settings_dict:
+                    settings_dict[setting_id].append(name)
+                else:
+                    settings_dict[setting_id] = [name]
+
+        # List of different categories
+        groups = []
+        # Settings in each category
+        groups_settings = []
+
+        for setting_id, groups_list in settings_dict.items():
+            if groups_list in groups:
+                # Append setting to the specific group
+                groups_settings[groups.index(groups_list)].append(setting_id)
+            else:
+                # Create a new group in list and add the settings to it
+                # order groups by number of categories in group and alphabetically
+                for index_to in range(len(groups)):
+                    if len(groups[index_to]) < len(groups_list):
+                        continue
+                    elif (len(groups[index_to]) > len(groups_list) or
+                          groups[index_to][0] > groups_list[0]):
+                        groups.insert(index_to, groups_list)
+                        groups_settings.insert(index_to, [setting_id])
+                        break
+                else:
+                    # Append
+                    groups.append(groups_list)
+                    groups_settings.append([setting_id])
+
+        return (groups, groups_settings)
+
+    exposed = True
diff --git a/TPPTAnalysisSW/sqluploader.py b/TPPTAnalysisSW/sqluploader.py
new file mode 100644
index 0000000..c8612ec
--- /dev/null
+++ b/TPPTAnalysisSW/sqluploader.py
@@ -0,0 +1,113 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from sqlalchemy import create_engine
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import sessionmaker, scoped_session
+from ruamel.yaml import YAML
+
+import logging
+
+log = logging.getLogger(__name__)
+
+engine = None
+session_maker = sessionmaker()
+Session = scoped_session(session_maker)
+
+Base = declarative_base()
+
+def is_sql_uploader_initialized():
+    return engine is not None
+
+def initialize(configuration_path):
+    try:
+        configuration = read_configuration(configuration_path)
+    except FileNotFoundError:
+        log.warning("Could not find database config file. Upload of results is not possible.")
+        return
+
+    # if database usage is not enabled we'll return at this point
+    if not configuration["database_enabled"]:
+        return
+
+    try:
+        host_data = {'database_engine': configuration['database_engine'],
+                     'host_name': configuration['host_name'],
+                     'port': configuration['port'],
+                     'user_name': configuration['user_name'],
+                     'password': configuration['password'],
+                     'database': configuration['database']}
+    except KeyError:
+        log.error('Required database configuration data is missing')
+        return
+
+    try:
+        global engine
+        engine = create_engine(
+            '{database_engine}://{user_name}:{password}@{host_name}:{port}/{database}'.format(**host_data))
+        session_maker.configure(bind=engine)
+
+        # Create summary and result tables if they don't exist
+        Base.metadata.create_all(engine)
+    except:
+        engine = None
+        log.error('Failed to initialize database')
+        return
+
+
+
+def upload_test(test_object):
+    if engine is None:
+        log.error("Result database was not initialized correctly. Unable to upload test results.")
+        return
+
+    # The session is created here and passed to the test object
+    # and the test object handles the data write
+    session = Session()
+    try:
+        test_object.upload_sql_data(session)
+        return "Upload successful"
+    except Exception as e:
+        session.rollback()
+        raise e
+    finally:
+        session.close()
+
+
+def read_configuration(configuration_path):
+    _yaml = YAML(typ='safe')
+    with open(configuration_path, 'r') as file:
+        config = _yaml.load(file)
+
+    def convert_to_default_types(v):
+        if v.__class__.__name__ == 'CommentedSeq':
+            r = [convert_to_default_types(a) for a in list(v)]
+            return r
+        if v.__class__.__name__ == 'CommentedMap':
+            r = {}
+            for n in v:
+                r[n] = convert_to_default_types(v[n])
+            return r
+        return v
+
+    config = convert_to_default_types(config)
+
+    return config
diff --git a/TPPTAnalysisSW/start_webserver.py b/TPPTAnalysisSW/start_webserver.py
new file mode 100644
index 0000000..5e49529
--- /dev/null
+++ b/TPPTAnalysisSW/start_webserver.py
@@ -0,0 +1,110 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from .main_page import MainPage
+from .test_session import TestSession
+from .test import Test
+from .test_session_report import TestSessionReport
+from .imagefactory import ImageFactory
+from .settings_page import SettingsController
+from .test_session_settings import TestSessionSettingsController
+from .settings import *
+from .test_summary import SummaryController
+from .utils import Timer
+import TPPTAnalysisSW.test_refs as test_refs
+import TPPTAnalysisSW.measurementdb as measurementdb
+import TPPTAnalysisSW.progressstatus as progressstatus
+
+# We need to import the different test types somewhere - a small kludge
+import TPPTAnalysisSW.tests.test_multifinger_swipe
+import TPPTAnalysisSW.tests.test_multifinger_tap
+import TPPTAnalysisSW.tests.test_separation
+import TPPTAnalysisSW.tests.test_dutinformation
+import TPPTAnalysisSW.tests.test_one_finger_tap
+import TPPTAnalysisSW.tests.test_one_finger_swipe
+import TPPTAnalysisSW.tests.test_repeatability
+import TPPTAnalysisSW.tests.test_non_stationary_reporting_rate
+import TPPTAnalysisSW.tests.test_stationary_reporting_rate
+import TPPTAnalysisSW.tests.test_stationary_jitter
+import TPPTAnalysisSW.tests.test_one_finger_tap
+import TPPTAnalysisSW.tests.test_linearity
+import TPPTAnalysisSW.tests.test_grid_accuracy
+import TPPTAnalysisSW.tests.test_stationary_jitter_static_noise
+import TPPTAnalysisSW.tests.test_tapping_repeatability
+
+import os
+import sys
+import webbrowser
+
+
+def start(address, port):
+
+    conf = {
+        '/': {
+              'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
+              'response.timeout': 3600,
+        },
+        '/static' : {
+            'tools.staticdir.root': os.getcwd(),
+            'tools.staticdir.on' : True,
+            'tools.staticdir.dir' : 'static',
+        }
+    }
+
+    test_refs.init()
+    progressstatus.initProgress()
+
+    dbsession = measurementdb.get_database().session()
+    loadSettings(dbsession) # from settings.py
+    dbsession.close()
+
+    root = MainPage()
+    root.testsessions = TestSession()
+    root.tests = Test()
+    root.testsessionreports = TestSessionReport()
+
+    # create generated image path if none exists
+    if not os.path.isdir('static/img/generated'):
+        os.mkdir('static/img/generated')
+
+    root.img = ImageFactory()
+    root.img.configuration['root_dir'] = os.getcwd()
+    root.settings = SettingsController()
+    root.testsessionsettings = TestSessionSettingsController()
+    root.summary = SummaryController()
+
+    if "--timer" in sys.argv:
+        # Used in Plotinfo
+        Timer.do_timing = True
+
+    web_address = 'http://%s:%s/' % (address, port)
+
+    def browse():
+        webbrowser.open(web_address)
+
+    cherrypy.engine.subscribe('start', browse, priority=90)
+
+    cherrypy.config.update({'server.socket_host': address,})
+    cherrypy.config.update({'server.socket_port': port,})
+
+    cherrypy.quickstart(root,'/',conf)
diff --git a/TPPTAnalysisSW/static/AnalysisSoftwareUserGuide.pdf b/TPPTAnalysisSW/static/AnalysisSoftwareUserGuide.pdf
new file mode 100644
index 0000000..6d1e954
--- /dev/null
+++ b/TPPTAnalysisSW/static/AnalysisSoftwareUserGuide.pdf
Binary files differ
diff --git a/TPPTAnalysisSW/static/ajax-loader.gif b/TPPTAnalysisSW/static/ajax-loader.gif
new file mode 100644
index 0000000..7eca290
--- /dev/null
+++ b/TPPTAnalysisSW/static/ajax-loader.gif
Binary files differ
diff --git a/TPPTAnalysisSW/static/bootstrap/css/bootstrap-theme.min.css b/TPPTAnalysisSW/static/bootstrap/css/bootstrap-theme.min.css
new file mode 100644
index 0000000..61358b1
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/bootstrap/css/bootstrap.min.css b/TPPTAnalysisSW/static/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..d65c66b
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.eot b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.svg b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.ttf b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/fonts/glyphicons-halflings-regular.woff2
Binary files differ
diff --git a/TPPTAnalysisSW/static/bootstrap/js/bootstrap.min.js b/TPPTAnalysisSW/static/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000..133aeec
--- /dev/null
+++ b/TPPTAnalysisSW/static/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),
+d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/daddy.css b/TPPTAnalysisSW/static/daddy.css
new file mode 100644
index 0000000..e3621b3
--- /dev/null
+++ b/TPPTAnalysisSW/static/daddy.css
@@ -0,0 +1,39 @@
+@charset "UTF-8";
+
+@media screen {
+body{
+	font-family: 'Open Sans', sans-serif;
+	background-color: #A0C6F7;
+	background-image: url(img/bg.jpg);
+	background-repeat: repeat-x;
+	margin: 20px;
+	color: #595959;
+}
+}
+
+@media print {
+body{
+	font-family: 'Open Sans', sans-serif;
+	background-color: #ffffff;
+	margin: 5px;
+	color: #000000;
+}
+}
+
+th {
+	font-family: 'Open Sans Condensed', sans-serif;
+	padding: 5px;
+}
+
+.report{
+	background-color: #FFFFFF;
+	background-image: url(img/logobg.jpg);
+	background-repeat: repeat-x;
+	border-radius: 10px;
+}
+
+tr{background: #FFF}
+tr:nth-child(even) {background: #f0f0f0 !important;}
+tr:nth-child(odd) {background: #FFF !important;}
+td{padding:5px;}
+
diff --git a/TPPTAnalysisSW/static/graph.css b/TPPTAnalysisSW/static/graph.css
new file mode 100644
index 0000000..7bd1372
--- /dev/null
+++ b/TPPTAnalysisSW/static/graph.css
@@ -0,0 +1,13 @@
+.graph {
+    float:left; 
+    width: 400px;
+    height: 400px;
+    border: 1px solid white;
+    margin-bottom:1.8em;
+}
+
+.legend {
+    float: left;
+    height: 400px;
+    margin-right: 2em;
+}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/img/Thumbs.db b/TPPTAnalysisSW/static/img/Thumbs.db
new file mode 100644
index 0000000..dea1744
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/Thumbs.db
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/bg.jpg b/TPPTAnalysisSW/static/img/bg.jpg
new file mode 100644
index 0000000..48b1017
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/bg.jpg
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/favicon.ico b/TPPTAnalysisSW/static/img/favicon.ico
new file mode 100644
index 0000000..9adc4a2
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/favicon.ico
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/logo.jpg b/TPPTAnalysisSW/static/img/logo.jpg
new file mode 100644
index 0000000..0061c3e
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/logo.jpg
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/logobg.jpg b/TPPTAnalysisSW/static/img/logobg.jpg
new file mode 100644
index 0000000..d2f051a
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/logobg.jpg
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/tree_closed.png b/TPPTAnalysisSW/static/img/tree_closed.png
new file mode 100644
index 0000000..8d2dfc8
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/tree_closed.png
Binary files differ
diff --git a/TPPTAnalysisSW/static/img/tree_open.png b/TPPTAnalysisSW/static/img/tree_open.png
new file mode 100644
index 0000000..786a9ee
--- /dev/null
+++ b/TPPTAnalysisSW/static/img/tree_open.png
Binary files differ
diff --git a/TPPTAnalysisSW/static/mainpage.css b/TPPTAnalysisSW/static/mainpage.css
new file mode 100644
index 0000000..27ebcbc
--- /dev/null
+++ b/TPPTAnalysisSW/static/mainpage.css
@@ -0,0 +1,75 @@
+.collapsing-list  {
+    display: table
+}
+
+.collapsing-header,.collapsing-subrow {
+    display: table-row
+}
+
+.collapsing-header:hover {
+  background-color: #A1C7F8;
+  cursor:pointer;
+}
+
+.collapsing-subrow {
+    display: none
+}
+
+.collapsing-icon,.collapsing-content {
+    display: table-cell;
+    padding: 5px;
+}
+
+.collapsing-icon .icon-open {
+    display: none
+}
+
+.viewselectors {
+    margin-bottom: 10px;
+}
+
+.viewselector {
+    border-radius: 5px;
+    padding: 5px;
+    font-family: 'Open Sans Condensed', sans-serif;
+    font-weight: bold;
+}
+
+.viewselector.selected {
+    background: #349AD8;
+    color: White;
+}
+
+.viewselector:hover {
+  background-color: #A1C7F8;
+  cursor:pointer;
+}
+
+.test_session_link a {
+   display: block;
+   border: 1px solid black;
+   padding: 16px;
+}
+
+#view_manufacturers {
+    display: none;
+}
+
+#loading {
+    display: none;
+}
+
+.test_session_row:hover td:not(:last-child):not(:nth-last-child(2)) {
+  background-color: #A1C7F8;
+  cursor:pointer;
+ }
+
+ .test_session_row td:last-child:hover {
+  background-color: #CD5B45;
+  cursor:pointer;
+ }
+
+  .test_session_row td:nth-last-child(2):hover {
+  background-color: #6699CC;
+  cursor:pointer;
+ }
diff --git a/TPPTAnalysisSW/static/reportstyle.css b/TPPTAnalysisSW/static/reportstyle.css
new file mode 100644
index 0000000..4cac3bc
--- /dev/null
+++ b/TPPTAnalysisSW/static/reportstyle.css
@@ -0,0 +1,582 @@
+table.headingtable {
+	border-width: 0;
+	border-spacing: 1px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: #fff;
+	width: 100%;
+	font-size:1.5em;
+	font-weight:700;
+	color:#595959;
+}
+table.headingtable th {
+	border-width: 0px;
+	padding: 0px;
+	border-style: none;
+	border-color: black;
+	background-color: #fff;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+}
+table.headingtable td {
+	border-width: 0px;
+	padding: 10px;
+	border-style: none;
+	border-color: black;
+	background-color: #fff;
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.constanttable {
+	border-width: 0px;
+	border-spacing: 0px;
+	border-style: none;
+	border-color: black;
+	border-collapse: separate;
+	background-color: white;
+	width: 100%;
+}
+table.constanttable th {
+	border-width: 0px;
+	padding: 2px;
+	border-style: solid;
+	border-color: black;
+	background-color: white;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.constanttable td {
+	border-width: 0px;
+	padding: 2px;
+	border-style: solid;
+	border-color: black;
+
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+
+table.datatable {
+	border-width: 0;
+	border-spacing: 0px;
+	border-style: double;
+	border-color: black;
+/*	border-collapse: collapse; */
+	background-color: white;
+
+	margin-bottom: 10px;
+}
+table.datatable th {
+	color: #FFFFFF;
+	border-width: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8;
+	-moz-border-radius: 0px 0px 0px 0px;
+	text-align: center;
+	padding:5px 15px;
+	width: 200px;
+}
+table.datatable th.note {
+	width: 10%;
+}
+
+
+table.datatable th.id {
+    width: 50px;
+}
+
+table.datatable th.narrow {
+    width: 100px;
+}
+
+table.datatable th.datetime {
+    width: 170px;
+}
+
+table.datatable th.wide {
+    width: 280px;
+}
+
+table.datatable th.delete {
+    width: 80px;
+}
+
+
+table.datatable td {
+	border-width: 0;
+	border-style: inset;
+	border-color: black;
+
+	vertical-align: top;
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+	padding:5px 15px;
+}
+table.datatable td.name {
+	border-width: 0;
+	border-style: inset;
+	border-color: black;
+
+	text-align: left;
+	/*text-indent: 5%;*/
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable {
+	border-width: 0px;
+	border-spacing: 0px;
+	border-style: hidden;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+	width: 100%;
+}
+table.subdatatable th, th.subdatatable {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable th.name {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 40%;
+}
+table.subdatatable td {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable td.name {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: left;
+	/*text-indent: 5%;*/
+	padding-left:15px;
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 40%;
+}
+table.imagetable {
+	border-width: thick;
+	border-spacing: 1px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+}
+table.imagetable th {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8;
+	-moz-border-radius: 0px 0px 0px 0px;
+	color:#fff;
+}
+table.imagetable td {
+	border-width: thin;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+
+table.listtable {
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+table.listtable th.index {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 20%;
+}
+table.listtable th.list {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 90%;
+}
+table.listtable td {
+	padding: 4px;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+ul.tabbed {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+li.tabbednav {
+	display: block;
+	float:left;
+	background: white;
+	margin: 0px 0.5em -2px 0px;
+	border-top-width: 2px;
+	border-right-width: 2px;
+	border-bottom-width: 0px;
+	border-left-width: 2px;
+	border-top-style: solid;
+	border-right-style: solid;
+	border-bottom-style: solid;
+	border-left-style: solid;
+	border-top-color: #349AD8;
+	border-right-color: #349AD8;
+	border-bottom-color: #349AD8;
+	border-left-color: #349AD8;
+	//border-radius: 5px 5px 0px 0px;
+}
+li.tabbedsel {
+	display: block;
+	float:left;
+	border: solid 2px #349AD8;
+	background-color: #349AD8;
+	margin: 0px 0.5em -2px 0px;
+	//border-radius: 5px 5px 0px 0px;
+}
+a.tabbednav {
+	padding: 0px 5px;
+	padding-left:5px;
+	background-color: white;
+	color: #349AD8;
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	//border-radius: 5px 5px 0px 0px;
+
+}
+a.tabbedsel {
+	padding: 0px 5px;
+	padding-left:5px;
+	background-color: #349AD8;
+	color:#FFF;
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	//border-radius: 5px 5px 0px 0px;
+}
+ul.subtabbed {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+	padding-top: 0.5em;
+	background-color: #349AD8
+	border-style: double;
+	border-width: 2px;
+}
+li.subtabbednav {
+	display: inline;
+	border-top-width: 2px;
+	border-right-width: 2px;
+	border-bottom-width: 0px;
+	border-left-width: 2px;
+	border-top-style: solid;
+	border-right-style: solid;
+	border-bottom-style: solid;
+	border-left-style: solid;
+	border-top-color: #349AD8;
+	border-right-color: #349AD8;
+	border-bottom-color: #349AD8;
+	border-left-color: #349AD8;
+	margin: 0 0.5em 0 0;
+}
+ul.subtabbed li.tabbedsel {
+	display: inline;
+	border: solid;
+	border-width: 2px 2px 0 2px;
+	background: white;
+	margin: 0 0.5em 0 0;
+}
+a.subtabbednav {
+	padding: 0 1em;
+	background-color: white;
+	color:#349AD8;
+	text-decoration:none;
+}
+ul.subtabbed a.tabbedsel {
+	padding: 0 1em;
+	background-color: white;
+}
+div.content {
+	border: solid;
+	width: 96%;
+	border-width: 0 0 0 0;
+	clear: both;
+	margin: 0px auto;
+}
+div.header {
+	width: 96%;
+}
+p.version {
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	font-weight: bold;
+}
+
+.dtable {
+    display: table;
+}
+
+.dtable_header {
+/*	float: left;*/
+    display: inline-block;
+	color:#fff;
+	border-width: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+	text-align: center;
+	font-weight: bold;
+
+	padding: 5px;
+	width: 150px;
+	height: 30px;
+	overflow: hidden;
+}
+
+.dtable_row {
+    display: block;
+	min-height: 30px;
+	max-width: 1600px;
+	clear: both;
+	page-break-inside: avoid;
+
+	padding: 0px;
+	margin: 0px;
+}
+
+.dtable_header_row
+{
+    display: table-header-group;
+	min-height: 50px;
+	max-width: 16000px;
+	clear: both;
+
+	padding: 0px;
+	margin: 0px;
+    background-color: #349AD8
+}
+
+.dtable_mf_row {
+	max-width: 920px;
+}
+
+.dtable_row:nth-child(even) {background-color: #f0f0f0;}
+.dtable_row:nth-child(odd) {background-color: #ffffff;}
+
+.dtable_cell {
+/*	float: left;*/
+    display: inline-block;
+	text-align: center;
+	padding: 5px;
+	width: 150px;
+	max-height: 35px;
+	overflow: hidden;
+}
+
+.wide_cell {
+	width: 250px;
+}
+
+.narrow_cell {
+	width: 100px;
+}
+
+.dtable_radio_cell {
+	float: left;
+
+	padding: 5px;
+	width: 100px;
+	max-height: 30px;
+	overflow: hidden;
+}
+
+.plot_header {
+	border-width: 0;
+	border-style: inset;
+	border-color: black;
+	vertical-align: top;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+
+.plot {
+	clear: both;
+	display: none;
+}
+
+.grid_table {
+	width: 1020px;
+	height: auto;
+
+	border-width: 2;
+	border-color: #349AD8;
+	border-style: solid;
+}
+
+.grid_table_row {
+	clear: both;
+
+	width: 1020px;
+	height: 20px;
+}
+
+.grid_table_row:nth-child(even) {background: #f0f0f0;}
+.grid_table_row:nth-child(odd) {background: #ffffff;}
+
+.tap_cell {
+	float: left;
+	border-width: 1;
+	border-color: #349AD8;
+	border-style: solid;
+
+	font-size: 0.8em;
+	text-align: center;
+
+	height: 18px;
+}
+
+.tap_cell b {
+	color: #000000;
+	font-size: 1em;
+}
+
+.clear {
+	clear: both;
+}
+
+.button_base {
+    min-height: 20px;
+    padding: 5px;
+    margin: 0px;
+    border: 0px solid #246B96;
+
+    color: #ffffff;
+    background-color: #349AD8;
+
+    text-align: center;
+    font-weight: bold;
+}
+
+.label {
+    background-color: #349AD8;
+
+    font-weight: bold;
+}
+
+.button {
+    background-color: #38A8EC;
+    cursor: pointer;
+}
+
+.all_lines_button {
+	color: black;
+	font-weight: normal;
+}
+
+.passed_lines_button {
+	color: black;
+	font-weight: normal;
+}
+
+.failed_lines_button {
+	color: black;
+	font-weight: normal;
+}
+
+.no_show_plot {
+	color: #cccccc;
+	font-size: 1em;
+}
+
+.show_plot {
+	cursor: pointer;
+}
+
+/* Used in test session */
+
+.test_row:hover {
+  background-color: #A1C7F8;
+  cursor:pointer;
+}
+
+.editnotes {
+    text-decoration: underline;
+    font-size: smaller;
+    color: Blue;
+    cursor: pointer;
+}
+
+.editor {
+    resize: both;
+    display: none;
+    width: 100%;
+}
+
+#notes_save {
+    display:none;
+}
+
+/* Used in settings */
+
+.settings_table .setting_name {
+    min-width: 500px;
+}
+
+.settings_table .setting_input {
+    min-width: 50px;
+}
+
+
+/* Used in test session settings */
+
+.settings {
+    display: block;
+    padding-bottom: 5px;
+}
+
+.errormsg {
+    padding: 5px;
+    display: none;
+    border-style: solid;
+    border-color: Black;
+    background-color: #FFAAAA;
+    font-weight: bold;
+}
+
+.setting_value_input {
+    text-align: right;
+}
+
+input {
+    border: 0;
+}
+
+.setting_value_input.invalid {
+    background-color: #FFAAAA;
+}
+
+.preview {
+	page-break-inside: avoid;
+    display: block;
+    border-bottom: 10px;
+}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/reportstyle_print.css b/TPPTAnalysisSW/static/reportstyle_print.css
new file mode 100644
index 0000000..3438cfe
--- /dev/null
+++ b/TPPTAnalysisSW/static/reportstyle_print.css
@@ -0,0 +1,453 @@
+h1, h2, h3 {
+	page-break-before: auto;
+	font-size: 14px;
+}
+
+table.headingtable {
+	border-width: 0;
+	border-spacing: 1px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: #ffffff;
+	width: 100%;
+	font-size:1.5em;
+	font-weight:700;
+	color:#595959;
+}
+table.headingtable th {
+	border-width: 0px;
+	padding: 0px;
+	border-style: none;
+	border-color: black;
+	background-color: #ffffff;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+}
+table.headingtable td {
+	border-width: 0px;
+	padding: 10px;
+	border-style: none;
+	border-color: black;
+	background-color: #fff;
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.constanttable {
+	border-width: 0px;
+	border-spacing: 0px;
+	border-style: none;
+	border-color: black;
+	border-collapse: separate;
+	background-color: white;
+	width: 100%;
+}
+table.constanttable th {
+	border-width: 0px;
+	padding: 2px;
+	border-style: solid;
+	border-color: black;
+	background-color: white;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.constanttable td {
+	border-width: 0px;
+	padding: 2px;
+	border-style: solid;
+	border-color: black;
+
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+
+table.datatable {
+	border-width: 2;
+	border-spacing: 0px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+	margin-bottom: 10px;
+	page-break-inside: avoid;
+}
+table.datatable th {
+	color: #000000;
+	border-width: 1px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8 !important;
+	font-size: 0.9em;
+	-moz-border-radius: 0px 0px 0px 0px;
+	text-align: center;
+	padding: 5px 5px;
+	width: 200px;
+}
+table.datatable th.note {
+	border-width: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8;
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 10%;
+}
+table.datatable td {
+	border-width: 1px;
+	border-style: inset;
+	border-color: black;
+
+	vertical-align: top;
+	text-align: center;
+	font-size: 0.8em;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+	padding: 5px 5px;
+}
+table.datatable td.name {
+	border-width: 0;
+	border-style: inset;
+	border-color: black;
+
+	text-align: left;
+	/*text-indent: 5%;*/
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable {
+	border-width: 0px;
+	border-spacing: 0px;
+	border-style: hidden;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+	width: 100%;
+}
+table.subdatatable th, th.subdatatable {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable th.name {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 40%;
+}
+table.subdatatable td {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.subdatatable td.name {
+	border-width: 0;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: left;
+	/*text-indent: 5%;*/
+	padding-left:15px;
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 40%;
+}
+table.imagetable {
+	border-width: thick;
+	border-spacing: 1px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+}
+table.imagetable th {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: #349AD8;
+	-moz-border-radius: 0px 0px 0px 0px;
+	color:#fff;
+}
+table.imagetable td {
+	border-width: thin;
+	padding: 2px;
+	border-style: inset;
+	border-color: black;
+
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+table.listtable {
+	border-width: thick;
+	border-spacing: 1px;
+	border-style: double;
+	border-color: black;
+	border-collapse: collapse;
+	background-color: white;
+
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+table.listtable th.index {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 20%;
+}
+table.listtable th.list {
+	border-width: 2px;
+	padding: 0px;
+	border-style: solid;
+	border-color: black;
+	background-color: rgb(250, 240, 230);
+	-moz-border-radius: 0px 0px 0px 0px;
+	width: 90%;
+}
+table.listtable td {
+	border-width: thin;
+	padding: 4px;
+	border-style: solid;
+	border-color: black;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+ul.tabbed {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+li.tabbednav {
+	display: block;
+	float:left;
+	background: white;
+	margin: 0px 0.5em -2px 0px;
+	border-top-width: 2px;
+	border-right-width: 2px;
+	border-bottom-width: 0px;
+	border-left-width: 2px;
+	border-top-style: solid;
+	border-right-style: solid;
+	border-bottom-style: solid;
+	border-left-style: solid;
+	border-top-color: #349AD8;
+	border-right-color: #349AD8;
+	border-bottom-color: #349AD8;
+	border-left-color: #349AD8;
+	//border-radius: 5px 5px 0px 0px;
+}
+li.tabbedsel {
+	display: block;
+	float:left;
+	border: solid 2px #349AD8;
+	background-color: #349AD8;
+	margin: 0px 0.5em -2px 0px;
+	//border-radius: 5px 5px 0px 0px;
+}
+a.tabbednav {
+	padding: 0px 5px;
+	padding-left:5px;
+	background-color: white;
+	color: #349AD8;
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	//border-radius: 5px 5px 0px 0px;
+
+}
+a.tabbedsel {
+	padding: 0px 5px;
+	padding-left:5px;
+	background-color: #349AD8;
+	color:#FFF;
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	//border-radius: 5px 5px 0px 0px;
+}
+ul.subtabbed {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+	padding-top: 0.5em;
+	background-color: #349AD8
+	border-style: double;
+	border-width: 2px;
+}
+li.subtabbednav {
+	display: inline;
+	border-top-width: 2px;
+	border-right-width: 2px;
+	border-bottom-width: 0px;
+	border-left-width: 2px;
+	border-top-style: solid;
+	border-right-style: solid;
+	border-bottom-style: solid;
+	border-left-style: solid;
+	border-top-color: #349AD8;
+	border-right-color: #349AD8;
+	border-bottom-color: #349AD8;
+	border-left-color: #349AD8;
+	margin: 0 0.5em 0 0;
+}
+ul.subtabbed li.tabbedsel {
+	display: inline;
+	border: solid;
+	border-width: 2px 2px 0 2px;
+	background: white;
+	margin: 0 0.5em 0 0;
+}
+a.subtabbednav {
+	padding: 0 1em;
+	background-color: white;
+	color:#349AD8;
+	text-decoration:none;
+}
+ul.subtabbed a.tabbedsel {
+	padding: 0 1em;
+	background-color: white;
+}
+div.content {
+	border: solid;
+	width: 100%;
+	border-width: 0 0 0 0;
+	clear: both;
+	margin: 0px auto;
+}
+
+div.header {
+	width: 96%;
+}
+
+p.version {
+	text-decoration:none;
+	font-family: 'Open Sans Condensed', sans-serif;
+	font-weight: bold;
+}
+
+.dtable_header {
+	float: left;
+	color: #000000;
+
+	border-width: 0.5px;
+	border-style: solid;
+	border-color: #000000;
+	border-collapse: collapse;
+
+	background-color: #349AD8 !important;
+	-moz-border-radius: 0px 0px 0px 0px;
+
+	text-align: center;
+	font-weight: bold;
+	font-size: 0.9em;
+
+	padding: 3px 3px;
+}
+
+.wide_cell {
+	width: 140px;
+}
+
+.narrow_cell {
+	width: 80px;
+}
+
+.dtable_row {
+	clear: both;
+	min-height: 20px;
+}
+
+.dtable_cell {
+	float: left;
+	color: #121212;
+
+	border-width: 0.5px;
+	border-color: black;
+	border-style: solid;
+	border-collapse: collapse;
+
+	text-align: center;
+	padding: 3px 3px;
+	font-size: 0.8em;
+	min-height: 16px;
+}
+
+.dtable_radio_cell {
+	float: left;
+
+	border-width: 1px;
+	border-color: black;
+	border-style: solid;
+
+	padding: 5px 15px;
+	display: none;
+}
+
+.plot_header {
+	border-width: 0;
+	border-style: inset;
+	border-color: black;
+
+	vertical-align: top;
+	text-align: center;
+	-moz-border-radius: 0px 0px 0px 0px;
+}
+
+.plot {
+	clear: both;
+	display: none;
+	background-color: #565656;
+}
+
+.clear {
+	clear: both;
+}
+
+.no_show_plot {
+	color: #cccccc;
+}
+
+.show_plot {
+	cursor: pointer;
+}
+
+img {
+	page-break-inside: avoid;
+	max-width: 100%
+}
+
+#multifinger_swipe_image_area {
+	width: auto;
+}
+
+.dtable_row:nth-child(even) {background-color: #f0f0f0 !important;}
+.dtable_row:nth-child(odd) {background-color: #ffffff !important;}
+
+@media print {
+    .make-grid(sm);
+
+    .visible-xs {
+        .responsive-invisibility();
+    }
+
+    .hidden-xs {
+        .responsive-visibility();
+    }
+
+    .hidden-xs.hidden-print {
+        .responsive-invisibility();
+    }
+
+    .hidden-sm {
+        .responsive-invisibility();
+    }
+
+    .visible-sm {
+        .responsive-visibility();
+    }
+}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/script/libs/jquery-2.1.0.min.js b/TPPTAnalysisSW/static/script/libs/jquery-2.1.0.min.js
new file mode 100644
index 0000000..cbe6abe
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/libs/jquery-2.1.0.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m=a.document,n="2.1.0",o=function(a,b){return new o.fn.init(a,b)},p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};o.fn=o.prototype={jquery:n,constructor:o,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=o.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return o.each(this,a,b)},map:function(a){return this.pushStack(o.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},o.extend=o.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||o.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},g[b]=o.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},o.extend({expando:"jQuery"+(n+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isPlainObject:function(a){if("object"!==o.type(a)||a.nodeType||o.isWindow(a))return!1;try{if(a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}return!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=o.trim(a),a&&(1===a.indexOf("use strict")?(b=m.createElement("script"),b.text=a,m.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":k.call(a)},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?o.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),o.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||o.guid++,f):void 0},now:Date.now,support:l}),o.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=o.type(a);return"function"===c||o.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);o.find=t,o.expr=t.selectors,o.expr[":"]=o.expr.pseudos,o.unique=t.uniqueSort,o.text=t.getText,o.isXMLDoc=t.isXML,o.contains=t.contains;var u=o.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(o.isFunction(b))return o.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return o.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return o.filter(b,a,c);b=o.filter(b,a)}return o.grep(a,function(a){return g.call(b,a)>=0!==c})}o.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?o.find.matchesSelector(d,a)?[d]:[]:o.find.matches(a,o.grep(b,function(a){return 1===a.nodeType}))},o.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(o(a).filter(function(){for(b=0;c>b;b++)if(o.contains(e[b],this))return!0}));for(b=0;c>b;b++)o.find(a,e[b],d);return d=this.pushStack(c>1?o.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?o(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=o.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof o?b[0]:b,o.merge(this,o.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:m,!0)),v.test(c[1])&&o.isPlainObject(b))for(c in b)o.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=m.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=m,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):o.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(o):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),o.makeArray(a,this))};A.prototype=o.fn,y=o(m);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};o.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&o(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),o.fn.extend({has:function(a){var b=o(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(o.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?o(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&o.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?o.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(o(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(o.unique(o.merge(this.get(),o(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}o.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return o.dir(a,"parentNode")},parentsUntil:function(a,b,c){return o.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return o.dir(a,"nextSibling")},prevAll:function(a){return o.dir(a,"previousSibling")},nextUntil:function(a,b,c){return o.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return o.dir(a,"previousSibling",c)},siblings:function(a){return o.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return o.sibling(a.firstChild)},contents:function(a){return a.contentDocument||o.merge([],a.childNodes)}},function(a,b){o.fn[a]=function(c,d){var e=o.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=o.filter(d,e)),this.length>1&&(C[a]||o.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return o.each(a.match(E)||[],function(a,c){b[c]=!0}),b}o.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):o.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){o.each(b,function(b,c){var d=o.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&o.each(arguments,function(a,b){var c;while((c=o.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?o.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},o.extend({Deferred:function(a){var b=[["resolve","done",o.Callbacks("once memory"),"resolved"],["reject","fail",o.Callbacks("once memory"),"rejected"],["notify","progress",o.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return o.Deferred(function(c){o.each(b,function(b,f){var g=o.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&o.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?o.extend(a,d):d}},e={};return d.pipe=d.then,o.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&o.isFunction(a.promise)?e:0,g=1===f?a:o.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&o.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;o.fn.ready=function(a){return o.ready.promise().done(a),this},o.extend({isReady:!1,readyWait:1,holdReady:function(a){a?o.readyWait++:o.ready(!0)},ready:function(a){(a===!0?--o.readyWait:o.isReady)||(o.isReady=!0,a!==!0&&--o.readyWait>0||(H.resolveWith(m,[o]),o.fn.trigger&&o(m).trigger("ready").off("ready")))}});function I(){m.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),o.ready()}o.ready.promise=function(b){return H||(H=o.Deferred(),"complete"===m.readyState?setTimeout(o.ready):(m.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},o.ready.promise();var J=o.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===o.type(c)){e=!0;for(h in c)o.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,o.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(o(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};o.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=o.expando+Math.random()}K.uid=1,K.accepts=o.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,o.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(o.isEmptyObject(f))o.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,o.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{o.isArray(b)?d=b.concat(b.map(o.camelCase)):(e=o.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!o.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?o.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}o.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),o.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;
+while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=o.camelCase(d.slice(5)),P(f,d,e[d]));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=o.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),o.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||o.isArray(c)?d=L.access(a,b,o.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=o.queue(a,b),d=c.length,e=c.shift(),f=o._queueHooks(a,b),g=function(){o.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:o.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),o.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?o.queue(this[0],a):void 0===b?this:this.each(function(){var c=o.queue(this,a,b);o._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&o.dequeue(this,a)})},dequeue:function(a){return this.each(function(){o.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=o.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===o.css(a,"display")||!o.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=m.createDocumentFragment(),b=a.appendChild(m.createElement("div"));b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";l.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return m.activeElement}catch(a){}}o.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=o.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof o!==U&&o.event.triggered!==b.type?o.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n&&(l=o.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=o.event.special[n]||{},k=o.extend({type:n,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&o.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),o.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n){l=o.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||o.removeEvent(a,n,r.handle),delete i[n])}else for(n in i)o.event.remove(a,n+b[j],c,d,!0);o.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,p=[d||m],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||m,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+o.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[o.expando]?b:new o.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:o.makeArray(c,[b]),n=o.event.special[q]||{},e||!n.trigger||n.trigger.apply(d,c)!==!1)){if(!e&&!n.noBubble&&!o.isWindow(d)){for(i=n.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||m)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:n.bindType||q,l=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),l&&l.apply(g,c),l=k&&g[k],l&&l.apply&&o.acceptData(g)&&(b.result=l.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||n._default&&n._default.apply(p.pop(),c)!==!1||!o.acceptData(d)||k&&o.isFunction(d[q])&&!o.isWindow(d)&&(h=d[k],h&&(d[k]=null),o.event.triggered=q,d[q](),o.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=o.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=o.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=o.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((o.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?o(e,this).index(i)>=0:o.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||m,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[o.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new o.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=m),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&o.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return o.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=o.extend(new o.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?o.event.trigger(e,null,b):o.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},o.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},o.Event=function(a,b){return this instanceof o.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.getPreventDefault&&a.getPreventDefault()?Z:$):this.type=a,b&&o.extend(this,b),this.timeStamp=a&&a.timeStamp||o.now(),void(this[o.expando]=!0)):new o.Event(a,b)},o.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z,this.stopPropagation()}},o.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){o.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!o.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.focusinBubbles||o.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){o.event.simulate(b,a.target,o.event.fix(a),!0)};o.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),o.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return o().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=o.guid++)),this.each(function(){o.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,o(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){o.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){o.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?o.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return o.nodeName(a,"table")&&o.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)o.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=o.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&o.nodeName(a,b)?o.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}o.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=o.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||o.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===o.type(e))o.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;o.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===o.inArray(e,d))&&(i=o.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f,g,h=o.event.special,i=0;void 0!==(c=a[i]);i++){if(o.acceptData(c)&&(f=c[L.expando],f&&(b=L.cache[f]))){if(d=Object.keys(b.events||{}),d.length)for(g=0;void 0!==(e=d[g]);g++)h[e]?o.event.remove(c,e):o.removeEvent(c,e,b.handle);L.cache[f]&&delete L.cache[f]}delete M.cache[c[M.expando]]}}}),o.fn.extend({text:function(a){return J(this,function(a){return void 0===a?o.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?o.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||o.cleanData(ob(c)),c.parentNode&&(b&&o.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(o.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return o.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(o.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,o.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,n=k-1,p=a[0],q=o.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(c=o.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=o.map(ob(c,"script"),kb),g=f.length;k>j;j++)h=c,j!==n&&(h=o.clone(h,!0,!0),g&&o.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,o.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&o.contains(i,h)&&(h.src?o._evalUrl&&o._evalUrl(h.src):o.globalEval(h.textContent.replace(hb,"")))}return this}}),o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){o.fn[a]=function(a){for(var c,d=[],e=o(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),o(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d=o(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:o.css(d[0],"display");return d.detach(),e}function tb(a){var b=m,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||o("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||o.contains(a.ownerDocument,a)||(g=o.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",e=m.documentElement,f=m.createElement("div"),g=m.createElement("div");g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",f.appendChild(g);function h(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",e.appendChild(f);var d=a.getComputedStyle(g,null);b="1%"!==d.top,c="4px"===d.width,e.removeChild(f)}a.getComputedStyle&&o.extend(l,{pixelPosition:function(){return h(),b},boxSizingReliable:function(){return null==c&&h(),c},reliableMarginRight:function(){var b,c=g.appendChild(m.createElement("div"));return c.style.cssText=g.style.cssText=d,c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),g.innerHTML="",b}})}(),o.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:0,fontWeight:400},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=o.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=o.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=o.css(a,"border"+R[f]+"Width",!0,e))):(g+=o.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=o.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===o.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):f[g]||(e=S(d),(c&&"none"!==c||!e)&&L.set(d,"olddisplay",e?c:o.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}o.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=o.camelCase(b),i=a.style;return b=o.cssProps[h]||(o.cssProps[h]=Fb(i,h)),g=o.cssHooks[b]||o.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(o.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||o.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]="",i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=o.camelCase(b);return b=o.cssProps[h]||(o.cssProps[h]=Fb(a.style,h)),g=o.cssHooks[b]||o.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||o.isNumeric(f)?f||0:e):e}}),o.each(["height","width"],function(a,b){o.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&zb.test(o.css(a,"display"))?o.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===o.css(a,"boxSizing",!1,e),e):0)}}}),o.cssHooks.marginRight=yb(l.reliableMarginRight,function(a,b){return b?o.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),o.each({margin:"",padding:"",border:"Width"},function(a,b){o.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(o.cssHooks[a+b].set=Gb)}),o.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(o.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=o.css(a,b[g],!1,d);return f}return void 0!==c?o.style(a,b,c):o.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?o(this).show():o(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}o.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(o.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?o.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=o.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){o.fx.step[a.prop]?o.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[o.cssProps[a.prop]]||o.cssHooks[a.prop])?o.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},o.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},o.fx=Kb.prototype.init,o.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(o.cssNumber[a]?"":"px"),g=(o.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(o.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,o.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=o.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k=this,l={},m=a.style,n=a.nodeType&&S(a),p=L.get(a,"fxshow");c.queue||(h=o._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,k.always(function(){k.always(function(){h.unqueued--,o.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],j=o.css(a,"display"),"none"===j&&(j=tb(a.nodeName)),"inline"===j&&"none"===o.css(a,"float")&&(m.display="inline-block")),c.overflow&&(m.overflow="hidden",k.always(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(n?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;n=!0}l[d]=p&&p[d]||o.style(a,d)}if(!o.isEmptyObject(l)){p?"hidden"in p&&(n=p.hidden):p=L.access(a,"fxshow",{}),f&&(p.hidden=!n),n?o(a).show():k.done(function(){o(a).hide()}),k.done(function(){var b;L.remove(a,"fxshow");for(b in l)o.style(a,b,l[b])});for(d in l)g=Ub(n?p[d]:0,d,k),d in p||(p[d]=g.start,n&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=o.camelCase(c),e=b[d],f=a[c],o.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=o.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=o.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:o.extend({},b),opts:o.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=o.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return o.map(k,Ub,j),o.isFunction(j.opts.start)&&j.opts.start.call(a,j),o.fx.timer(o.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}o.Animation=o.extend(Xb,{tweener:function(a,b){o.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),o.speed=function(a,b,c){var d=a&&"object"==typeof a?o.extend({},a):{complete:c||!c&&b||o.isFunction(a)&&a,duration:a,easing:c&&b||b&&!o.isFunction(b)&&b};return d.duration=o.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in o.fx.speeds?o.fx.speeds[d.duration]:o.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){o.isFunction(d.old)&&d.old.call(this),d.queue&&o.dequeue(this,d.queue)},d},o.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=o.isEmptyObject(a),f=o.speed(b,c,d),g=function(){var b=Xb(this,o.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=o.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&o.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=o.timers,g=d?d.length:0;for(c.finish=!0,o.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),o.each(["toggle","show","hide"],function(a,b){var c=o.fn[b];o.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),o.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){o.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),o.timers=[],o.fx.tick=function(){var a,b=0,c=o.timers;for(Lb=o.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||o.fx.stop(),Lb=void 0},o.fx.timer=function(a){o.timers.push(a),a()?o.fx.start():o.timers.pop()},o.fx.interval=13,o.fx.start=function(){Mb||(Mb=setInterval(o.fx.tick,o.fx.interval))},o.fx.stop=function(){clearInterval(Mb),Mb=null},o.fx.speeds={slow:600,fast:200,_default:400},o.fn.delay=function(a,b){return a=o.fx?o.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=m.createElement("input"),b=m.createElement("select"),c=b.appendChild(m.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=m.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var Yb,Zb,$b=o.expr.attrHandle;o.fn.extend({attr:function(a,b){return J(this,o.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){o.removeAttr(this,a)})}}),o.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?o.prop(a,b,c):(1===f&&o.isXMLDoc(a)||(b=b.toLowerCase(),d=o.attrHooks[b]||(o.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=o.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void o.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=o.propFix[c]||c,o.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&o.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?o.removeAttr(a,c):a.setAttribute(c,c),c}},o.each(o.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||o.find.attr;$b[b]=function(a,b,d){var e,f;
+return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;o.fn.extend({prop:function(a,b){return J(this,o.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[o.propFix[a]||a]})}}),o.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!o.isXMLDoc(a),f&&(b=o.propFix[b]||b,e=o.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),l.optSelected||(o.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;o.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(o.isFunction(a))return this.each(function(b){o(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=o.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(o.isFunction(a))return this.each(function(b){o(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?o.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(o.isFunction(a)?function(c){o(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=o(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;o.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=o.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,o(this).val()):a,null==e?e="":"number"==typeof e?e+="":o.isArray(e)&&(e=o.map(e,function(a){return null==a?"":a+""})),b=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=o.valHooks[e.type]||o.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),o.extend({valHooks:{select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&o.nodeName(c.parentNode,"optgroup"))){if(b=o(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=o.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=o.inArray(o(d).val(),f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),o.each(["radio","checkbox"],function(){o.valHooks[this]={set:function(a,b){return o.isArray(b)?a.checked=o.inArray(o(a).val(),b)>=0:void 0}},l.checkOn||(o.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),o.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){o.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),o.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=o.now(),dc=/\?/;o.parseJSON=function(a){return JSON.parse(a+"")},o.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&o.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=m.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(o.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,o.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=o.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&o.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}o.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":o.parseJSON,"text xml":o.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,o.ajaxSettings),b):tc(o.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=o.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?o(l):o.event,n=o.Deferred(),p=o.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(n.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=o.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=o.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===o.active++&&o.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(o.lastModified[d]&&v.setRequestHeader("If-Modified-Since",o.lastModified[d]),o.etag[d]&&v.setRequestHeader("If-None-Match",o.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(o.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(o.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?n.resolveWith(l,[r,x,v]):n.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--o.active||o.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return o.get(a,b,c,"json")},getScript:function(a,b){return o.get(a,void 0,b,"script")}}),o.each(["get","post"],function(a,b){o[b]=function(a,c,d,e){return o.isFunction(c)&&(e=e||d,d=c,c=void 0),o.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),o.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){o.fn[b]=function(a){return this.on(b,a)}}),o._evalUrl=function(a){return o.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},o.fn.extend({wrapAll:function(a){var b;return o.isFunction(a)?this.each(function(b){o(this).wrapAll(a.call(this,b))}):(this[0]&&(b=o(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(o.isFunction(a)?function(b){o(this).wrapInner(a.call(this,b))}:function(){var b=o(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=o.isFunction(a);return this.each(function(c){o(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){o.nodeName(this,"body")||o(this).replaceWith(this.childNodes)}).end()}}),o.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},o.expr.filters.visible=function(a){return!o.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(o.isArray(b))o.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==o.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}o.param=function(a,b){var c,d=[],e=function(a,b){b=o.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=o.ajaxSettings&&o.ajaxSettings.traditional),o.isArray(a)||a.jquery&&!o.isPlainObject(a))o.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},o.fn.extend({serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=o.prop(this,"elements");return a?o.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!o(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=o(this).val();return null==c?null:o.isArray(c)?o.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),o.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=o.ajaxSettings.xhr();a.ActiveXObject&&o(a).on("unload",function(){for(var a in Dc)Dc[a]()}),l.cors=!!Fc&&"withCredentials"in Fc,l.ajax=Fc=!!Fc,o.ajaxTransport(function(a){var b;return l.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort"),f.send(a.hasContent&&a.data||null)},abort:function(){b&&b()}}:void 0}),o.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return o.globalEval(a),a}}}),o.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),o.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=o("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),m.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;o.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||o.expando+"_"+cc++;return this[a]=!0,a}}),o.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=o.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||o.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&o.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),o.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||m;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=o.buildFragment([a],b,e),e&&e.length&&o(e).remove(),o.merge([],d.childNodes))};var Ic=o.fn.load;o.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h),a=a.slice(0,h)),o.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&o.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?o("<div>").append(o.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},o.expr.filters.animated=function(a){return o.grep(o.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return o.isWindow(a)?a:9===a.nodeType&&a.defaultView}o.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=o.css(a,"position"),l=o(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=o.css(a,"top"),i=o.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),o.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},o.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){o.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,o.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===o.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),o.nodeName(a[0],"html")||(d=a.offset()),d.top+=o.css(a[0],"borderTopWidth",!0),d.left+=o.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-o.css(c,"marginTop",!0),left:b.left-d.left-o.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!o.nodeName(a,"html")&&"static"===o.css(a,"position"))a=a.offsetParent;return a||Jc})}}),o.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;o.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),o.each(["top","left"],function(a,b){o.cssHooks[b]=yb(l.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?o(a).position()[b]+"px":c):void 0})}),o.each({Height:"height",Width:"width"},function(a,b){o.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){o.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return o.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?o.css(b,c,g):o.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),o.fn.size=function(){return this.length},o.fn.andSelf=o.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return o});var Lc=a.jQuery,Mc=a.$;return o.noConflict=function(b){return a.$===o&&(a.$=Mc),b&&a.jQuery===o&&(a.jQuery=Lc),o},typeof b===U&&(a.jQuery=a.$=o),o});
diff --git a/TPPTAnalysisSW/static/script/mainpage.js b/TPPTAnalysisSW/static/script/mainpage.js
new file mode 100644
index 0000000..62f4e47
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/mainpage.js
@@ -0,0 +1,217 @@
+$(document).ready(function () {
+
+    //
+    // Main page status related functions
+    //
+
+    var loadstate = function () {
+        if(typeof(Storage)!=="undefined") {
+            if (sessionStorage.view) {
+                if (sessionStorage.view == 'latest')  {
+                    select_latest()
+                }
+                else if (sessionStorage.view == 'manufacturers')  {
+                    select_manufacturers()
+                }
+            }
+            else {
+                select_latest()
+            }
+            if (sessionStorage.manufacturers) {
+                var mselections = JSON.parse(sessionStorage.manufacturers)
+                if ($.isArray(mselections)) {
+                     show_manufacturers(mselections);
+                }
+            }
+        }
+    };
+
+    var show_manufacturers = function (mselections) {
+        // This breaks if the tree is changed while browsing -> currently "too bad"
+        $(".collapsing-header").each(function () {
+            if ($.inArray($(this).data('indx'), mselections) != -1) {
+                togglerow.call(this)
+            }
+        });
+    };
+
+    var saveview = function (currentview) {
+        if(typeof(Storage)!=="undefined") {
+            sessionStorage.view = currentview;
+        }
+    };
+
+    // Save individual manufacturer row (indx) state (true=visible, false=hidden)
+    var savemselection = function (indx, state) {
+        if(typeof(Storage)!=="undefined") {
+            if (sessionStorage.manufacturers) {
+                var mselections = JSON.parse(sessionStorage.manufacturers);
+            }
+            else {
+                var mselections = [];
+            }
+            if (state) {
+                mselections.push(indx);
+            }
+            else {
+                var index = $.inArray($(this).data('indx'), mselections);
+                if (index != -1) {
+                    mselections.splice(index, 1);
+                }
+            }
+
+            sessionStorage.manufacturers = JSON.stringify(mselections);
+        }
+    };
+
+    //
+    // Navigation
+    //
+
+    var select_latest = function() {
+        $("#view_latest").show();
+        $("#view_manufacturers").hide();
+        $(".viewselector").removeClass("selected");
+        $("#viewsel_latest").addClass("selected");
+        saveview('latest');
+    }
+
+    var select_manufacturers = function () {
+        $("#view_latest").hide();
+        $("#view_manufacturers").show();
+        $(".viewselector").removeClass("selected");
+        $("#viewsel_manufacturers").addClass("selected");
+        saveview('manufacturers');
+    }
+
+    $("#viewsel_latest").click(select_latest);
+
+    $("#viewsel_manufacturers").click(select_manufacturers);
+
+    var togglerow = function () {
+		if (!$(this).data('shown')) {
+		    // Save the table-row display style to jquery memory...
+		    $(this).siblings().css('display', 'table-row');
+		    $(this).siblings().toggle();
+		    $(this).data('shown', 'true');
+		}
+		$(this).siblings().toggle("fast");
+		$(this).children(".collapsing-icon").children().toggle(); // Change + -> -
+	};
+
+    $(".collapsing-header").click(function () {
+        togglerow.call(this);
+
+        if ($(this).css('display') == 'none') {
+            savemselection($(this).data('indx'), false);
+        }
+        else {
+            savemselection($(this).data('indx'), true);
+        }
+    });
+
+    //
+    // Test session navigation
+    //
+
+    $('.test_session_row td:not(:last-child)').click(function(e) {
+        if($(this).hasClass("ban")) {
+            e.stopPropagation();
+        } else {
+            window.location = "testsessions/" + $(this).parent().data("id");
+        }
+    });
+
+    $('.test_session_row td:nth-last-child(2)').click(function(e) {
+        if($(this).hasClass("ok")) {
+            window.location = "testsessionreports/" + $(this).parent().data("id");
+        } else {
+            e.stopPropagation();
+        }
+    });
+
+    $(function() {
+        $('#deleteRequest').click(function(){
+            $('#deletemodal').modal('hide');
+            $.ajax({
+                type: "POST",
+                url: "/",
+                async: false,
+                data: { params: "delete",
+                        id: $(this).data("id") },
+            }).done(location.reload(true)).fail(deletefail);
+        });
+    });
+
+    $('#deletemodal').on('show.bs.modal', function(event) {
+        var cell = $(event.relatedTarget);
+        var sessionId = cell.data('id');
+        var modal = $(this);
+        modal.find('.idspan').text(sessionId);
+        var button = modal.find('#deleteRequest');
+        button.data("id", sessionId);
+    });
+
+    //
+    // Recalculate all
+    //
+
+    var progress;
+
+    var postsuccess = function (data) {
+        progress.close();
+        $("#Main").show();
+        $("#loading").hide();
+        location.reload(true);
+    };
+
+    var postfail = function (data) {
+        progress.close();
+        alert('Recalculation failed: server error');
+        $("#Main").show();
+        $("#loading").hide();
+    };
+
+    var deletefail = function (data) {
+        alert('Deletion failed: server error');
+        $("#Main").show();
+        $("#loading").hide();
+    };
+
+    $("#recalculate_button").click(function () {
+        $("#Main").hide();
+        $("#loading").show();
+
+        progress  = new EventSource('?event=progress');
+
+        progress.onmessage = function(event) {
+            var val = Math.round(event.data * 100);
+            if(val <= 99) {
+                $('.prog').text(val);
+                $('.progress-bar').css('width', val + '%').attr('aria-valuenow', val);
+            } else {
+                $('.prog').text(100);
+                $('.progress-bar').css('width', 100 + '%').attr('aria-valuenow', 100);
+            }
+        };
+
+        $.ajax({
+            type: "POST",
+            url: "/",
+            data: { params: "recalculate" },
+        }).done(postsuccess).fail(postfail);
+    });
+
+    //
+    // Initializations
+    //
+
+    $(".notes").each(function () {
+        text = $(this).text();
+        if (text.length > 20)
+            $(this).text(text.substr(0, 20));
+    });
+
+    loadstate();
+
+});
diff --git a/TPPTAnalysisSW/static/script/settings.js b/TPPTAnalysisSW/static/script/settings.js
new file mode 100644
index 0000000..f093615
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/settings.js
@@ -0,0 +1,142 @@
+$(document).ready(function(){
+
+    $('.alert').parent().hide();
+
+    $(function() {
+       $(document).on('click', '.alert-close', function() {
+           $(this).parent().hide();
+       });
+    });
+
+    var postsuccess = function (data) {
+        $("#Main").show()
+        $("#loading").hide()
+        location.reload(true)
+    };
+
+    var postfailure = function (data) {
+        progress.close();
+        $("#Main").show()
+        $("#loading").hide()
+        $('.errormsg').text('Settings could not be saved. Please check the logs for details.')
+        $('.errormsg').slideDown('fast')
+    };
+
+    $('.setting_value_input').bind('input', function() {
+        var text = $(this).val()
+        if (text.indexOf(',') >= 0) {
+            // Replace ',' with '.' -> allow comma decimal separator (e.g. Finnish locale)
+            text = text.split(',').join('.');
+        }
+
+        var name = $(this).attr('name')
+
+        // Check if the input text is a legal value for the input
+        var valid = false
+        if (name.match(/^edgelimit/) || name.match(/^ztouchlimit/)) {
+            // Allow negative and zero values
+            if (text.match(/^-?\d+(\.\d+)?$/) && !isNaN(text)) {
+                valid = true;
+            }
+        }
+        //else if (name.match(/missing/)) {
+        else {
+            // Do not allow negative values
+            if (text.match(/^\d+(\.\d+)?$/) && parseFloat(text) >= 0) {
+                valid = true;
+            }
+        }
+        /*
+        else {
+            // Do not allow negative or zero values
+            if (text.match(/^\d+(\.\d+)?$/) && parseFloat(text) > 0) {
+                valid = true;
+            }
+        }
+        */
+
+        if (valid && $(this).hasClass('invalid')) {
+            $(this).removeClass('invalid');
+        }
+        else if(!valid && !$(this).hasClass('invalid')) {
+            $(this).addClass('invalid');
+        }
+    });
+
+    var progress;
+
+    $("#save").on('submit', function(e) {
+
+        // Check if there are invalid values
+        e.preventDefault();
+
+        if ($('.invalid').length > 0) {
+            $('.errormsg').text('Please check the invalid values before saving');
+            $('.errormsg').slideDown('fast');
+        }
+        else
+        {
+
+            if($("#save").context.activeElement.value === "recalculate") {
+                $("#Main").hide();
+                $("#loading").show();
+            }
+
+            var idvalues = [];
+            $(".settings_table :input").each(function(){
+                var idvalue = {id : $(this).attr("name"), value : $(this).val()};
+                idvalues.push(idvalue);
+            });
+
+
+            if($("#save").context.activeElement.value === "recalculate") {
+
+                progress  = new EventSource('/settings?event=progress');
+
+                progress.onmessage = function(event) {
+                    var val = Math.round(event.data * 100);
+                    if(val <= 99) {
+                        $('.prog').text(val);
+                        $('.progress-bar').css('width', val + '%').attr('aria-valuenow', val);
+                    } else {
+                        $('.prog').text(100);
+                        $('.progress-bar').css('width', 100 + '%').attr('aria-valuenow', 100);
+                    }
+                };
+
+                $.ajax({
+                    type: "POST",
+                    url: "/settings",
+                    data: {params: JSON.stringify(idvalues),
+                           mode: $("#save").context.activeElement.value},
+                    success : function(msg) {
+                        progress.close();
+                        location.reload(true);
+                        $(document).ready(function() {
+                            $('.alert').text(msg);
+                            $('.alert').parent().show();
+                            $('html, body').animate({ scrollTop: 0 }, 0);
+                        });
+                    }
+                }).fail(postfailure);
+
+            } else {
+
+                $.ajax({
+                    type: "POST",
+                    url: "/settings",
+                    data: {params: JSON.stringify(idvalues),
+                           mode: $("#save").context.activeElement.value},
+                   success : function(msg) {
+                        $('.alert').text(msg);
+                        $('.alert').parent().show();
+                        $('html, body').animate({ scrollTop: 0 }, 0);
+                    }
+                }).fail(postfailure);
+
+            }
+        }
+
+    });
+
+});
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/script/test_dut_settings.js b/TPPTAnalysisSW/static/script/test_dut_settings.js
new file mode 100644
index 0000000..cb9d3be
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/test_dut_settings.js
@@ -0,0 +1,81 @@
+$(document).ready(function () {
+
+    var postsuccess = function (data) {
+        $("#Main").show()
+        $("#loading").hide()
+        location.reload(true)
+    };
+
+    var postfailure = function (data) {
+        $("#Main").show()
+        $("#loading").hide()
+        $('.errormsg').text('Settings could not be saved. Please check the logs for details.')
+        $('.errormsg').slideDown('fast')    
+    };
+
+    $('.setting_value_input').bind('input', function() {
+        var text = $(this).val()
+        if (text.indexOf(',') >= 0) {
+            // Replace ',' with '.' -> allow comma decimal separator (e.g. Finnish locale)
+            text = text.split(',').join('.');
+        }
+
+        var name = $(this).attr('name')
+
+        // Check if the input text is a legal value for the input
+        var valid = false
+        if (name.match(/^offset/)) {
+            // Allow negative and zero values
+            if (text.match(/^-?\d+(\.\d+)?$/) && !isNaN(text)) {
+                valid = true;
+            }
+        }
+        else {
+            // Do not allow negative or zero values
+            if (text.match(/^\d+(\.\d+)?$/) && parseFloat(text) > 0) {
+                valid = true;
+            }
+        }
+
+        if (valid && $(this).hasClass('invalid')) {
+            $(this).removeClass('invalid');
+        }
+        else if(!valid && !$(this).hasClass('invalid')) {
+            $(this).addClass('invalid');
+        }
+    })
+
+    $("#save_button").click(function () {
+        // Check if there are invalid values
+        if ($('.invalid').length > 0) {
+            $('.errormsg').text('Please check the invalid values before saving')
+            $('.errormsg').slideDown('fast')
+        }
+        else 
+        {
+            $("#Main").hide()
+            $("#loading").show()
+
+            $('.errormsg').hide();
+            var saveValues = {};
+            $('.setting_value_input').each(function() {
+                saveValues[$(this).attr('name')] = $(this).val();
+            });
+            $('.setting_value_checkbox:checked').each(function() {
+                saveValues[$(this).attr('name')] = $(this).val();
+            });
+            $('.dut_value_input').each(function () {
+                saveValues[$(this).attr('name')] = $(this).val();
+            });
+
+            // Debug output
+            //$('#output').text(JSON.stringify(saveValues, null, "  "));
+
+            $.ajax({
+                type: 'POST',
+                data: {data: JSON.stringify(saveValues)},
+                dataType: 'text'}).done(postsuccess).fail(postfailure);
+        }      
+    });
+});
+
diff --git a/TPPTAnalysisSW/static/script/test_page.js b/TPPTAnalysisSW/static/script/test_page.js
new file mode 100644
index 0000000..5d07940
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/test_page.js
@@ -0,0 +1,46 @@
+$(document).ready(function()
+{
+	$(".pass_select").each(function()
+	{
+		if ($(this).hasClass("select_initially_passed"))
+		{
+			$(this).val("passed")
+			$(this).addClass("passed")
+			$(this).removeClass("failed")
+		}
+		else
+		{
+			$(this).val("failed")
+			$(this).addClass("failed")
+			$(this).removeClass("passed")
+		}
+	});
+
+	$(".pass_select").change(function()
+	{
+		if ($('option:selected', this).hasClass("passed"))
+		{
+			$(this).addClass("passed")
+			$(this).removeClass("failed")
+		}
+		else
+		{
+			$(this).addClass("failed")
+			$(this).removeClass("passed")
+		}
+	});
+
+	$("#print_button").click(function()
+	{
+		window.print();
+	});
+
+
+    $("#upload_button").click(function () {
+        $.post(window.location.href.split('?')[0] + '/upload', function(data) {
+            alert(JSON.stringify(data));
+            window.location.reload();
+        });
+    });
+
+});
diff --git a/TPPTAnalysisSW/static/script/test_page_subplots.js b/TPPTAnalysisSW/static/script/test_page_subplots.js
new file mode 100644
index 0000000..ab85970
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/test_page_subplots.js
@@ -0,0 +1,78 @@
+// The amount of image loads currently in progress
+var loadcount = 0
+
+function imageLoaded() {
+    loadcount -= 1;
+    if (loadcount === 0) {
+        $("#print_button").attr("disabled", false)
+    }
+}
+
+function imageLoading() {
+    loadcount += 1;
+    if (loadcount === 1) {
+        $("#print_button").attr("disabled", true)
+    }
+}
+
+function showPlot(plotObject) {
+    // plotObject is a (single) jQuery object for .plot instance
+    if (!plotObject.data("shown")) {
+        $.map($('.plot'), function(el) {
+            var imgsrc = $(el).data("src");
+            imageLoading();
+            $(el).html("<img src=\"" + imgsrc + "\" onload=\"imageLoaded()\" />");
+            $(el).data("shown", true);
+        });
+    }
+}
+
+function toggleState(set) {
+    // Toggles the visibility state of given jQuery set
+    set.each(function () { showPlot($(this)) });
+    // Set the display value to same as the first one
+    set.first().toggle();
+    var display = set.css("display");
+    set.css("display", display);
+}
+
+$(document).ready(function () {
+
+    $(".all_lines_button").click(function () {
+        // Select all plots
+        var selector = ".plot"
+        if ($(this).is("[data-target]")) {
+            // Target defined
+            selector = "#".concat($(this).attr("data-target")) + " " + selector
+        }
+
+        toggleState($(selector))
+    });
+
+    $(".failed_lines_button").click(function () {
+        // Select failed plots
+        var selector = ".failed ~ .plot"
+        if ($(this).is("[data-target]")) {
+            // Target defined
+            selector = "#".concat($(this).attr("data-target")) + " " + selector
+        }
+
+        toggleState($(selector))
+    });
+
+    $(".passed_lines_button").click(function () {
+        // Select passed plots
+        var selector = ".passed ~ .plot"
+        if ($(this).is("[data-target]")) {
+            // Target defined
+            selector = "#".concat($(this).attr("data-target")) + " " + selector
+        }
+
+        toggleState($(selector))
+    });
+
+    $(".subplot_table .show_plot").click(function () {
+        showPlot($(this).parent().siblings(".plot"));
+        $(this).parent().siblings(".plot").toggle();
+    });
+});
diff --git a/TPPTAnalysisSW/static/script/test_summary.js b/TPPTAnalysisSW/static/script/test_summary.js
new file mode 100644
index 0000000..9b1de2e
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/test_summary.js
@@ -0,0 +1,60 @@
+$(document).ready(function () {
+    var loadcount = 1 + $("#test_summaries").data("count"); // Session + tests
+
+    function loadDone() {
+        loadcount -= 1;
+        if (loadcount == 0) {
+            $("#print_button").prop('disabled', false);
+        }
+    }
+
+    function sessionLoaded(data) {
+        var dom = $(data);
+        // Remove elements not belonging to the summary
+        dom.find(".no_summary").remove();
+        var content = dom.find('.content').html();
+        $(this).html(dom.find('.content').html());
+           
+        $(".test_row").click(function () {
+            window.location = "/tests/" + $(this).data("test-id");
+        });
+
+        loadDone();
+    }
+
+    function testLoaded(data) {
+        var dom = $(data);
+        
+        // Add title
+        var contents = dom.find(".test_title");
+        contents.find('.no_summary').remove();
+        $(this).append(contents);
+
+        // Add the summary table
+        var contents = dom.find(".test_verdicts");
+        contents.find('.no_summary').remove();
+        $(this).append(contents);
+
+        loadDone();
+    }
+
+    function loadFailed() {
+        alert("Report loading failed")
+    }
+
+    $(".test_sesession").each(function () {
+        $.ajax({ url: "http://localhost:8081/testsessions/".concat($(this).attr("id")),
+                 context: this,
+        }).done(sessionLoaded).fail(loadFailed);
+    });
+
+    $(".test_div").each(function() {
+        $.ajax({ url: "http://localhost:8081/tests/" + $(this).attr("id") + "?noimages=true",
+                 context: this,
+        }).done(testLoaded).fail(loadFailed);
+    });
+
+    $("#print_button").click(function() {
+        window.print();
+    });
+});
\ No newline at end of file
diff --git a/TPPTAnalysisSW/static/script/testsession.js b/TPPTAnalysisSW/static/script/testsession.js
new file mode 100644
index 0000000..4e98f28
--- /dev/null
+++ b/TPPTAnalysisSW/static/script/testsession.js
@@ -0,0 +1,56 @@
+$(document).ready(function () {
+    function notesSaved(data) {
+        //alert(data);
+        $('#notes').html(data);
+        $("#notes").show();
+        $("#notes_editor").hide();
+        $("#notes_edit").show();
+        $("#notes_save").hide();
+    }
+
+    function notesError() {
+        alert('Saving of notes failed');
+    }
+
+    $(".test_row").click(function () {
+        window.location = "/tests/" + $(this).data("test-id");
+    });
+
+    $(".upload_test_button").click(function () {
+        var location = window.location.href.split('?')[0] + '/upload_test?test_id=' + $(this).data("test-id");
+
+        $.post(location, function(data) {
+            alert(JSON.stringify(data));
+            // Reload to refresh the disabled status for all the buttons on the page
+            window.location.reload();
+        });
+    });
+
+    $("#upload_session_button").click(function () {
+        var location = window.location.href.split('?')[0] + '/upload_session?session_id=' + $(this).data("session-id");
+
+        $.post(location, function(data) {
+            alert(JSON.stringify(data));
+            // Reload to refresh the disabled status for all the buttons on the page
+            window.location.reload();
+        });
+    });
+
+    $("#notes_save").click(function () {
+        var data = { command: 'set_notes',
+            value: $('#notes_editor').val()
+        };
+        $.ajax({ type: "POST",
+            data: { data: JSON.stringify(data)
+            },
+            datatype: 'text'
+        }).done(notesSaved).fail(notesError);
+    });
+
+    $("#notes_edit").click(function () {
+        $("#notes").hide();
+        $("#notes_editor").show();
+        $("#notes_edit").hide();
+        $("#notes_save").show();
+    });
+});
diff --git a/TPPTAnalysisSW/static/style - Copy.css b/TPPTAnalysisSW/static/style - Copy.css
new file mode 100644
index 0000000..51f6571
--- /dev/null
+++ b/TPPTAnalysisSW/static/style - Copy.css
@@ -0,0 +1,103 @@
+body {
+ font-family: "Helvetica";
+}
+.listing_table {
+border-width: 0;
+border-spacing: 0px;
+border-style: double;
+border-color: black;
+border-collapse: collapse;
+background-color: white;
+width: 100%;
+margin-bottom: 10px;
+}
+.listing_table th, .listing_table td {
+ border: 1px solid #000;
+ padding: 3px;
+ text-align: center;
+}
+.listing_table th {
+ background-color: #E0EFFF;
+}
+
+#lines_table
+{
+ width: 600px;
+}
+#test_sessions,#tests {
+ border-collapse: collapse;
+ width: 800px;
+}
+#test_sessions th,#test_sessions td,#tests th,#tests td,#selected_lines th,#selected_lines td
+{
+ border: 1px solid #000;
+ padding: 3px;
+}
+
+#test_sessions tr.highlight,#tests tr.highlight
+ {
+  background-color: #D2F5C6;
+  cursor:pointer;
+ }
+ #settings_table
+ {
+   text-align:right;
+ }
+ 
+ .failed
+ {
+  background-color: #FFC4C4;
+ }
+ .passed
+ {
+  background-color: #CDFFC4;
+ }
+ #control_panel
+ {
+  position: absolute;
+  height: 100%;
+  overflow: auto;
+  top:0;
+  left:0;
+ }
+ #image_area
+ {
+  top:0;
+  right:0;
+  position: absolute;
+  overflow: auto;
+  float: right;
+  border-left: black 1px dashed;
+  height: 100%;
+  width: 800px;
+ }
+ #load_image
+ {
+    margin-left: auto;
+	margin-right: auto;
+	
+ }
+ .vertical_header_th
+ {
+  text-align:right;
+ }
+ .plot_type_header
+ {
+  cursor:pointer;
+ }
+#print_container {
+  visibility:hidden;
+}
+@media print {
+  body * {
+    visibility:hidden;
+  }
+  #print_container, #print_container * {
+    visibility:visible;
+  }
+  #print_container {
+    position:absolute;
+    left:0;
+    top:0;
+  }
+}
diff --git a/TPPTAnalysisSW/static/style.css b/TPPTAnalysisSW/static/style.css
new file mode 100644
index 0000000..3567ad9
--- /dev/null
+++ b/TPPTAnalysisSW/static/style.css
@@ -0,0 +1,38 @@
+@media print {
+.no_print {
+    display:none;
+}
+}
+
+@media screen {
+.passed
+{
+	color: #00FF00;
+	font-weight:bold;
+}
+
+.failed
+{
+	color: #FF0000;
+	font-weight:bold;
+}
+}
+
+@media print {
+.passed
+{
+	color: #00FF00 !important;
+    font-weight:bold;
+}
+
+.failed
+{
+	color: #FF0000 !important;
+    font-weight:bold;
+}
+}
+
+table.datatable td textarea
+{
+	width: 100%;
+}
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/dummy_dut.html b/TPPTAnalysisSW/templates/dummy_dut.html
new file mode 100644
index 0000000..d97359d
--- /dev/null
+++ b/TPPTAnalysisSW/templates/dummy_dut.html
@@ -0,0 +1,53 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>Dummy DUT result creator</title>
+	<script type="text/javascript" src="/static/script/jquery.js"></script>
+	<script type="text/javascript" src="/static/script/dummy_dut.js"></script>
+	<link rel="shortcut icon" href="/static/img/favicon.ico"/>
+	<link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+	<link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+	<link rel="stylesheet" type="text/css" href="/static/style.css" />
+  </head>
+  <body>
+	<div class="report">
+	<div id="Main" class="content" style="display: block; visibility: visible;">
+	<div><img src="../static/img/logo.jpg"/><p class="version">Analysis software version 1.2</p></div>
+	<span class="no_print"><br/><a href="/">Back</a></span>
+	<h2>Create test data</h2>
+	
+	<table class="listtable" id="settings_table">
+		<tr>
+			<th>Setting</th>
+			<th>value</th>
+		</tr>
+		<tr py:for="system_option in system_options">
+			<td>${system_option["desc"]}</td>
+			<td><input class="setting_value_input" type="text" name="${system_option['name']}" value="${system_option['value']}"/>${system_option["unit"]}</td>
+		</tr>
+	</table>
+	
+	<table class="listtable" id="test_table">
+		<tr>
+			<th>Tests</th>
+			<th>Selected</th>
+			<th py:for="test_option in test_options">${test_option}</th>
+		</tr>
+		<tr py:for="test in tests" class="test_row">
+			<td>${test['desc']}</td>
+			<td><input type="checkbox" name="${test['name']}" value="selected"/></td>
+			<td py:for="i in range(len(test['test_options']))"><input type="text" name="${test['test_options'][i]}" class="setting_value_input" value="${'1' if i == 2 else '0'}"/></td>
+		</tr>
+		<tr>
+			<td>All</td>
+			<td><input type="checkbox" name="all_tests" id="select_all"/></td>
+			<td py:for="i in range(3)"><input name="all" type="text" class="setting_value_input select_all" value="${'1' if i == 2 else '0'}"/></td>
+		</tr>
+	</table>
+	
+	<br/><br/>
+	<button id="save_button">Create</button>
+	</div>
+	<div id="loading" style="display: none;"><br/><br/>Creating data. Please wait.<br/><br/></div>
+	</div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/includes.html b/TPPTAnalysisSW/templates/includes.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TPPTAnalysisSW/templates/includes.html
diff --git a/TPPTAnalysisSW/templates/settings.html b/TPPTAnalysisSW/templates/settings.html
new file mode 100644
index 0000000..aaee6fe
--- /dev/null
+++ b/TPPTAnalysisSW/templates/settings.html
@@ -0,0 +1,76 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>Analysis limits</title>
+	<script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"></script>
+	<link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"/>
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+    <link rel="stylesheet" type="text/css" href="/static/mainpage.css" />
+  </head>
+  <body>
+	<div class="report">
+	<div id="Main" class="content" style="display: block; visibility: visible;">
+	<div><a href="/"><a href="/"><img src="/static/img/logo.jpg"/></a></a><p class="version">Analysis software version ${version.simple}</p></div>
+	<span class="no_print"><br/><a href="/"><button class="btn btn-primary">Back</button></a></span>    <br />    <br />
+    <br />
+    <div class="row">
+        <div class="col-md-6">
+            <div class="alert alert-warning alert-dismissible" role="alert">
+                <button type="button" class="close close-alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            </div>
+        </div>
+    </div>
+
+	<h2>Analysis limits</h2>
+    <span class="errormsg no_print"></span>
+    <form id="save" method="post" action="">
+    <button id="save_button" class="btn btn-warning" type="submit" value="recalculate">Save and Recalculate All</button>
+    <button id="save_button" class="btn btn-primary" type="submit" name="mode" value="norecalculate">Save Only</button>
+    <div py:for="group in groups">
+      <h3>${", ".join(group[0]) if group[0] is not None else 'Uncategorized'}</h3>
+        <div class="row">
+            <div class="col-md-6">
+        	  <table class="table table-striped listtable settings_table">
+        	  <tr>
+        		  <th class="setting_name">Setting</th>
+        		  <th class="setting_input">Value</th>
+        	  </tr>
+        	  <tr py:for="setting in group[1]">
+        		  <td class="setting_name">${setting.desc}</td>
+        		  <td class="setting_input">
+                    <input class="input-sm setting_value_input" type="text" name="${setting.id}" value="${setting.value}"/> ${setting.unit}
+                  </td>
+        	  </tr>
+        	  </table>
+            </div>
+        </div>
+  	  <br/><br/>
+    </div>
+    <button id="save_button" class="btn btn-warning" type="submit" value="recalculate">Save and Recalculate All</button>
+    <button id="save_button" class="btn btn-primary" type="submit" name="mode" value="norecalculate">Save Only</button>
+    </form>
+    <br /><br />
+	</div>
+	<div id="loading">
+        <div class="row">
+            <div class="col-xs-1"></div>
+            <div class="col-md-6">
+                <br/><br/>
+                <p>Recalculating analysis. Please wait.</p>
+        <div class="progress">
+            <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
+                <span class="prog"></span> %
+        </div>
+        </div>
+        <br/><br/>
+        </div>
+        </div>
+    </div>
+	</div>
+    <script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"/>
+    <script type="text/javascript" src="/static/script/settings.js"></script>
+    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_common_body.html b/TPPTAnalysisSW/templates/test_common_body.html
new file mode 100644
index 0000000..1c07315
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_common_body.html
@@ -0,0 +1,68 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>${"%s #%s" % (test_type_name,test_id)}, ${dut['manufacturer']} ${dut['program']}, ${testsession['operator']} ${testsession['starttime']}, test session ID: ${testsession['id']}</title>
+	<script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"></script>
+    <script type="text/javascript" src="/static/script/test_page.js"></script>
+    <py:if test="defined('test_script')">
+        <script type="text/javascript" src="/static/script/${test_script}"></script>
+    </py:if>
+
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+    <link rel="stylesheet" type="text/css" href="/static/graph.css" />
+    <link rel="stylesheet" type="text/css" media="print" href="/static/reportstyle_print.css" />
+  </head>
+  <body>
+    <div class="report">
+    <div id="Main" class="content" style="display: block; visibility: visible;">
+
+    <!--! Common header: logo, version, back & print buttons -->
+    <div class="no_summary">
+        <a href="/"><img src="/static/img/logo.jpg"/></a>
+        <p class="version">Analysis software version ${version.simple}</p>
+
+    <span class="no_print"><br/>
+        <a href="/testsessions/${testsession['id']}">
+            <button class="btn btn-primary">Back</button>
+        </a>
+    </span>
+
+    <span class="no_print">
+        <a href="/">
+            <button class="btn btn-primary">Analysis Home</button>
+        </a>
+    </span>
+
+    <span py:if="defined('results')" class="no_print">
+        <a href="?refresh=yes">
+        <button py:if="'test_type_name' in results" class="no_print btn btn-primary" id="refresh_button">
+            Refresh
+        </button>
+        </a>
+    </span>
+
+    <button class="no_print btn btn-info" id="print_button">
+        <span class="glyphicon glyphicon-print"></span> Print
+    </button>
+
+    </div>
+
+    <span py:if="defined('results') and 'test_type_name' in results">
+        <h1 class="test_title">${"%s #%s" % (results.test_type_name, test_id)}</h1>
+    </span>
+
+    <span py:if="not defined('results') or 'test_type_name' not in results">
+        <h1 class="test_title">${"%s #%s" % (test_type_name, test_id)}</h1>
+    </span>
+
+    <h2 class="test_title">${dut['manufacturer']} ${dut['program']} ${dut['sample_id']} ${test_item['finger_type']}<span class="no_summary">${testsession['operator']} ${test_item['starttime']}, test session ID:${testsession['id']}</span></h2>
+
+    <!--! Actual content of the report -->
+    <xi:include href="templates/$test_page" />
+
+    </div></div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_configured_body.html b/TPPTAnalysisSW/templates/test_configured_body.html
new file mode 100644
index 0000000..3b43e4b
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_configured_body.html
@@ -0,0 +1,86 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>${"%s #%s" % (test_type_name,test_id)}, ${dut['manufacturer']} ${dut['program']}, ${testsession['operator']} ${testsession['starttime']}, test session ID: ${testsession['id']}</title>
+	<script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"></script>
+    <script type="text/javascript" src="/static/script/test_page.js"></script>
+    <py:if test="defined('test_script')">
+        <script type="text/javascript" src="/static/script/${test_script}"></script>
+    </py:if>
+
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+    <link rel="stylesheet" type="text/css" href="/static/graph.css" />
+    <link rel="stylesheet" type="text/css" media="print" href="/static/reportstyle_print.css" />
+  </head>
+  <body>
+    <div class="report">
+    <div id="Main" class="content" style="display: block; visibility: visible;">
+
+    <!--! Common header: logo, version, back & print buttons -->
+    <div class="no_summary">
+        <a href="/"><img src="/static/img/logo.jpg"/></a>
+        <p class="version">Analysis software version ${version.simple}</p>
+
+    <span class="no_print"><br/>
+        <a href="/testsessions/${testsession['id']}">
+            <button class="btn btn-primary">Back</button>
+        </a>
+    </span>
+
+    <span class="no_print">
+        <a href="/">
+            <button class="btn btn-primary">Analysis Home</button>
+        </a>
+    </span>
+
+    <span py:if="defined('results')" class="no_print">
+        <a href="?refresh=yes">
+        <button py:if="'test_type_name' in results" class="no_print btn btn-primary" id="refresh_button">
+            Refresh
+        </button>
+        </a>
+    </span>
+
+    <button class="no_print btn btn-info" id="print_button">
+        <span class="glyphicon glyphicon-print"></span> Print
+    </button>
+
+    <button py:if="sql_uploader_initialized" class="no_print btn btn-info" id="upload_button" py:attrs="upload_button_attributes">
+        <span class="glyphicon glyphicon-cloud-upload"></span> Upload to cloud
+    </button>
+
+    </div>
+
+    <span py:if="defined('results') and 'test_type_name' in results">
+        <h1 class="test_title">${"%s #%s" % (results.test_type_name, test_id)}</h1>
+    </span>
+
+    <span py:if="not defined('results') or 'test_type_name' not in results">
+        <h1 class="test_title">${"%s #%s" % (test_type_name, test_id)}</h1>
+    </span>
+
+    <h2 class="test_title">${dut['manufacturer']} ${dut['program']} ${dut['sample_id']} ${test_item['finger_type']}<span class="no_summary">${testsession['operator']} ${test_item['starttime']}, test session ID:${testsession['id']}</span></h2>
+
+     <div py:if="test_parameters is not None">
+        <table class="datatable test_parameters">
+            <tr>
+                <th>Parameter</th>
+                <th>Value</th>
+            </tr>
+            <tr py:for="parameter in test_parameters">
+                <td>${"%s" % parameter[0]}</td>
+                <td>${"%s" % parameter[1]}</td>
+            </tr>
+        </table>
+    </div>
+
+
+    <!--! Actual content of the report -->
+    <xi:include href="templates/$test_page" />
+
+    </div></div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_dummy.html b/TPPTAnalysisSW/templates/test_dummy.html
new file mode 100644
index 0000000..0cc31f0
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_dummy.html
@@ -0,0 +1,4 @@
+    <!--! Report consists of one image -->
+    <div>
+    <img class="preview" src="${figure}" width="800" height="600"/>
+    </div>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_dut_settings.html b/TPPTAnalysisSW/templates/test_dut_settings.html
new file mode 100644
index 0000000..202c9f0
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_dut_settings.html
@@ -0,0 +1,100 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>Dut ${dutinfo.id} settings</title>
+    <script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"/>
+    <script type="text/javascript" src="/static/script/test_dut_settings.js"></script>
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+  </head>
+  <body>
+    <span id="dut_id" style="visibility: hidden">${dutinfo.id}</span>
+    <div class="report">
+    <div id="Main" class="content">
+    <div><a href="/"><img src="/static/img/logo.jpg"/></a><p class="version">Analysis software version ${version.simple}</p></div>
+    <span class="no_print"><br/><a href="/testsessions/${testsessionid}"><button class="btn btn-primary">Back</button></a></span>
+    <h2>Product settings</h2>
+
+    <span class="errormsg no_print"></span>
+
+    <table class="listtable settings_table">
+    <tr>
+        <th>Setting</th>
+        <th>Analysis Value</th>
+    </tr>
+    <tr>
+        <td>Touch screen size x</td>
+        <td><input class="setting_value_input" type="text" name="size_x" value="${dutinfo.dimensions[0]}"/> mm</td>
+    </tr>
+    <tr>
+        <td>Touch screen size y</td>
+        <td><input class="setting_value_input" type="text" name="size_y" value="${dutinfo.dimensions[1]}"/> mm</td>
+    </tr>
+    <tr>
+        <td>Touch digitizer resolution x</td>
+        <td><input class="setting_value_input" type="text" name="digitizer_resolution_x" value="${dutinfo.digitizer_resolution[0]}"/> px</td>
+    </tr>
+    <tr>
+        <td>Touch digitizer resolution y</td>
+        <td><input class="setting_value_input" type="text" name="digitizer_resolution_y" value="${dutinfo.digitizer_resolution[1]}"/> px</td>
+    </tr>
+    <tr>
+        <td>Switch X and Y coordinates</td>
+        <td id="switchxy_td">
+          <input class="setting_value_checkbox" type="radio" name="switchxy" id="switchxy_yes" value="1" checked="${True if dutinfo.switchxy else None}"/><label for="switchxy_yes">Yes</label>
+          <input class="setting_value_checkbox" type="radio" name="switchxy" id="switchxy_no" value="0" checked="${True if not dutinfo.switchxy else None}"/><label for="switchxy_no">No</label>
+        </td>
+    </tr>
+    <tr>
+        <td>Flip X coordinates</td>
+        <td id="flipx_td">
+          <input class="setting_value_checkbox" type="radio" name="flipx" id="flipx_yes" value="1" checked="${True if dutinfo.flipx else None}"/><label for="flipx_yes">Yes</label>
+          <input class="setting_value_checkbox" type="radio" name="flipx" id="flipx_no" value="0" checked="${True if not dutinfo.flipx else None}"/><label for="flipx_no">No</label>
+        </td>
+    </tr>
+    <tr>
+        <td>Flip Y coordinates</td>
+        <td id="flipy_td">
+          <input class="setting_value_checkbox" type="radio" name="flipy" id="flipy_yes" value="1" checked="${True if dutinfo.flipy else None}"/><label for="flipy_yes">Yes</label>
+          <input class="setting_value_checkbox" type="radio" name="flipy" id="flipy_no" value="0" checked="${True if not dutinfo.flipy else None}"/><label for="flipy_no">No</label>
+        </td>
+    </tr>
+    </table>
+
+    <h2>DUT settings</h2>
+    <table class="listtable settings_table">
+    <tr>
+        <th>DUT identifier</th>
+        <th>Value</th>
+    </tr>
+    <tr>
+        <td>Manufacturer</td>
+        <td><input class="dut_value_input" type="text" name="dut_manufacturer" value="${dutinfo.manufacturer}"/></td>
+    </tr>
+    <tr>
+        <td>Program</td>
+        <td><input class="dut_value_input" type="text" name="dut_program" value="${dutinfo.program}"/></td>
+    </tr>
+    <tr>
+        <td>Version</td>
+        <td><input class="dut_value_input" type="text" name="dut_batch" value="${dutinfo.batch}"/></td>
+    </tr>
+    <tr>
+        <td>Sample ID</td>
+        <td><input class="dut_value_input" type="text" name="dut_sample_id" value="${dutinfo.sample_id}"/></td>
+    </tr>
+    </table>
+    <!-- img id="setupimage" src="../static/img/setup.png"/ -->
+    <span id="output"></span>
+
+    <br/>
+    <button class="btn btn-primary" id="save_button">Save All</button>
+    <br/><br/>
+    </div>
+    <div id="loading" style="display: none; padding: 20px;">Recalculating test session... Please wait.</div>
+    </div>
+    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_dutinformation.html b/TPPTAnalysisSW/templates/test_dutinformation.html
new file mode 100644
index 0000000..5704587
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_dutinformation.html
@@ -0,0 +1,35 @@
+    <div>
+	<h3>TouchResolution</h3>
+	<table class="datatable">
+		<tr>
+			<th>Digitizer resolution</th>
+			<th></th>
+			<th>Native display resolution</th>
+			<th>Pass/Fail</th>
+		</tr>
+		
+		<tr>
+			<td>${"%d x %d"%(results.digitizerResolution[0], results.digitizerResolution[1])}</td>
+			<td>>=</td>
+			<td>${"%d x %d"%(results.nativeResolution[0], results.nativeResolution[1])}</td>
+			<td class="${'passed' if results.resolutionTestPassed else 'failed'}" >${"Pass" if results.resolutionTestPassed else "Fail"}</td>
+		</tr>
+	</table>
+	
+	<h3>PhysicalDimension</h3>
+	<table class="datatable">
+		<tr>
+			<th>Dimensions</th>
+			<th>PPI</th>
+			<th>Minimum allowed PPI</th>
+			<th>Pass/Fail</th>
+		</tr>
+		<tr>
+			<td>${"%.1f mm x %.1f mm"%(results.dimensions[0], results.dimensions[1])}</td>
+			<td>${"%.1f" % results.ppi}</td>
+			<td>${"%.1f" % settings.minppi}</td>
+			<td class="${'passed' if results.physicalDimensionTestPassed else 'failed'}" >${"Pass" if results.physicalDimensionTestPassed else "Fail"}</td>
+		</tr>
+	</table>
+    <p>&nbsp;</p>
+    </div>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_grid_accuracy.html b/TPPTAnalysisSW/templates/test_grid_accuracy.html
new file mode 100644
index 0000000..a4dc47c
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_grid_accuracy.html
@@ -0,0 +1,85 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+        <h1>Verdicts</h1>
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th class="wide"></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" >Avg of max accuracy error:</td>
+            <td>${"%.3f" % results.avg_max_input_error} mm</td>
+            <td>${"%.3f" % results.maxposerror} mm</td>
+            <td class="${'passed' if results.maxposerror >= results.avg_max_input_error else 'failed'}" >
+                 ${"Pass" if results.maxposerror >= results.avg_max_input_error else "Fail"}
+            </td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" >Avg of max accuracy error w/o notch and corners:</td>
+            <td>${"%.3f" % results.avg_max_edge_only_error} mm</td>
+            <td>${"%.3f" % results.maxposerror_edge_only} mm</td>
+            <td class="${'passed' if results.maxposerror_edge_only >= results.avg_max_edge_only_error else 'failed'}" >
+                 ${"Pass" if results.maxposerror_edge_only >= results.avg_max_edge_only_error else "Fail"}
+            </td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" >Avg of avg accuracy error:</td>
+            <td>${"%.3f" % results.avg_avg_input_error} mm</td>
+            <td>-</td>
+            <td >-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" >Stdev accuracy error:</td>
+            <td>${"%.3f" % results.stdev_input_error} mm</td>
+            <td>-</td>
+            <td >-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" >Max of max accuracy error:</td>
+            <td>${"%.3f" % results.max_max_input_error} mm</td>
+            <td>-</td>
+            <td >-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Missing inputs:</td>
+            <td>${"%.1f" % results.missing_inputs_percentage} %</td>
+            <td>${"%.1f"  %settings['grid_acc_missing_points']} %</td>
+            <td class="${'passed' if results.missing_inputs_verdict == 'Pass' else 'failed'}">${"Pass" if results.missing_inputs_verdict == "Pass" else "Fail"}</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Ghost finger(s):</td>
+            <td class="${'Found' if results.ghost_finger_found else 'Not found'}">${"Found" if results.ghost_finger_found else "Not found"}</td>
+            <td>-</td>
+            <td> - </td>
+        </tr>
+    </table>
+
+        <h1>Details</h1>
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th>Touch down</th>
+            <th>Touch up</th>
+        </tr>
+
+        <div py:if="'noimages' not in kwargs" py:for="i in range(len(results['touch_down'].images))" class="preview">
+            <tr>
+            <td>
+            <a href="${results['touch_down'].images[i][1]}">
+                <img src="${results['touch_down'].images[i][0]}" alt="Preview image"/>
+            </a>
+            </td>
+
+            <td>
+            <a href="${results['touch_up'].images[i][1]}">
+                <img src="${results['touch_up'].images[i][0]}" alt="Preview image"/>
+            </a>
+            </td>
+            </tr>
+        </div>
+    </table>
+
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_linearity.html b/TPPTAnalysisSW/templates/test_linearity.html
new file mode 100644
index 0000000..94e043f
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_linearity.html
@@ -0,0 +1,240 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+    <h3>Linearity results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Average of max linearity error</td>
+            <td>${"%.3f mm" % results.linearity_avg_of_max_errors if results.linearity_avg_of_max_errors is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.max_avg_of_max_errors if settings.max_avg_of_max_errors is not None else "N/A"}</td>
+            <td class="${'passed' if results.linearity_max_verdict == 'Pass' else 'failed'}">
+            ${results.linearity_max_verdict}</td>
+        </tr>
+        <tr>
+            <td>Average of avg linearity error</td>
+            <td>${"%.3f mm" % results.linearity_avg_of_error_avgs if results.linearity_avg_of_error_avgs is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Maximum of max linearity error</td>
+            <td>${"%.3f mm" % results.linearity_max_of_max_errors if results.linearity_max_of_max_errors is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Total stdev linearity error</td>
+            <td>${"%.3f mm" % results.linearity_total_stdev_error if results.linearity_total_stdev_error is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Total RMS linearity error</td>
+            <td>${"%.3f mm" % results.total_linearity_rms_error if results.total_linearity_rms_error is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.max_rms_error if settings.max_rms_error is not None else "N/A"}</td>
+            <td class="${'passed' if results.linearity_rms_verdict == 'Pass' else 'failed'}">
+            ${results.linearity_rms_verdict}</td>
+        </tr>
+    </table>
+
+    <h3>Jitter results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Average of max moving jitter error</td>
+            <td>${"%.3f mm" % results.moving_jitter_avg_of_max_errors if results.moving_jitter_avg_of_max_errors is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Average of avg moving jitter error</td>
+            <td>${"%.3f mm" % results.moving_jitter_avg_of_error_avgs if results.moving_jitter_avg_of_error_avgs is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Maximum of max moving jitter error</td>
+            <td>${"%.3f mm" % results.moving_jitter_max_of_max_errors if results.moving_jitter_max_of_max_errors is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Total stdev moving jitter error</td>
+            <td>${"%.3f mm" % results.moving_jitter_total_stdev_error if results.moving_jitter_total_stdev_error is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+    </table>
+
+    <h3>Offset results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Average of max offset error</td>
+            <td>${"%.3f mm" % results.offset_avg_of_max_errors if results.offset_avg_of_max_errors is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Average of avg offset error</td>
+            <td>${"%.3f mm" % results.offset_avg_of_error_avgs if results.offset_avg_of_error_avgs is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Maximum of max offset error</td>
+            <td>${"%.3f mm" % results.offset_max_of_max_errors if results.offset_max_of_max_errors is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Total stdev offset error</td>
+            <td>${"%.3f mm" % results.offset_total_stdev_error if results.offset_total_stdev_error is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Total RMS offset error</td>
+            <td>${"%.3f mm" % results.total_offset_rms_error if results.total_offset_rms_error is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+    </table>
+
+    <h3>Reporting rate results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Average of min report rate</td>
+            <td>${"%.3f Hz" % results.avg_of_min_report_rate if results.avg_of_min_report_rate is not None else "N/A"}</td>
+            <td>${"%.3f Hz" % results.report_rate_limit if results.report_rate_limit is not None else "N/A"}</td>
+            <td class="${'passed' if results.report_rate_verdict == 'Pass' else 'failed'}">
+            ${results.report_rate_verdict}</td>
+        </tr>
+        <tr>
+            <td>Average of avg report rate</td>
+            <td>${"%.3f Hz" % results.avg_of_avg_report_rate if results.avg_of_avg_report_rate is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td>Minimum of min report rate</td>
+            <td>${"%.3f Hz" % results.min_of_min_report_rate if results.min_of_min_report_rate is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+
+        <tr>
+            <td>Total stdev of report rate</td>
+            <td>${"%.3f Hz" % results.total_std_report_rate if results.total_std_report_rate is not None else "N/A"}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+    </table>
+
+    <h3>Completeness results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Ghost fingers detected</td>
+            <td>${results.num_of_ghost_fingers} / ${results.swipe_count}</td>
+            <td>${"%s" % results.max_ghost_fingers}</td>
+            <td class="${'passed' if results.ghost_fingers_verdict == 'Pass' else 'failed'}">
+                ${results.ghost_fingers_verdict}</td>
+        </tr>
+        <tr>
+            <td>Broken lines</td>
+            <td>${results.num_of_broken_lines} / ${results.swipe_count}</td>
+            <td>${"%s" % results.max_broken_lines}</td>
+            <td class="${'passed' if results.broken_lines_verdict == 'Pass' else 'failed'}">
+                ${results.broken_lines_verdict}</td>
+        </tr>
+    </table>
+
+    <h3>Validation results (do not affect test case success)</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Missing swipe percentage</td>
+            <td>${"%.1f" % results.missing_swipes_percentage} %</td>
+            <td>${"%.1f" % settings.max_missing_swipes} %</td>
+            <td class="${'passed' if results.missing_swipes_verdict == 'Pass' else 'failed'}">
+                ${results.missing_swipes_verdict}</td>
+        </tr>
+    </table>
+
+    <!-- Preview image -->
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Swipe preview image"/>
+      </a>
+    </div>
+
+      <!-- Preview table -->
+	<div class="dtable no_print">
+		<div class="dtable_row subplot_selector">
+		    <div class="dtable_header narrow_cell">Toggle:
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+        </div>
+    </div>
+
+	<div class="dtable subplot_table">
+		<div class="dtable_header_row">
+			<div class="dtable_header narrow_cell">Swipe ID
+            </div><div class="dtable_header narrow_cell">Max Linearity
+            </div><div class="dtable_header narrow_cell">Max Jitter
+            </div><div class="dtable_header narrow_cell">Max Offset
+            </div><div class="dtable_header">Min report rate
+            </div><div class="dtable_header narrow_cell">Line broken
+            </div><div class="dtable_header narrow_cell">Ghost finger
+            </div><div class="dtable_header narrow_cell">Pass/Fail
+            </div><div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="swipe in results.swipes" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${swipe["id"]}
+            </div><div class="dtable_cell narrow_cell"> ${"%.3f mm" % swipe["max_linearity"] if swipe["max_linearity"] is not None else "N/A"}
+            </div><div class="dtable_cell narrow_cell"> ${"%.3f mm" % swipe["max_jitter"] if swipe["max_jitter"] is not None else "N/A"}
+            </div><div class="dtable_cell narrow_cell"> ${"%.3f mm" % swipe["max_offset"] if swipe["max_offset"] is not None else "N/A"}
+            </div><div class="dtable_cell"> ${"%.3f Hz" % swipe["min_report_rate"] if swipe["min_report_rate"] is not None else "N/A"}
+            </div><div class="dtable_cell narrow_cell"> ${'broken' if results.swipe_additions[swipe["id"]].line_broken else 'not broken'}
+            </div><div class="dtable_cell narrow_cell"> ${'found' if results.swipe_additions[swipe["id"]].ghost_finger_detected else 'not found'}
+            </div><div class="dtable_cell narrow_cell ${'passed' if swipe['verdict']=='Pass' else 'failed'}"> ${swipe["verdict"]}
+            </div><div py:if="not results.swipe_additions[swipe['id']].swipe_empty" class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+            </div><div py:if="not results.swipe_additions[swipe['id']].swipe_empty" class="plot" data-src="${swipe['image_name']}"/>
+		</div>
+
+    </div>
+	</div>
+
diff --git a/TPPTAnalysisSW/templates/test_multifinger_swipe.html b/TPPTAnalysisSW/templates/test_multifinger_swipe.html
new file mode 100644
index 0000000..abc79cd
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_multifinger_swipe.html
@@ -0,0 +1,83 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+    <?python from genshi.builder import tag ?>
+    <?python from genshi.util import flatten ?>
+      <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Max offset:</td>
+            <td>${"%s mm" % results.max_offset if results.max_offset is not None else 'N/A'}</td>
+            <td>${"%s" % settings['maxoffset']} mm</td>
+            <td class="${'' if results.offset_verdict is None else 'passed' if results.offset_verdict else 'failed'}" >
+                 ${"N/A" if results.offset_verdict is None else "Pass" if results.offset_verdict else "Fail"}
+            </td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Max jitter:</td>
+            <td>${"%s mm" % results.max_jitter if results.max_jitter is not None else 'N/A'}</td>
+            <td>${"%s" % settings['maxjitter']} mm</td>
+            <td class="${'' if results.jitter_verdict is None else 'passed' if results.jitter_verdict else 'failed'}" >
+                 ${'N/A' if results.jitter_verdict is None else "Pass" if results.jitter_verdict else "Fail"}
+            </td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Missing swipes:</td>
+            <td>${results.missing_swipes}/${results.total_swipes}</td>
+            <td>${int(settings['maxmissingswipes'])}</td>
+            <td class="${'passed' if results.missing_swipes_verdict else 'failed'}">${"Pass" if results.missing_swipes_verdict else "Fail"}</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Errors:</td>
+            <td>${len(results.errors)}</td>
+            <td>0</td>
+            <td class="${'passed' if results.errors_verdict else 'failed'}">${"Pass" if results.errors_verdict else "Fail"}</td>
+        </tr>
+        <tr py:if="len(results.errors) > 0">
+            <td class="vertical_header_th">Error descriptions:</td>
+            <td colspan="2">${tag(flatten((e,tag.br) for e in sorted(results.errors)))}</td>
+            <td></td>
+        </tr>
+      </table>
+
+      <div py:if="'noimages' not in kwargs" py:for="img in results.images" class="preview">
+        <a href="${img[1]}">
+            <img src="${img[0]}" alt="Preview image"/>
+        </a>
+      </div>
+
+        <!--! Preview table -->
+        <div class="dtable no_print">
+	        <div class="dtable_row">
+		        <div class="dtable_header narrow_cell">Toggle:</div>
+		        <div class="dtable_header narrow_cell"><button class="all_lines_button">All</button></div>
+                <div class="dtable_header narrow_cell"><button class="failed_lines_button">Failed</button></div>
+		        <div class="dtable_header narrow_cell"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+
+	  <div class="dtable subplot_table">
+		<div class="dtable_row">
+			<div class="dtable_header narrow_cell">Swipe</div>
+			<div class="dtable_header narrow_cell"># of Fingers</div>
+			<div class="dtable_header narrow_cell">Errors</div>
+			<div class="dtable_header narrow_cell">Max offset</div>
+			<div class="dtable_header narrow_cell">Max jitter</div>
+			<div class="dtable_header narrow_cell">Pass/Fail</div>
+			<div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="swipe in results.swipes" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${swipe.id}</div>
+			<div class="dtable_cell narrow_cell">${swipe.num_fingers}</div>
+			<div class="dtable_cell narrow_cell">${len(swipe.errors)}</div>
+			<div class="dtable_cell narrow_cell">${swipe.max_offset}</div>
+			<div class="dtable_cell narrow_cell">${swipe.max_jitter}</div>
+			<div class="dtable_cell narrow_cell ${swipe.verdict_class}">${swipe.verdict_text}</div>
+			<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button></div>
+			<div class="plot" data-src="${swipe.image}"/>
+		</div>
+      </div>
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_multifinger_tap.html b/TPPTAnalysisSW/templates/test_multifinger_tap.html
new file mode 100644
index 0000000..8693574
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_multifinger_tap.html
@@ -0,0 +1,93 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+    <?python from genshi.builder import tag ?>
+    <?python from genshi.util import flatten ?>
+      <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" py:if="not results.edge_analysis_done">Max accuracy error:</td>
+            <td class="vertical_header_th" py:if="results.edge_analysis_done">Max center accuracy error:</td>
+            <td>${"%s mm" % results.max_input_offset if results.max_input_offset is not None else 'N/A'}</td>
+            <td>${"%s" % settings['maxposerror']} mm</td>
+            <td class="${'' if results.max_input_offset is None else 'passed' if settings['maxposerror'] >= results.max_input_offset else 'failed'}" >
+                 ${results.max_input_offset_verdict}
+            </td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Max edge accuracy error:</td>
+            <td>${"%s" % results.max_edge_error} mm</td>
+            <td>${"%s" % settings['edgepositioningerror']} mm</td>
+            <td class="${'passed' if settings['edgepositioningerror'] >= results.max_edge_error else 'failed'}" >
+                 ${"Pass" if settings['edgepositioningerror'] >= results.max_edge_error else "Fail"}
+            </td>
+        </tr>
+        <tr py:if="not results.edge_analysis_done">
+            <td class="vertical_header_th">Missing inputs:</td>
+            <td>${results.missing_inputs}/${results.total_points}</td>
+            <td>${int(settings['maxmissing'])}</td>
+            <td class="${'passed' if results.missing_inputs_verdict else 'failed'}">${"Pass" if results.missing_inputs_verdict else "Fail"}</td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Missing center inputs:</td>
+            <td>${results.missing_inputs - results.missing_edge_inputs}/${results.total_points - results.edge_points}</td>
+            <td>${int(settings['maxmissing'])}</td>
+            <td class="${'passed' if results.missing_inputs_verdict else 'failed'}">${"Pass" if results.missing_inputs_verdict else "Fail"}</td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Missing edge inputs:</td>
+            <td>${results.missing_edge_inputs}/${results.edge_points}</td>
+            <td>${int(settings['maxedgemissing'])}</td>
+            <td class="${'passed' if results.missing_edge_inputs_verdict else 'failed'}">${"Pass" if results.missing_edge_inputs_verdict else "Fail"}</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Errors:</td>
+            <td>${len(results.errors)}</td>
+            <td>0</td>
+            <td class="${'passed' if len(results.errors) == 0 else 'failed'}">${"Pass" if len(results.errors) == 0 else "Fail"}</td>
+        </tr>
+        <tr py:if="len(results.errors) > 0">
+            <td class="vertical_header_th">Error descriptions:</td>
+            <td colspan="2">${tag(flatten((e,tag.br) for e in sorted(results.errors)))}</td>
+        </tr>
+      </table>
+
+      <div py:if="'noimages' not in kwargs" py:for="img in results.images" class="preview">
+        <a href="${img[1]}">
+            <img src="${img[0]}" alt="Preview image"/>
+        </a>
+      </div>
+
+        <!--! Preview table -->
+        <div class="dtable no_print">
+	        <div class="dtable_row">
+		        <div class="dtable_header narrow_cell">Toggle:</div>
+		        <div class="dtable_header narrow_cell"><button class="all_lines_button">All</button></div>
+                <div class="dtable_header narrow_cell"><button class="failed_lines_button">Failed</button></div>
+		        <div class="dtable_header narrow_cell"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+
+	  <div class="dtable subplot_table">
+		<div class="dtable_row">
+			<div class="dtable_header narrow_cell">Tap</div>
+			<div class="dtable_header narrow_cell"># of Fingers</div>
+			<div class="dtable_header narrow_cell">Errors</div>
+			<div class="dtable_header">Maximum offset</div>
+			<div class="dtable_header narrow_cell">Pass/Fail</div>
+			<div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="tap in results.taps" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${tap.id}</div>
+			<div class="dtable_cell narrow_cell">${tap.num_fingers}</div>
+			<div class="dtable_cell narrow_cell">${len(tap.errors)}</div>
+			<div class="dtable_cell">${tap.max_input_offset}</div>
+			<div class="dtable_cell narrow_cell ${'' if tap.max_input_offset is None else 'passed' if tap.verdict else 'failed'}">${tap.verdict_text}</div>
+			<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button></div>
+			<div class="plot" data-src="${tap.image}"/>
+		</div>		
+      </div>
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_non_stationary_reporting_rate.html b/TPPTAnalysisSW/templates/test_non_stationary_reporting_rate.html
new file mode 100644
index 0000000..eae9b82
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_non_stationary_reporting_rate.html
@@ -0,0 +1,76 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th class="wide"></th>
+            <th>Value</th>
+            <th>Threshold</th>
+            <th class="Narrow">Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Non Stationary Reporting Rate</td>
+            <td>${"N/A" if slowest_reporting_rate is None else "%s Hz" % slowest_reporting_rate}</td>
+            <td>${"%s" % settings['minreportingrate']} Hz</td>
+            <td class="${'passed' if slowest_reporting_rate is not None and slowest_reporting_rate > settings['minreportingrate'] else 'failed'}" >${"Pass" if slowest_reporting_rate is not None and slowest_reporting_rate > settings['minreportingrate']  else "Fail"}</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Missing lines</td>
+            <td>${missing_lines}</td>
+            <td>0</td>
+            <td class="${'passed' if missing_lines == 0 else 'failed'}" >${"Pass" if missing_lines == 0 else "Fail"}</td>
+        </tr>
+    </table>
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Preview image"/>
+      </a>
+    </div>
+
+	<div class="dtable no_print">
+		<div class="dtable_row subplot_selector">
+		    <div class="dtable_header narrow_cell">Toggle:
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+        </div>
+    </div>
+
+	<div class="dtable subplot_table">
+		<div class="dtable_header_row">
+			<div class="dtable_header narrow_cell">Line ID
+            </div><div class="dtable_header">Max Reporting Rate
+            </div><div class="dtable_header">Min Reporting Rate
+            </div><div class="dtable_header">Avg Reporting Rate
+            </div><div class="dtable_header narrow_cell">Pass/Fail
+            </div><div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="swipe_id, max_reporting_rate, min_reporting_rate, average_reporting_rate, verdict, image_src in detailed_data" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${swipe_id}
+            </div><div class="dtable_cell">${"%s Hz" % max_reporting_rate if max_reporting_rate != None else "N/A"}
+            </div><div class="dtable_cell">${"%s Hz" % min_reporting_rate if min_reporting_rate != None else "N/A"}
+            </div><div class="dtable_cell">${"%s Hz" % average_reporting_rate if average_reporting_rate != None else "N/A"}
+            </div><div class="dtable_cell narrow_cell ${'passed' if min_reporting_rate is not None and min_reporting_rate > settings['minreportingrate'] else 'failed'}">${verdict}
+            </div><div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+            </div><div class="plot" data-src="${image_src}"/>
+		</div>
+    </div>
+<!--!
+		<table class="datatable">
+			<tr>
+				<th class="narrow">Line ID</th>
+				<th>Max Reporting Rate</th>
+				<th>Min Reporting Rate</th>
+				<th class="narrow">Pass/Fail</th>
+			</tr>
+			<tr py:for="">
+				<td>${swipe_id}</td>
+				<td> ${"%.2f Hz" % max_reporting_rate if max_reporting_rate != None else "N/A"}</td>
+				<td> ${"%.2f Hz" % min_reporting_rate if min_reporting_rate != None else "N/A"}</td>
+				<td class="${'passed' if min_reporting_rate > settings['minreportingrate'] else 'failed'}"> ${verdict}</td>
+			</tr>
+
+		</table>
+-->
+		<div class="clear"></div>
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_one_finger_swipe.html b/TPPTAnalysisSW/templates/test_one_finger_swipe.html
new file mode 100644
index 0000000..136e278
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_one_finger_swipe.html
@@ -0,0 +1,81 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+    <h3>Reporting rate and jitter</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Max Error (Linear Fit)</td>
+            <td>${"%.3f mm" % results.max_offset_from_linear_fit if results.max_offset_from_linear_fit is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.maxoffset if settings.maxoffset is not None else "N/A"}</td>
+            <td class="${'passed' if settings.maxoffset >= results.max_offset_from_linear_fit else 'failed'}">
+            ${"Pass" if settings.maxoffset >= results.max_offset_from_linear_fit else "Fail"}</td>
+        </tr>
+        <tr>
+            <td>Mean of Max Errors</td>
+            <td>${"%.3f mm" % results.avg_of_offsets_from_linear_fit if results.avg_of_offsets_from_linear_fit is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.maxoffset if settings.maxoffset is not None else "N/A"}</td>
+            <td class="${'passed' if results.avg_of_offsets_from_linear_fit is not None and settings.maxoffset >= results.avg_of_offsets_from_linear_fit else 'failed'}">
+            ${"Pass" if results.avg_of_offsets_from_linear_fit is not None and settings.maxoffset >= results.avg_of_offsets_from_linear_fit else "Fail"}</td>
+        </tr>
+        <tr>
+            <td>Digitizer Jitter</td>
+            <td>${"%s mm" % results.max_jitter if results.max_jitter is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.maxjitter if settings.maxjitter is not None else "N/A"}</td>
+            <td class="${'passed' if results.jitter_verdict =='Pass' else 'failed'}">$results.jitter_verdict</td>
+        </tr>
+        <tr>
+            <td>Digitizer Offset</td>
+            <td>${"%s mm" % results.max_offset if results.max_offset is not None else "N/A"}</td>
+            <td>${"%.3f mm" % settings.maxoffset if settings.maxoffset is not None else "N/A"}</td>
+            <td class="${'passed' if results.offset_verdict =='Pass' else 'failed'}">$results.offset_verdict</td>
+        </tr>
+        <tr>
+            <td>Missing swipes</td>
+            <td>${results.missing_count}/${results.swipe_count}</td>
+            <td>${"%d" % settings.maxmissingswipes}</td>
+            <td class="${'passed' if settings.maxmissingswipes >= results.missing_count else 'failed'}">${"Pass" if settings.maxmissingswipes >= results.missing_count else "Fail"}</td>
+        </tr>
+    </table>
+    
+    <!-- Preview image -->
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Swipe preview image"/>
+      </a>
+    </div>
+
+      <!-- Preview table -->
+	<div class="dtable no_print">
+		<div class="dtable_row subplot_selector">
+		    <div class="dtable_header narrow_cell">Toggle:
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+        </div>
+    </div>
+
+	<div class="dtable subplot_table">
+		<div class="dtable_header_row">
+			<div class="dtable_header narrow_cell">Swipe ID
+            </div><div class="dtable_header narrow_cell">Max Jitter
+            </div><div class="dtable_header narrow_cell">Max Offset
+            </div><div class="dtable_header narrow_cell">Pass/Fail
+            </div><div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="swipe in results.swipes" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${swipe[0]}
+            </div><div class="dtable_cell narrow_cell"> ${"%s mm" % swipe[1] if swipe[1] is not None else "N/A"}
+            </div><div class="dtable_cell narrow_cell"> ${"%s mm" % swipe[2] if swipe[2] is not None else "N/A"}
+            </div><div class="dtable_cell narrow_cell ${'passed' if swipe[3]=='Pass' else 'failed'}"> ${swipe[3]}
+            </div><div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+            </div><div class="plot" data-src="${swipe[4]}"/>
+		</div>		
+
+    </div>
+	</div>
+
diff --git a/TPPTAnalysisSW/templates/test_one_finger_tap.html b/TPPTAnalysisSW/templates/test_one_finger_tap.html
new file mode 100644
index 0000000..73a7ec8
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_one_finger_tap.html
@@ -0,0 +1,53 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th" py:if="not results.edge_analysis_done">Max accuracy error:</td>
+            <td class="vertical_header_th" py:if="results.edge_analysis_done">Max center accuracy error:</td>
+            <td>${"%s" % results.max_input_error} mm</td>
+            <td>${"%s" % settings['maxposerror']} mm</td>
+            <td class="${'passed' if settings['maxposerror'] >= results.max_input_error else 'failed'}" >
+                 ${"Pass" if settings['maxposerror'] >= results.max_input_error else "Fail"}
+            </td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Max edge accuracy error:</td>
+            <td>${"%s" % results.max_edge_error} mm</td>
+            <td>${"%s" % settings['edgepositioningerror']} mm</td>
+            <td class="${'passed' if settings['edgepositioningerror'] >= results.max_edge_error else 'failed'}" >
+                 ${"Pass" if settings['edgepositioningerror'] >= results.max_edge_error else "Fail"}
+            </td>
+        </tr>
+        <tr py:if="not results.edge_analysis_done">
+            <td class="vertical_header_th">Missing inputs:</td>
+            <td>${results.missing_inputs}/${results.total_points}</td>
+            <td>${int(settings['maxmissing'])}</td>
+            <td class="${'passed' if results.missing_inputs_verdict else 'failed'}">${"Pass" if results.missing_inputs_verdict else "Fail"}</td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Missing center inputs:</td>
+            <td>${results.missing_inputs - results.missing_edge_inputs}/${results.total_points - results.edge_points}</td>
+            <td>${int(settings['maxmissing'])}</td>
+            <td class="${'passed' if results.missing_inputs_verdict else 'failed'}">${"Pass" if results.missing_inputs_verdict else "Fail"}</td>
+        </tr>
+        <tr py:if="results.edge_analysis_done">
+            <td class="vertical_header_th">Missing edge inputs:</td>
+            <td>${results.missing_edge_inputs}/${results.edge_points}</td>
+            <td>${int(settings['maxedgemissing'])}</td>
+            <td class="${'passed' if results.missing_edge_inputs_verdict else 'failed'}">${"Pass" if results.missing_edge_inputs_verdict else "Fail"}</td>
+        </tr>
+    </table>
+
+    <div py:if="'noimages' not in kwargs" py:for="img in results.images" class="preview">
+        <a href="${img[1]}">
+            <img src="${img[0]}" alt="Preview image"/>
+        </a>
+    </div>
+
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_repeatability.html b/TPPTAnalysisSW/templates/test_repeatability.html
new file mode 100644
index 0000000..5e9f442
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_repeatability.html
@@ -0,0 +1,59 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Repeatability error X</td>
+            <td>${"%s" % max_x_repeatability_error} mm</td>
+            <td>${"%s" % settings['maxrepeaterror']} mm</td>
+            <td class="${'passed' if verdict_x=='Pass' else 'failed'}">$verdict_x</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Repeatability error Y</td>
+            <td>${"%s" % max_y_repeatability_error} mm</td>
+            <td>${"%s" % settings['maxrepeaterror']} mm</td>
+            <td class="${'passed' if verdict_y=='Pass' else 'failed'}">$verdict_y</td>
+        </tr>
+    </table>
+
+    <!-- Preview image -->
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Preview image"/>
+      </a>
+    </div>
+
+        <!--! Preview table -->
+		<div class="dtable no_print">
+			<div class="dtable_row subplot_selector">
+		        <div class="dtable_header narrow_cell">Toggle:
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+
+		<div class="subplot_table dtable">
+			<div class="dtable_header_row">
+				<div class="dtable_header narrow_cell">Point ID
+                </div><div class="dtable_header narrow_cell">X
+                </div><div class="dtable_header narrow_cell">Y
+                </div><div class="dtable_header narrow_cell">Pass/Fail
+                </div><div class="dtable_header no_print">Detailed plot</div>
+			</div>
+			<div py:for="point_nbr, x_results, y_results, verdict, point_id in repeatability_errors" class="dtable_row plot_header">
+				<div class="dtable_cell narrow_cell">${point_nbr}
+                </div><div class="dtable_cell narrow_cell"> ${"%s mm" % x_results}
+                </div><div class="dtable_cell narrow_cell"> ${"%s mm" % y_results}
+                </div><div class="dtable_cell narrow_cell ${'passed' if verdict=='Pass' else 'failed'}"> ${verdict}
+                </div><div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                </div><div class="plot" data-src="${pointPlots[point_nbr]}"/>
+			</div>
+
+		</div>
+     </div>
diff --git a/TPPTAnalysisSW/templates/test_separation.html b/TPPTAnalysisSW/templates/test_separation.html
new file mode 100644
index 0000000..3bcb132
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_separation.html
@@ -0,0 +1,56 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+    <?python from genshi.builder import tag ?>
+    <?python from genshi.util import flatten ?>
+      <table class="datatable test_verdicts">
+        <tr>
+            <th></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr py:for="angle, values in results.angles.items()">
+            <td class="vertical_header_th">Separation distance (${angle}&deg;):</td>
+            <td>${"%s" % values.separation} mm</td>
+            <td>${"%s" % values.maxseparation} mm</td>
+            <td class="${'passed' if values.verdict else 'failed'}" >
+                 ${"Pass" if values.verdict else "Fail"}
+            </td>
+        </tr>
+      </table>
+
+      <py:if test="'noimages' not in kwargs">
+      <py:for each="figure in figures">
+        <img class="preview" src="${figure}" alt="Preview image"/>
+      </py:for>
+      </py:if>
+
+        <!--! Preview table -->
+        <div class="dtable no_print">
+	        <div class="dtable_row">
+		        <div class="dtable_header narrow_cell">Toggle:</div>
+		        <div class="dtable_header narrow_cell"><button class="all_lines_button">All</button></div>
+                <div class="dtable_header narrow_cell"><button class="failed_lines_button">Failed</button></div>
+		        <div class="dtable_header narrow_cell"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+
+	  <div class="dtable subplot_table">
+		<div class="dtable_row">
+			<div class="dtable_header">Angle</div>
+			<div class="dtable_header">Separation</div>
+			<div class="dtable_header">Pass/Fail</div>
+			<div class="dtable_header no_print">Detailed plot</div>
+		</div>
+        <py:for each="angle_id in results.angle_ids">
+		<div py:for="distance_id in results.angles[angle_id].distance_ids" class="dtable_row plot_header">
+			<div class="dtable_cell">${angle_id}</div>
+			<div class="dtable_cell">${distance_id}</div>
+			<div class="dtable_cell ${'passed' if results.angles[angle_id].distances[distance_id].verdict else 'failed'}">
+                 ${results.angles[angle_id].distances[distance_id].verdict_text}
+            </div>
+			<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button></div>
+			<div class="plot" data-src="${results.angles[angle_id].distances[distance_id].image}"/>
+		</div>		
+        </py:for>
+      </div>
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_session_report.html b/TPPTAnalysisSW/templates/test_session_report.html
new file mode 100644
index 0000000..5cc7d77
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_session_report.html
@@ -0,0 +1,530 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <h2>Summary of the tests</h2>
+
+    <div py:for="summary in summaries">
+        <table class="datatable test_verdicts">
+            <tr>
+                <th>Id</th>
+                <th>Type</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr>
+                <td>${summary.id}</td>
+                <td>${summary.type}</td>
+                <td class="${'passed' if summary.verdict == 'Pass' else 'failed' if summary.verdict == 'Fail' else ''}">${summary.verdict}</td>
+            </tr>
+        </table>
+
+    </div>
+
+    <div py:for="results in all_results">
+
+           <!--! Display test and session parameters -->
+    <h1 class="test_title">${"%s #%s" % (results[0].test_type_name, results[1].test_id)}</h1>
+    <h2 class="test_title">${results[1].dut['manufacturer']} ${results[1].dut['program']} ${results[1].dut['sample_id']} ${results[1].test_item['finger_type']}
+        <span class="no_summary">${results[1].testsession['operator']} ${results[1].test_item['starttime']}, test session ID: ${results[1].testsession['id']}</span>
+    </h2>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr>
+                <td class="vertical_header_th">Ghost touches:</td>
+                <td>${results[0].ghost_touches_and_events.max_ghost_touch_count}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].ghost_touches_and_events.max_ghost_touch_count == 0 else 'failed'}" >
+                     ${"Pass" if results[0].ghost_touches_and_events.max_ghost_touch_count == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Must have</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr>
+                <td class="vertical_header_th">Touchup events:</td>
+                <td>${results[0].ghost_touches_and_events.ups}</td>
+                <td>${results[0].max_events}</td>
+                <td class="${'passed' if results[0].max_events == results[0].ghost_touches_and_events.ups else 'failed'}" >
+                     ${"Pass" if results[0].max_events == results[0].ghost_touches_and_events.ups else "Fail"}
+                </td>
+            </tr>
+            <tr>
+                <td class="vertical_header_th">Touchdown events:</td>
+                <td>${results[0].ghost_touches_and_events.downs}</td>
+                <td>${results[0].max_events}</td>
+                <td class="${'passed' if results[0].max_events == results[0].ghost_touches_and_events.downs else 'failed'}" >
+                     ${"Pass" if results[0].max_events == results[0].ghost_touches_and_events.downs else "Fail"}
+                </td>
+            </tr>
+        </table>
+        
+        <h3>Swipe Latency</h3>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr py:if="'swipe_accuracy' in results[0]">
+                <td class="vertical_header_th">Failed lines</td>
+                <td>${results[0].swipe_accuracy.failed_paths} / ${results[0].swipe_accuracy.failed_paths + results[0].swipe_accuracy.passed_paths}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].swipe_accuracy.failed_paths == 0 else 'failed'}" >
+                     ${"Pass" if results[0].swipe_accuracy.failed_paths == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'swipe_accuracy' in results[0]">
+                <td class="vertical_header_th">Max swipe latency (AKA mcg test) error:</td>
+                <td>${"%s" % results[0].swipe_accuracy.max_input_error} mm</td>
+                <td>${"%s" % results[1].settings['swipeerror']} mm</td>
+                <td class="${'passed' if results[1].settings['swipeerror'] >= results[0].swipe_accuracy.max_input_error else 'failed'}" >
+                     ${"Pass" if results[1].settings['swipeerror'] >= results[0].swipe_accuracy.max_input_error else "Fail"}
+                </td>
+            </tr>
+        </table>
+
+        <h3>Path Accuracy</h3>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr py:if="'path_accuracy' in results[0]">
+                <td class="vertical_header_th">Failed lines</td>
+                <td>${results[0].path_accuracy.failed_paths} / ${results[0].path_accuracy.failed_paths + results[0].path_accuracy.passed_paths}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].path_accuracy.failed_paths == 0 else 'failed'}" >
+                     ${"Pass" if results[0].path_accuracy.failed_paths == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'path_accuracy' in results[0]">
+                <td class="vertical_header_th">Max path accuracy error:</td>
+                <td>${"%s" % results[0].path_accuracy.max_input_error} mm</td>
+                <td>${"%s" % results[1].settings['maxpathinputerror']} mm</td>
+                <td class="${'passed' if results[1].settings['maxposerror'] >= results[0].path_accuracy.max_input_error else 'failed'}" >
+                     ${"Pass" if results[1].settings['maxposerror'] >= results[0].path_accuracy.max_input_error else "Fail"}
+                </td>
+            </tr>
+        </table>
+
+        <h3>Path Length</h3>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr py:if="'path_length_comparison' in results[0]">
+                <td class="vertical_header_th">Failed lines</td>
+                <td>${results[0].path_length_comparison.failed_paths} / ${results[0].path_length_comparison.failed_paths + results[0].path_length_comparison.passed_paths}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].path_length_comparison.failed_paths == 0 else 'failed'}" >
+                     ${"Pass" if results[0].path_length_comparison.failed_paths == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'path_length_comparison' in results[0]">
+                <td class="vertical_header_th">Max path length error:</td>
+                <td>${"%s" % results[0].path_length_comparison.max_panel_length_error} mm</td>
+                <td>± ${"%s" % results[1].settings['maxlengtherror']} mm</td>
+                <td class="${'passed' if results[0].path_length_comparison.verdict else 'failed'}" >
+                     ${"Pass" if results[0].path_length_comparison.verdict else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'path_length_comparison' in results[0]">
+                <td class="vertical_header_th">Max path length error (%):</td>
+                <td>${"%s" % results[0].path_length_comparison.max_panel_percentage_length_error} %</td>
+                <td>${"%s" % results[1].settings['maxpercentagelengtherror']} %</td>
+                <td class="${'passed' if results[1].settings['maxpercentagelengtherror'] > results[0].path_length_comparison.max_panel_percentage_length_error else 'failed'}" >
+                     ${"Pass" if results[1].settings['maxpercentagelengtherror'] > results[0].path_length_comparison.max_panel_percentage_length_error else "Fail"}
+                </td>
+            </tr>
+        </table>
+
+        <h3>Curved Path Linearity</h3>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                <td class="vertical_header_th">Failed lines</td>
+                <td>${results[0].curved_path_linearity.failed_paths} / ${results[0].curved_path_linearity.failed_paths + results[0].curved_path_linearity.passed_paths}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].curved_path_linearity.failed_paths == 0 else 'failed'}" >
+                     ${"Pass" if results[0].curved_path_linearity.failed_paths == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                <td class="vertical_header_th">Max linearity error:</td>
+                <td>${"%s" % results[0].curved_path_linearity.max_input_error} mm</td>
+                <td>${"%s" % results[1].settings['maxpathinputerror']} mm</td>
+                <td class="${'passed' if results[1].settings['maxposerror'] >= results[0].curved_path_linearity.max_input_error else 'failed'}" >
+                     ${"Pass" if results[1].settings['maxposerror'] >= results[0].curved_path_linearity.max_input_error else "Fail"}
+                </td>
+            </tr>
+            <!--span py:if="results[0].device_level == False">
+                <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                    <td class="vertical_header_th">Max latency:</td>
+                    <td>${"%s" % results[0].curved_path_linearity.max_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.max_latency else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.max_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                    <td class="vertical_header_th">Min latency:</td>
+                    <td>${"%s" % results[0].curved_path_linearity.min_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.min_latency else 'failed'}" >
+                        ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.min_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                    <td class="vertical_header_th">Average latency:</td>
+                    <td>${"%s" % results[0].curved_path_linearity.average_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.average_latency else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.average_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+                    <td class="vertical_header_th">Median latency:</td>
+                    <td>${"%s" % results[0].curved_path_linearity.median_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.median_latency else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.median_latency) else "Fail"}
+                    </td>
+                </tr>
+            </span-->
+
+        </table>
+
+            <h3>Proximity of Reported Positions to Robot Position</h3>
+
+        <table class="datatable test_verdicts">
+            <tr>
+                <th></th>
+                <th>Value</th>
+                <th>Maximum allowed</th>
+                <th>Pass/Fail</th>
+            </tr>
+            <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                <td class="vertical_header_th">Failed lines</td>
+                <td>${results[0].reported_pos_proximity_to_robot_pos.failed_paths} / ${results[0].reported_pos_proximity_to_robot_pos.failed_paths + results[0].reported_pos_proximity_to_robot_pos.passed_paths}</td>
+                <td>0</td>
+                <td class="${'passed' if results[0].reported_pos_proximity_to_robot_pos.failed_paths == 0 else 'failed'}" >
+                     ${"Pass" if results[0].reported_pos_proximity_to_robot_pos.failed_paths == 0 else "Fail"}
+                </td>
+            </tr>
+            <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                <td class="vertical_header_th">Max offset error:</td>
+                <td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.max_input_error} mm</td>
+                <td>${"%s" % results[1].settings['maxoffseterror']} mm</td>
+                <td class="${'passed' if results[1].settings['maxoffseterror'] >= results[0].reported_pos_proximity_to_robot_pos.max_input_error else 'failed'}" >
+                     ${"Pass" if results[1].settings['maxoffseterror'] >= results[0].reported_pos_proximity_to_robot_pos.max_input_error else "Fail"}
+                </td>
+            </tr>
+            <!--span py:if="results[0].device_level == False">
+                <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                    <td class="vertical_header_th">Max latency:</td>
+                    <td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.max_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.max_latency) else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.max_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                    <td class="vertical_header_th">Min latency:</td>
+                    <td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.min_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.min_latency) else 'failed'}" >
+                        ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.min_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                    <td class="vertical_header_th">Average latency:</td>
+                    <td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.average_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.average_latency) else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.average_latency) else "Fail"}
+                    </td>
+                </tr>
+                <tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+                    <td class="vertical_header_th">Median latency:</td>
+                    <td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.median_latency} ms</td>
+                    <td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
+                    <td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.median_latency) else 'failed'}" >
+                         ${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.median_latency) else "Fail"}
+                    </td>
+                </tr>
+            </span-->
+
+        </table>
+
+        <!-- Preview images -->
+        <span py:if="'swipe_accuracy' in results[0]">
+          <div py:for="img in results[0].swipe_accuracy.images" class="preview">
+           <a href="${img[1]}">
+                <img src="${img[0]}" alt="Preview image"/>
+            </a>
+          </div>
+        </span>
+    
+        <span py:if="'path_accuracy' in results[0]">
+          <div py:for="img in results[0].path_accuracy.images" class="preview">
+            <a href="${img[1]}">
+                <img src="${img[0]}" alt="Preview image"/>
+            </a>
+          </div>
+        </span>
+
+        <span py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+          <div py:for="img in results[0].curved_path_linearity.images" class="preview">
+            <a href="${img[1]}">
+                <img src="${img[0]}" alt="Preview image"/>
+            </a>
+          </div>
+        </span>
+
+        <span py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+          <div py:for="img in results[0].reported_pos_proximity_to_robot_pos.images" class="preview">
+            <a href="${img[1]}">
+                <img src="${img[0]}" alt="Preview image"/>
+            </a>
+          </div>
+        </span>
+        
+        <h2>Path Accuracy Analysis</h2>
+            <div py:if="'swipe_accuracy' in results[0]">
+
+                <div class="dtable no_print">
+                    <div class="dtable_row subplot_selector">
+                        <div class="dtable_header narrow_cell">Toggle:
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+                    </div>
+                </div>
+
+                <div class="dtable subplot_table">
+                    <div class="dtable_header_row">
+                        <div class="dtable_header">Path ID
+                        </div><div class="dtable_header">Max input error
+                        </div><div class="dtable_header">Pass/Fail
+                        </div><div class="dtable_header no_print">Detailed plot</div>
+                    </div>
+                    <div py:for="id, path in results[0].swipe_accuracy.paths.items()" class="dtable_row plot_header">
+                        <div class="dtable_cell">${id}
+                        </div>
+                        <div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
+                        </div>
+                        <div class="dtable_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
+                        </div>
+                        <div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                        </div>
+
+                        <div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
+                        <div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
+                        <div class="plot" onclick="location.href='${path.images[5]}';" style="cursor: pointer" data-src="${path.images[4]}"/>
+
+                        </div>
+                </div>
+
+            </div>
+
+            <h2>Path Accuracy Analysis</h2>
+            <div py:if="'path_accuracy' in results[0]">
+
+                <div class="dtable no_print">
+                    <div class="dtable_row subplot_selector">
+                        <div class="dtable_header narrow_cell">Toggle:
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+                    </div>
+                </div>
+
+                <div class="dtable subplot_table">
+                    <div class="dtable_header_row">
+                        <div class="dtable_header">Path ID
+                        </div><div class="dtable_header">Max input error
+                        </div><div class="dtable_header">Pass/Fail
+                        </div><div class="dtable_header no_print">Detailed plot</div>
+                    </div>
+                    <div py:for="id, path in results[0].path_accuracy.paths.items()" class="dtable_row plot_header">
+                        <div class="dtable_cell">${id}
+                        </div>
+                        <div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
+                        </div>
+                        <div class="dtable_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
+                        </div>
+                        <div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                        </div>
+
+                        <div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
+                        <div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
+                        <div class="plot" onclick="location.href='${path.images[5]}';" style="cursor: pointer" data-src="${path.images[4]}"/>
+
+                        </div>
+                </div>
+
+            </div>
+
+            <br />
+
+            <h2>Path Length Analysis</h2>
+            <div py:if="'path_length_comparison' in results[0]">
+
+                <div class="dtable no_print">
+                    <div class="dtable_row subplot_selector">
+                        <div class="dtable_header narrow_cell">Toggle:
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+                    </div>
+                </div>
+
+                <div class="dtable subplot_table">
+                    <div class="dtable_header_row">
+                        <div class="dtable_header narrow_cell">Path ID
+                        </div><div class="dtable_header">Length error
+                        </div><div class="dtable_header">Length error (%)
+                        </div><div class="dtable_header narrow_cell">Pass/Fail
+                        </div><div class="dtable_header no_print">Detailed plot</div>
+                    </div>
+                    <div py:for="id, path in results[0].path_length_comparison.paths.items()" class="dtable_row plot_header">
+                        <div class="dtable_cell narrow_cell">${id}
+                        </div>
+                        <div class="dtable_cell"> ${"%s mm" % path.error if path.error is not None else "N/A"}
+                        </div>
+                        <div class="dtable_cell"> ${"%s " % path.percentage_error if path.percentage_error is not None else "N/A"} %
+                        </div>
+                        <div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
+                        </div>
+                        <div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                        </div>
+                        <div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
+
+                        </div>
+
+                </div>
+
+            </div>
+
+            <br />
+
+                <h2>Curved Path Linearity Analysis</h2>
+            <div py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
+
+                <div class="dtable no_print">
+                    <div class="dtable_row subplot_selector">
+                        <div class="dtable_header narrow_cell">Toggle:
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+                    </div>
+                </div>
+
+                <div class="dtable subplot_table">
+                    <div class="dtable_header_row">
+                        <div class="dtable_header narrow_cell">Path ID
+                        </div><div class="dtable_header">Max input error
+                        </div>
+                        <span py:if="results[0].device_level == False">
+                            <div class="dtable_header">Median latency</div>
+                        </span>
+                        <div class="dtable_header narrow_cell">Pass/Fail
+                        </div><div class="dtable_header no_print">Detailed plot</div>
+                    </div>
+                    <div py:for="id, path in results[0].curved_path_linearity.paths.items()" class="dtable_row plot_header">
+                        <div class="dtable_cell narrow_cell">${id}
+                        </div>
+                        <div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
+                        </div>
+                        <span py:if="results[0].device_level == False">
+                            <div class="dtable_cell"> ${path.median_latency} ms</div>
+                        </span>
+                        <div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
+                        </div>
+                        <div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                        </div>
+
+                        <div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
+                        <div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
+
+                        </div>
+
+                </div>
+
+            </div>
+
+            <br />
+
+            <h2>Proximity of Reported Positions to Robot Position</h2>
+            <div py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
+
+                <div class="dtable no_print">
+                    <div class="dtable_row subplot_selector">
+                        <div class="dtable_header narrow_cell">Toggle:
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                        </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+                    </div>
+                </div>
+
+                <div class="dtable subplot_table">
+                    <div class="dtable_header_row">
+                        <div class="dtable_header narrow_cell">Path ID
+                        </div><div class="dtable_header">Max offset error
+                        </div>
+                        <span py:if="results[0].device_level == False">
+                            <div class="dtable_header">Median latency</div>
+                        </span>
+                        <div class="dtable_header narrow_cell">Pass/Fail
+                        </div><div class="dtable_header no_print">Detailed plot</div>
+                    </div>
+                    <div py:for="id, path in results[0].reported_pos_proximity_to_robot_pos.paths.items()" class="dtable_row plot_header">
+                        <div class="dtable_cell narrow_cell">${id}
+                        </div>
+                        <div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
+                        </div>
+                        <span py:if="results[0].device_level == False">
+                            <div class="dtable_cell"> ${path.median_latency} ms</div>
+                        </span>
+                        <div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
+                        </div>
+                        <div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                        </div>
+
+                        <div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
+
+                        </div>
+
+                </div>
+
+            </div>
+            <br />
+            <br />
+        </div>
+
+
+    <div class='row'><hr style="width: 100%; color: black; height: 4px; background-color:black;" /></div>
+
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_session_report_common.html b/TPPTAnalysisSW/templates/test_session_report_common.html
new file mode 100644
index 0000000..f160915
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_session_report_common.html
@@ -0,0 +1,44 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>${test_type_name}</title>
+    <script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"></script>
+    <script type="text/javascript" src="/static/script/test_page.js"></script>
+    <py:if test="defined('test_script')">
+        <script type="text/javascript" src="/static/script/${test_script}"></script>
+    </py:if>
+
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+    <link rel="stylesheet" type="text/css" href="/static/graph.css" />
+    <link rel="stylesheet" type="text/css" media="print" href="/static/reportstyle_print.css" />
+  </head>
+  <body>
+    <div class="report">
+    <div id="Main" class="content" style="display: block; visibility: visible;">
+
+    <!--! Common header: logo, version, back & print buttons -->
+    <div class="no_summary">
+        <a href="/"><img src="/static/img/logo.jpg"/></a>
+        <p class="version">Analysis software version ${version.simple}</p>
+
+    <span class="no_print">
+        <a href="/">
+            <button class="btn btn-primary">Analysis Home</button>
+        </a>
+    </span>
+
+    <button class="no_print btn btn-info" id="print_button">
+        <span class="glyphicon glyphicon-print"></span> Print
+    </button>
+
+    </div>
+
+    <!--! Actual content of the report -->
+    <xi:include href="templates/$test_page" />
+
+    </div></div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_stationary_jitter.html b/TPPTAnalysisSW/templates/test_stationary_jitter.html
new file mode 100644
index 0000000..66c6907
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_stationary_jitter.html
@@ -0,0 +1,51 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th class="wide"></th>
+            <th>Jitter</th>
+            <th>Maximum allowed</th>
+            <th class="Narrow">Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Max Jitter</td>
+            <td>${"N/A" if results.max_jitter is None else "%s mm" % results.max_jitter}</td>
+            <td>${"%s" % settings['maxstationaryjitter']} mm</td>
+            <td class="${'passed' if results.verdict == 'Pass' else 'failed'}" >${results.verdict}</td>
+        </tr>
+    </table>
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Preview image"/>
+      </a>
+    </div>
+
+        <!--! Preview table -->
+		<div class="dtable no_print">
+			<div class="dtable_row subplot_selector">
+		        <div class="dtable_header narrow_cell">Toggle:
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+		<div class="dtable subplot_table">
+			<div class="dtable_header_row">
+				<div class="dtable_header narrow_cell">Point ID
+                </div><div class="dtable_header narrow_cell">Jitter
+                </div><div class="dtable_header">Maximum allowed
+                </div><div class="dtable_header narrow_cell">Pass/Fail
+                </div><div class="dtable_header no_print">Detailed plot</div>
+			</div>
+			<div py:for="point in results.points" class="dtable_row plot_header">
+				<div class="dtable_cell narrow_cell">${point[0]}
+                </div><div class="dtable_cell narrow_cell"> ${"%s mm" % point[1] if point[1] is not None else "N/A"}
+                </div><div class="dtable_cell"> ${"%s" % settings['maxstationaryjitter']} mm
+                </div><div class="dtable_cell narrow_cell ${'passed' if point[2]=='Pass' else 'failed'}"> ${point[2]}
+                </div><div py:if="point[3] is not None" class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                </div><div py:if="point[3] is not None" class="plot" data-src="${point[3]}"/>
+			</div>
+        </div>
+
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_stationary_jitter_static_noise.html b/TPPTAnalysisSW/templates/test_stationary_jitter_static_noise.html
new file mode 100644
index 0000000..7662b4f
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_stationary_jitter_static_noise.html
@@ -0,0 +1,80 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+
+        <h1>Verdicts</h1>
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th class="wide"></th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th class="Narrow">Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average Max Jitter</td>
+            <td>${"N/A" if results.avg_max_jitter is None else "%.3f mm" % results.avg_max_jitter}</td>
+            <td>${"%.3f" % settings['maxstationaryjitter'] if results.noise_status == "" else settings['maxstationaryjitter_with_noise']} mm</td>
+            <td class="${'passed' if results.verdict == 'Pass' else 'failed'}" >${results.verdict}</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average Mean Jitter</td>
+            <td>${"N/A" if results.avg_mean_jitter is None else "%.3f mm" % results.avg_mean_jitter}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Total Standard Deviation Jitter</td>
+            <td>${"N/A" if results.total_stdev_jitter is None else "%.3f mm" % results.total_stdev_jitter}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Maximum of Maximum Jitter</td>
+            <td>${"N/A" if results.max_max_jitter is None else "%.3f mm" % results.max_max_jitter}</td>
+            <td>-</td>
+            <td>-</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Missing inputs:</td>
+            <td>${"%.1f" % results.missing_points_percentage} %</td>
+            <td>${"%.1f" % settings['jitter_missing_points']} %</td>
+            <td class="${'passed' if results.missing_inputs_verdict == 'Pass' else 'failed'}">${"Pass" if results.missing_inputs_verdict == "Pass" else "Fail"}</td>
+        </tr>
+    </table>
+
+        <h1>Details</h1>
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+      <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Preview image"/>
+      </a>
+    </div>
+
+        <!--! Preview table -->
+		<div class="dtable no_print">
+			<div class="dtable_row subplot_selector">
+		        <div class="dtable_header narrow_cell">Toggle:
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+                </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+            </div>
+        </div>
+		<div class="dtable subplot_table">
+			<div class="dtable_header_row">
+				<div class="dtable_header narrow_cell">Point ID
+                </div><div class="dtable_header narrow_cell">Max Jitter
+                </div><div class="dtable_header">Maximum allowed
+                </div><div class="dtable_header narrow_cell">Pass/Fail
+                </div><div class="dtable_header no_print">Detailed plot</div>
+			</div>
+			<div py:for="point in results.points" class="dtable_row plot_header">
+				<div class="dtable_cell narrow_cell">${point[0]}
+                </div><div class="dtable_cell narrow_cell"> ${"%.3f mm" % point[1] if point[1] is not None else "N/A"}
+                </div><div class="dtable_cell"> ${"%.3f" % settings['maxstationaryjitter'] if results.noise_status == "" else settings['maxstationaryjitter_with_noise']} mm
+                </div><div class="dtable_cell narrow_cell ${'passed' if point[2]=='Pass' else 'failed'}"> ${point[2]}
+                </div><div py:if="point[3] is not None" class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+                </div><div py:if="point[3] is not None" class="plot" data-src="${point[3]}"/>
+			</div>
+        </div>
+
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_stationary_reporting_rate.html b/TPPTAnalysisSW/templates/test_stationary_reporting_rate.html
new file mode 100644
index 0000000..446a601
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_stationary_reporting_rate.html
@@ -0,0 +1,54 @@
+    <div xmlns:py="http://genshi.edgewall.org/">
+
+    <table class="datatable test_verdicts">
+        <tr>
+            <th class="wide"></th>
+            <th>Min Reporting Rate</th>
+            <th>Minimum allowed</th>
+            <th class="Narrow">Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Stationary Reporting Rate</td>
+            <td>${"N/A" if slowest_reporting_rate is None else "%s Hz" % slowest_reporting_rate}</td>
+            <td>${"%s" % settings['minreportingrate']} Hz</td>
+            <td class="${'passed' if slowest_reporting_rate is not None and slowest_reporting_rate > settings['minreportingrate'] else 'failed'}" >${"Pass" if slowest_reporting_rate is not None and slowest_reporting_rate > settings['minreportingrate']  else "Fail"}</td>
+        </tr>
+    </table>
+
+    <div py:if="'noimages' not in kwargs" class="preview">
+    <a href="${detailed_figure}">
+        <img src="${figure}" width="800" height="600" alt="Preview image"/>
+    </a>
+    </div>
+
+	<div class="dtable no_print">
+		<div class="dtable_row subplot_selector">
+		    <div class="dtable_header narrow_cell">Toggle:
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
+            </div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
+        </div>
+    </div>
+
+	<div class="dtable subplot_table">
+		<div class="dtable_header_row">
+			<div class="dtable_header narrow_cell">Point ID
+            </div><div class="dtable_header">Max Reporting Rate
+            </div><div class="dtable_header">Min Reporting Rate
+            </div><div class="dtable_header">Avg Reporting Rate
+            </div><div class="dtable_header narrow_cell">Pass/Fail
+            </div><div class="dtable_header no_print">Detailed plot</div>
+		</div>
+		<div py:for="point in detailed_data" class="dtable_row plot_header">
+			<div class="dtable_cell narrow_cell">${point[0]}
+            </div><div class="dtable_cell">${"%s Hz" % point[1] if point[1] != None else "N/A"}
+            </div><div class="dtable_cell">${"%s Hz" % point[2] if point[2] != None else "N/A"}
+            </div><div class="dtable_cell">${"%s Hz" % point[3] if point[3] != None else "N/A"}
+            </div><div class="dtable_cell narrow_cell ${'passed' if point[4] == 'Pass' else 'failed'}">${point[4]}
+            </div><div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
+            </div><div class="plot" data-src="${point[5]}"/>
+		</div>
+    </div>
+
+    <div class="clear"></div>
+    </div>
diff --git a/TPPTAnalysisSW/templates/test_summary.html b/TPPTAnalysisSW/templates/test_summary.html
new file mode 100644
index 0000000..99725e8
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_summary.html
@@ -0,0 +1,32 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+<head>
+	<title>Summary of tests: ${operator} ${starttime}, test session ID: ${id}</title>
+	<meta http-equiv="Pragma" content="no-cache"/>
+	<script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"/>
+	<script type="text/javascript" src="/static/script/test_summary.js"></script>
+	<link rel="shortcut icon" href="/static/img/favicon.ico"/>
+	<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+	<link rel="stylesheet" type="text/css" href="/static/reportstyle.css" media="screen"/>
+	<link rel="stylesheet" type="text/css" href="/static/reportstyle_print.css" media="print"/>
+	<link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+	<link rel="stylesheet" type="text/css" href="/static/style.css" />
+</head>
+<body>
+	<div class="report">
+	<div id="Main" class="content" style="display: block; visibility: visible;">
+	    <div><a href="/"><img src="/static/img/logo.jpg"/></a><p class="version">Analysis software version ${version.simple}</p></div>
+	    <span class="no_print"><br/><a href="/testsessions/${id}"><button class="btn btn-primary">Back</button></a></span>
+	    <button class="no_print btn btn-info" id="print_button" disabled="disabled"><span class="glyphicon glyphicon-print"></span> Print</button>
+
+	    <h2 style="margin-bottom: 0px;">Summary of tests: test session ID: ${id}, ${operator} ${starttime}</h2>
+	    <div id="${id}" class="test_sesession"></div>
+        <div id="test_summaries" data-count="${len(test_ids)}">
+            <div py:for="testid in test_ids" id="${testid}" class="test_div">
+            </div>
+        </div>
+        <br />
+        <br />
+	</div>
+	</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/TPPTAnalysisSW/templates/test_tapping_repeatability.html b/TPPTAnalysisSW/templates/test_tapping_repeatability.html
new file mode 100644
index 0000000..2cb2ab0
--- /dev/null
+++ b/TPPTAnalysisSW/templates/test_tapping_repeatability.html
@@ -0,0 +1,161 @@
+<div xmlns:py="http://genshi.edgewall.org/">
+    <table class="datatable test_verdicts">
+        <tr>
+            <th>Touch down repeatability</th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average of point max error</td>
+            <td>${"%.3f" % avg_of_max_down_repeatability_error} mm</td>
+            <td>${"%.3f" % max_allowed_error_pen_down} mm</td>
+            <td class="${'passed' if verdict_down=='Pass' else 'failed'}">$verdict_down</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Maximum</td>
+            <td>${"%.3f" % max_down_repeatability_error} mm</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average</td>
+            <td>${"%.3f" % avg_down_repeatability_error} mm</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Standard deviation</td>
+            <td>${"%.3f" % std_dev_down_repeatability_error} mm</td>
+        </tr>
+    </table>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th>Touch up repeatability</th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average of point max error</td>
+            <td>${"%.3f" % avg_of_max_lift_repeatability_error} mm</td>
+            <td>${"%.3f" % max_allowed_error_pen_lift} mm</td>
+            <td class="${'passed' if verdict_lift=='Pass' else 'failed'}">$verdict_lift</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Maximum</td>
+            <td>${"%.3f" % max_lift_repeatability_error} mm</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Average</td>
+            <td>${"%.3f" % avg_lift_repeatability_error} mm</td>
+        </tr>
+        <tr>
+            <td class="vertical_header_th">Standard deviation</td>
+            <td>${"%.3f" % std_dev_lift_repeatability_error} mm</td>
+        </tr>
+    </table>
+
+    <h3>Completeness results</h3>
+    <table class="datatable test_verdicts">
+        <tr>
+            <th>Parameter</th>
+            <th>Value</th>
+            <th>Maximum allowed</th>
+            <th>Pass/Fail</th>
+        </tr>
+        <tr>
+            <td>Missing points</td>
+            <td>${"%.1f" % missing_point_percentage} %</td>
+            <td>${"%.1f" % maxmissing_in_percentage} %</td>
+            <td class="${'passed' if missing_point_verdict=='Pass' else 'failed'}">$missing_point_verdict</td>
+        </tr>
+    </table>
+
+    <!-- Preview image -->
+    <div py:if="'noimages' not in kwargs" class="preview">
+        <a href="${detailed_figure}">
+            <img src="${figure}" width="800" height="600" alt="Preview image"/>
+        </a>
+    </div>
+
+    <!--! Preview table -->
+    <div class="dtable no_print">
+        <div class="dtable_row subplot_selector">
+            <div class="dtable_header narrow_cell">Toggle:
+            </div>
+            <div class="dtable_header narrow_cell subplot_button">
+                <button class="all_lines_button">All</button>
+            </div>
+            <div class="dtable_header narrow_cell subplot_button">
+                <button class="failed_lines_button">Failed</button>
+            </div>
+            <div class="dtable_header narrow_cell subplot_button">
+                <button class="passed_lines_button">Passed</button>
+            </div>
+        </div>
+    </div>
+
+    <span><H4>Touch down</H4></span>
+    <div class="subplot_table dtable">
+        <div class="dtable_header_row">
+            <div class="dtable_header narrow_cell">Point ID
+            </div>
+            <div class="dtable_header narrow_cell">Average
+            </div>
+            <div class="dtable_header narrow_cell">Stdev
+            </div>
+            <div class="dtable_header narrow_cell">Maximum
+            </div>
+            <div class="dtable_header narrow_cell">Pass/Fail
+            </div>
+            <div class="dtable_header no_print">Detailed plot</div>
+        </div>
+        <div py:for="down_accuracy_error_max, down_accuracy_error_avg, down_accuracy_error_sd, verdict, point_id in repeatability_errors_down"
+             class="dtable_row plot_header">
+            <div class="dtable_cell narrow_cell">${point_id}
+            </div>
+            <div class="dtable_cell narrow_cell"> ${"%.3f mm" % down_accuracy_error_avg if type(down_accuracy_error_avg) is float else "N/A"}
+            </div>
+            <div class="dtable_cell narrow_cell"> ${"%.3f mm" % down_accuracy_error_sd if type(down_accuracy_error_sd) is float else "N/A"}
+            </div>
+             <div class="dtable_cell narrow_cell"> ${"%.3f mm" % down_accuracy_error_max if type(down_accuracy_error_max) is float else "N/A"}
+            </div>
+            <div class="dtable_cell narrow_cell ${'passed' if verdict=='Pass' else 'failed'}"> ${verdict}
+            </div>
+            <div class="dtable_cell no_print">
+                <button type="button" class="show_plot">Show/Hide</button>
+            </div>
+            <div class="plot" data-src="${pointPlots_down[point_id]}"/>
+        </div>
+    </div>
+    <span><H4>Touch up</H4></span>
+    <div class="subplot_table dtable">
+        <div class="dtable_header_row">
+            <div class="dtable_header narrow_cell">Point ID
+            </div>
+            <div class="dtable_header narrow_cell">Average
+            </div>
+            <div class="dtable_header narrow_cell">Stdev
+            </div>
+            <div class="dtable_header narrow_cell">Maximum
+            </div>
+            <div class="dtable_header narrow_cell">Pass/Fail
+            </div>
+            <div class="dtable_header no_print">Detailed plot</div>
+        </div>
+        <div py:for="lift_accuracy_error_max, lift_accuracy_error_avg, lift_accuracy_error_sd, verdict, point_id in repeatability_errors_lift"
+             class="dtable_row plot_header">
+            <div class="dtable_cell narrow_cell">${point_id}
+            </div>
+            <div class="dtable_cell narrow_cell"> ${"%.3f mm" % lift_accuracy_error_avg if type(lift_accuracy_error_avg) is float else "N/A"}
+            </div>
+            <div class="dtable_cell narrow_cell"> ${"%.3f mm" % lift_accuracy_error_sd if type(lift_accuracy_error_sd) is float else "N/A"}
+            </div>
+            <div class="dtable_cell narrow_cell"> ${"%.3f mm" % lift_accuracy_error_max if type(lift_accuracy_error_max) is float else "N/A"}
+            </div>
+            <div class="dtable_cell narrow_cell ${'passed' if verdict=='Pass' else 'failed'}"> ${verdict}
+            </div>
+            <div class="dtable_cell no_print">
+                <button type="button" class="show_plot">Show/Hide</button>
+            </div>
+            <div class="plot" data-src="${pointPlots_lift[point_id]}"/>
+        </div>
+    </div>
+</div>
diff --git a/TPPTAnalysisSW/templates/testsession.html b/TPPTAnalysisSW/templates/testsession.html
new file mode 100644
index 0000000..3fee885
--- /dev/null
+++ b/TPPTAnalysisSW/templates/testsession.html
@@ -0,0 +1,71 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>${session.operator} ${session.starttime}, test session ID: ${session.id}</title>
+    <script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"/>
+    <script type="text/javascript" src="/static/script/testsession.js"></script>
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+  </head>
+
+  <body>
+    <div class="report">
+    <div id="Main" class="content" style="display: block; visibility: visible;">
+        <div class="no_summary"><a href="/"><img src="/static/img/logo.jpg"/></a><p class="version no_summary">Analysis software version ${version.simple}</p></div>
+        <span class="no_print no_summary"><br/>
+            <a href="/"><button class="btn btn-primary">Back</button></a>
+            <a href="/summary/${session.id}"><button class="btn btn-info">Summary</button></a>
+            <button py:if="sql_uploader_initialized" class="btn btn-info" id="upload_session_button" data-session-id="${session.id}" py:attrs="session_upload_button_attributes">
+                <span class="glyphicon glyphicon-cloud-upload"></span>
+                Upload to cloud
+            </button>
+        </span>
+        <h2 class="session_title no_summary">${session.operator} ${session.starttime}, test session ID: ${session.id}</h2>
+        <table class="constanttable">
+            <tr>
+                <th>Notes
+                <span id="notes_edit" class="editnotes no_summary"><button class="btn btn-primary btn-xs">Edit</button></span>
+                <span id="notes_save" class="editnotes no_summary"><button class="btn btn-success btn-xs">Save</button></span>
+                </th>
+            </tr>
+            <tr>
+                <td><span id="notes">${session.notes}</span>
+                    <textarea id="notes_editor" class="editor no_summary" placeholder="Session notes">${session.notes}</textarea>
+                </td>
+            </tr>
+        </table>
+        <div py:for="dut in duts">
+            <h3>${dut[0].program}, ${dut[0].manufacturer}, ${dut[0].batch}, ${dut[0].sample_id} <a href="/testsessionsettings/${session.id}/${dut[0].id}"><button class="btn btn-primary btn-sm">Settings</button></a></h3>
+            <table class="datatable">
+                <tr>
+                    <th>Name</th>
+                    <th>Start time</th>
+                    <th>End time</th>
+                    <th class="narrow">Finger</th>
+                    <th class="narrow">Invalid</th>
+                    <th class="narrow">Pass/Fail</th>
+                    <th py:if="sql_uploader_initialized" class="narrow">Upload</th>
+                </tr>
+                <tr py:for="test,result, button_attributes in dut[1]" >
+                    <td class="${'' if result=='Error' else 'test_row'}" data-test-id="${test.id}">${"%s #%s" % (test.type.name, test.id)}</td>
+                    <td>${test.starttime}</td>
+                    <td>${test.endtime}</td>
+                    <td>${test.finger_type}</td>
+                    <td>${test.invalid}</td>
+                    <td class="${'passed' if result=='Pass' else 'failed' if result=='Fail' or result=='Error' else ''}">${result if result!='Error' else 'Error in analysis!'}</td>
+                    <td py:if="sql_uploader_initialized">
+                        <button class="no_print btn btn-info upload_test_button" data-test-id="${test.id}" py:attrs="button_attributes">
+                        <span class="glyphicon glyphicon-cloud-upload"></span>
+                        </button>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+    <br/><br/>
+    </div>
+    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
+  </body>
+</html>
diff --git a/TPPTAnalysisSW/templates/testsessions_index.html b/TPPTAnalysisSW/templates/testsessions_index.html
new file mode 100644
index 0000000..4837a99
--- /dev/null
+++ b/TPPTAnalysisSW/templates/testsessions_index.html
@@ -0,0 +1,183 @@
+<html xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <head>
+    <title>Test sessions</title>
+    <link rel="shortcut icon" href="/static/img/favicon.ico"/>
+    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"/>
+    <link rel="stylesheet" type="text/css" href="/static/reportstyle.css" />
+    <link rel="stylesheet" type="text/css" href="/static/daddy.css" />
+    <link rel="stylesheet" type="text/css" href="/static/style.css" />
+    <link rel="stylesheet" type="text/css" href="/static/mainpage.css" />
+  </head>
+  <body>
+    <div class="report">
+    <div id="Main" class="content">
+    <div><a href="/"><img src="/static/img/logo.jpg"/></a><p class="version">Analysis software version ${version.simple}</p></div>
+    <span class="no_print"><br/><a href="/settings"><button class="btn btn-primary">Settings</button></a></span>
+    <span class="no_print"><a href="/static/AnalysisSoftwareUserGuide.pdf"><button class="btn btn-info">User Guide</button></a></span>
+    <span class="no_print"><a href="/main_page?page=${pagenumber - 1}" py:if="int(pagenumber) > 1"><button class="btn btn-primary">Previous page</button></a></span>
+    <span class="no_print"><a href="/main_page?page=${pagenumber}" py:if="int(pagenumber) &lt; 2"><button class="btn btn-primary">Previous page</button></a></span>
+    <span class="no_print"><a href="/main_page?page=${pagenumber + 1}"><button class="btn btn-primary">Next page</button></a></span>
+
+    <br /> <br />
+    <p><b>Database</b></p>
+    <form role="form" class="form-inline" method="POST" action="/">
+        <div class="form-group">
+            <select class="form-control" name="filepath">
+
+                <option value="${path}" selected="${cur}" py:for="path, cur in dbfiles.items()">
+                    ${path.split("\\")[-1]}
+                </option>
+
+            </select>
+        </div>
+        <button type="submit" class="btn btn-success">Change</button>
+    </form>
+
+    <h2>Test sessions</h2>
+    <div class="viewselectors">
+        <span class="viewselector selected no_print" id="viewsel_latest">Latest</span>
+        <span class="viewselector no_print" id="viewsel_manufacturers">By manufacturer</span>
+    </div>
+    <div id="view_latest">
+        <table class="test_sessions datatable">
+            <tr>
+            <th class="id">ID</th>
+            <th class="narrow">Operator</th>
+            <th class="datetime">Started</th>
+            <th class="datetime">Ended</th>
+            <th>Samples</th>
+            <th>Manufacturers</th>
+            <th>Program</th>
+            <th class="narrow">Version</th>
+            <th class="narrow">Pass/Fail</th>
+            <th>Notes</th>
+            <th class="delete">Delete</th>
+            </tr>
+            <tr class="test_session_row" py:for="ts in latest" data-id="${ts[0].id}">
+                <td>${ts[0].id}</td>
+                <td>${ts[0].operator}</td>
+                <td>${ts[0].starttime}</td>
+                <td>${ts[0].endtime}</td>
+                <td>${ts[2][0]}</td>
+                <td>${ts[2][2]}</td>
+                <td>${ts[2][1]}</td>
+                <td>${ts[2][3]}</td>
+                <td class="${'passed' if ts[1] == 'Pass' else 'failed' if ts[1]=='Fail' else ''}">${ts[1]}</td>
+                <td class="notes">${ts[0].notes}</td>
+                <td data-toggle="modal" data-target="#deletemodal" data-id="${ts[0].id}"><span class="glyphicon glyphicon glyphicon-remove"></span></td>
+            </tr>
+        </table>
+    </div>
+
+
+    <div id="view_manufacturers">
+    <div class="collapsing-list">
+        <div py:for="man_i, man in enumerate(manufacturers)">
+        <div class="collapsing-header" data-indx="${'m%d' % man_i}">
+            <div class="collapsing-icon"><img class="icon-closed" src="/static/img/tree_closed.png" alt="-"/>
+                                         <img class="icon-open" src="/static/img/tree_open.png" alt="+"/></div>
+            <div class="collapsing-content">
+                <span class="maintree_header">${man[0] if man[0] is not None and len(man[0]) > 0 else "[Empty]"}</span>
+            </div>
+        </div>
+        <div class="collapsing-subrow">
+            <div class="collapsing-icon"></div>
+            <div class="collapsing-content">
+                <div py:for="prog_i, program in enumerate(man[1])" class="collapsing-list">
+                <div class="collapsing-header" data-indx="${'m%d_p%d' % (man_i, prog_i)}">
+                    <div class="collapsing-icon"><img class="icon-closed" src="/static/img/tree_closed.png" alt="+"/>
+                                                 <img class="icon-open" src="/static/img/tree_open.png" alt="-"/></div>
+                    <div class="collapsing-content">
+                        <span class="maintree_header">${program[0] if program[0] is not None and len(program[0]) > 0 else "[Empty]"}</span>
+                    </div>
+                </div>
+                <div class="collapsing-subrow">
+                    <div class="collapsing-icon"></div>
+                    <div class="collapsing-content">
+
+                        <table class="test_sessions datatable">
+                            <tr>
+                            <th class="id">ID</th>
+                            <th class="narrow">Operator</th>
+                            <th class="datetime">Started</th>
+                            <th class="datetime">Ended</th>
+                            <th>Samples</th>
+                            <th>Manufacturers</th>
+                            <th>Program</th>
+                            <th class="narrow">Version</th>
+                            <th class="narrow">Pass/Fail</th>
+                            <th>Notes</th>
+                            <th class="delete">Delete</th>
+                            </tr>
+                            <tr class="test_session_row" py:for="ts in program[1]" data-id="${ts[0].id}">
+                                <td>${ts[0].id}</td>
+                                <td>${ts[0].operator}</td>
+                                <td>${ts[0].starttime}</td>
+                                <td>${ts[0].endtime}</td>
+                                <td>${ts[2][0]}</td>
+                                <td>${ts[2][2]}</td>
+                                <td>${ts[2][1]}</td>
+                                <td>${ts[2][3]}</td>
+                                <td class="${'passed' if ts[1] == 'Pass' else 'failed' if ts[1]=='Fail' else ''}">${ts[1]}</td>
+                                <td class="notes">${ts[0].notes}</td>
+                                <td data-toggle="modal" data-target="#deletemodal" data-id="${ts[0].id}"><span class="glyphicon glyphicon glyphicon-remove"></span></td>
+                            </tr>
+                        </table>
+
+                    </div>
+                </div>
+                </div>
+            </div>
+         </div>
+         </div>
+    </div>
+    </div>
+
+    <div class="modal fade" id="deletemodal">
+      <div class="modal-dialog">
+        <div class="modal-content">
+          <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            <h4 class="modal-title">Delete test session</h4>
+          </div>
+          <div class="modal-body">
+            <p>You're going to delete test session <b><span class="idspan"></span></b>.
+               This will delete all data which is related to this test session.
+               This action cannot be undone. Are you sure you want to proceed?
+           </p>
+          </div>
+          <div class="modal-footer">
+            <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+            <button type="button" class="btn btn-danger" id="deleteRequest" data-id="">Delete Test Tession</button>
+          </div>
+        </div><!-- /.modal-content -->
+      </div><!-- /.modal-dialog -->
+    </div><!-- /.modal -->
+
+    <div class="clear"><br /></div>
+
+    <div><button class="btn btn-warning" type="submit" id="recalculate_button" value="Recalculate all">Recalculate all</button></div>
+    </div>
+    <div id="loading">
+        <div class="row">
+            <div class="col-md-1"></div>
+                <div class="col-md-6">
+                    <br/><br/>
+                    <p>Recalculating analysis. Please wait.</p>
+                <div class="progress">
+                    <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
+                        <span class="prog"></span> %
+                    </div>
+                </div>
+                <br/><br/>
+                </div>
+        </div>
+    </div>
+    <br/><br/>
+    </div>
+
+    <script type="text/javascript" src="/static/script/libs/jquery-2.1.0.min.js"/>
+    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="/static/script/mainpage.js"/>
+  </body>
+</html>
diff --git a/TPPTAnalysisSW/test.py b/TPPTAnalysisSW/test.py
new file mode 100644
index 0000000..6bc0315
--- /dev/null
+++ b/TPPTAnalysisSW/test.py
@@ -0,0 +1,103 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from cherrypy import *
+
+from .base_page import BasePage
+import TPPTAnalysisSW.testbase as testbase
+from .measurementdb import get_database, TestResult
+from datetime import datetime
+import TPPTAnalysisSW.test_refs as test_refs
+import json
+import TPPTAnalysisSW.sqluploader as cloud
+import TPPTAnalysisSW.tests.test_config as testconfig
+
+
+
+def upload_test(test_id, **kwargs):
+    test_class_object, cache = testbase.TestBase.create(test_id, **kwargs)
+
+    if test_class_object:
+        response.headers['Content-type'] = 'application/json'
+        # Upload test results, needs to be done first
+        # to get the test start time easily
+        result_test = cloud.upload_test(test_class_object)
+        result_test = "Results upload: " + result_test
+        # Upload test configs
+        test_config = testconfig.TestConfig()
+        # Connecting the test and configs
+        test_config.set_linked_test(test_class_object)
+        result_config = cloud.upload_test(test_config)
+        result_config = " Config upload: " + result_config
+
+        return json.dumps(result_test + " | " + result_config).encode()
+    else:
+        print("unknown test type (test id %s)" % test_id)
+        raise HTTPError(status="500", message="Internal error - test type not found")
+
+#Controller for test
+class Test(BasePage):
+    SAVEPATH = ""
+    exposed = True
+
+
+    def GET(self, test_id=None, function=None, **kwargs):
+        #print "Test GET, testid", test_id
+        if (test_id==None):
+            raise HTTPError("404")
+
+        generator, cache = testbase.TestBase.create(test_id, **kwargs)
+        if 'refresh' in kwargs and kwargs['refresh'] == "yes":
+            cache = False
+
+        if generator:
+
+            if cache:
+                html, result = test_refs.testclass_refs[test_id].createreport(cache=True, **kwargs)
+                return html
+
+            else:
+                html, result = generator.createreport(**kwargs)
+
+                session = get_database().session()
+                dbresult = TestResult()
+                dbresult.test_id = test_id
+                dbresult.result = result
+                dbresult.calculated = datetime.now()
+                session.query(TestResult).filter(TestResult.test_id == test_id).delete()
+                session.add(dbresult)
+                session.commit()
+
+                return html
+        else:
+            print("unknown test type (test id %s)" % test_id)
+            raise HTTPError(status="500", message="Internal error - test type not found")
+
+    def PUT(self,**kwargs):
+        pass
+
+    def POST(self, test_id=None, function=None, **kwargs):
+        if function == 'upload':
+            if test_id is None:
+                raise HTTPError("404")
+
+            return upload_test(test_id, **kwargs)
\ No newline at end of file
diff --git a/TPPTAnalysisSW/test_refs.py b/TPPTAnalysisSW/test_refs.py
new file mode 100644
index 0000000..43d4133
--- /dev/null
+++ b/TPPTAnalysisSW/test_refs.py
@@ -0,0 +1,26 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+testclass_refs = {}
+
+def init():
+    global testclass_refs
+    testclass_refs = {}
diff --git a/TPPTAnalysisSW/test_session.py b/TPPTAnalysisSW/test_session.py
new file mode 100644
index 0000000..bbb353f
--- /dev/null
+++ b/TPPTAnalysisSW/test_session.py
@@ -0,0 +1,236 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+import TPPTAnalysisSW.measurementdb as measurementdb
+from .plotinfo import *
+import TPPTAnalysisSW.analyzers as analyzers
+from .settings import settings
+from datetime import datetime
+import math
+import json
+
+import time
+import traceback
+import TPPTAnalysisSW.plotinfo as plotinfo
+from .utils import Timer
+from .testbase import TestBase
+from .base_page import BasePage
+from .info.version import Version
+import TPPTAnalysisSW.imagefactory as imagefactory
+from TPPTAnalysisSW.test import upload_test
+import TPPTAnalysisSW.sqluploader as sqluploader
+
+
+# Controller for testsession
+class TestSession(BasePage):
+    exposed = True
+
+    def GET(self, testSessionId=None, command=None):
+        # Command is here in case we need to create e.g. session-wide settings
+        if command is None:
+            if (testSessionId == None):
+                raise cherrypy.HTTPError("404", "No testsession given")
+
+            dbsession = measurementdb.get_database().session()
+            testsession = dbsession.query(measurementdb.TestSession).filter(
+                measurementdb.TestSession.id == testSessionId).first()
+            sessioninfo = plotinfo.TestSessionInfo(testsession=testsession)
+
+            tests, tests_in_database, results, curved = self.sessionResultsFromDB(testsession, dbsession)
+            button_attributes = [{'disabled': 'true'} if test_uploaded else {} for test_uploaded in tests_in_database]
+
+            tests_results = zip(tests, results, button_attributes)
+
+            # Categorize tests by DUTs
+            duts = []  # list of tuples: (dut, [(test, result), ...])
+            dut_indices = {}  # Dut id -> duts list index map
+            for test_result in tests_results:
+                dut = test_result[0].dut
+                if dut.id in dut_indices:
+                    # Append to an older dut
+                    dut_index = dut_indices[dut.id]
+                    duts[dut_index][1].append(test_result)
+                else:
+                    # Add new dut
+                    dut_index = len(duts)
+                    dut_indices[dut.id] = dut_index
+                    duts.append((dut, [test_result]))
+
+            # Disable session upload button if all the tests have been uploaded to database
+            session_upload_button_attributes = {'disabled': 'true'} if tests_in_database.count(True) == len(tests) else {}
+
+            with open("templates/testsession.html") as f:
+                tmpl = MarkupTemplate(f)
+                stream = tmpl.generate(duts=duts, session=sessioninfo,
+                                       session_upload_button_attributes=session_upload_button_attributes,
+                                       sql_uploader_initialized=sqluploader.is_sql_uploader_initialized(),
+                                       version=Version)
+                return stream.render('xhtml')
+        else:
+            raise cherrypy.HTTPError("404", "Command not found")
+
+    def POST(self, testSessionId=None, command=None, **kwargs):
+        if command == 'upload_test':
+            test_id = kwargs['test_id']
+
+            return upload_test(test_id)
+        elif command == 'upload_session':
+            session_id = kwargs['session_id']
+
+            dbsession = measurementdb.get_database().session()
+
+            # Get IDs of tests that are part of the session.
+            test_query = dbsession.query(measurementdb.TestItem).filter(
+                measurementdb.TestItem.testsession_id == session_id)
+
+            test_items = test_query.all()
+            test_classes = [test_class for test_class, cache in map(TestBase.create, [test.id for test in test_items])]
+
+            test_items_and_classes = zip(test_items, test_classes)
+
+            uploaded_ids = []
+
+            # Upload all tests in the session that are not already uploaded
+            for test_item, test_class in test_items_and_classes:
+                if not test_class.exists_in_database_with_start_time(test_item.starttime):
+                    if upload_test(test_item.id) is None:
+                        return None
+                    # Keep track of uploaded test items to inform user which tests were actually uploaded
+                    uploaded_ids.append(str(test_item.id))
+
+            return json.dumps("Sequence upload successful. Uploaded tests: {}".format(', '.join(uploaded_ids))).encode()
+
+        if 'data' not in kwargs:
+            print("No data in kwargs")
+            raise cherrypy.HTTPError("400", "Expected data not received")
+
+        data = json.loads(kwargs['data'])
+        if 'command' not in data:
+            print("No command in data")
+            raise cherrypy.HTTPError("400", "Expected command not received")
+
+        return_data = 'No such command'
+
+        if data['command'] == 'set_notes':
+            dbsession = measurementdb.get_database().session()
+            testsession = dbsession.query(measurementdb.TestSession).filter(
+                measurementdb.TestSession.id == testSessionId).first()
+            testsession.notes = data['value']
+            dbsession.commit()
+            return_data = testsession.notes
+
+        return return_data
+
+    @staticmethod
+    def session_samples_progs_manus(testsession, dbsession):
+
+        sample_names = set()
+        sample_prog = set()
+        sample_manu = set()
+        sample_ver = set()
+
+        for test in testsession.test_items:
+
+            sample = test.dut.sample_id
+            manu = test.dut.manufacturer
+            prog = test.dut.program
+            ver = test.dut.batch
+
+            if sample is None or len(sample) == 0:
+                sample = "[Empty]"
+            sample_names.add(sample)
+
+            if manu is None or len(manu) == 0:
+                manu = "[Empty]"
+            sample_manu.add(manu)
+
+            if prog is None or len(prog) == 0:
+                prog = "[Empty]"
+            sample_prog.add(prog)
+
+            if ver is None or len(ver) == 0:
+                ver = "[Empty]"
+            sample_ver.add(ver)
+
+        return ", ".join(sorted(sample_names)), \
+               ", ".join(sorted(sample_prog)), \
+               ", ".join(sorted(sample_manu)), \
+               ", ".join(sorted(sample_ver))
+
+    @staticmethod
+    def sessionResultsFromDB(testsession, dbsession):
+        tests = []
+        tests_in_database = []
+        results = []
+        test_types = []
+
+        for test in testsession.test_items:
+            if len(test.test_results) == 0:
+                # Run analysis
+                result = TestBase.evaluateresult(test.id)
+            else:
+                result = test.test_results[0].result
+
+            test_object, cache = TestBase.create(test.id)
+            already_in_database = test_object.exists_in_database_with_start_time(test.starttime)
+
+            tests.append(test)
+            tests_in_database.append(already_in_database)
+            test_types.append(test.testtype_id)
+            results.append(result)
+
+        curved = False
+        if len(set(test_types)) == 1:
+            if test_types[0] == 15:
+                curved = True
+
+        return tests, tests_in_database, results, curved
+
+    @classmethod
+    def eval_tests_results(caller, dbsession, testSessionId, recalculate=True):
+        try:
+            return TestSession.do_evaluation(dbsession, testSessionId, recalculate=recalculate)
+        except Exception as e:
+            print("Error in analysis!", e)
+
+    @classmethod
+    def do_evaluation(caller, dbsession, testSessionId, recalculate=True):
+        '''
+        Analyzes all test results in test session.
+        '''
+
+        tests = dbsession.query(measurementdb.TestItem).options(joinedload('type')). \
+            filter(measurementdb.TestItem.testsession_id == testSessionId).all()
+        results = []
+
+        s = Timer(2)
+
+        for idx, t in enumerate(tests):
+            imagefactory.ImageFactory.delete_images(str(t.id))
+            result = TestBase.evaluateresult(t.id, recalculate=recalculate)
+            results.append(result)
+            s.Time("Analyzed test %d - result %s" % (t.id, result))
+
+        return tests, results
diff --git a/TPPTAnalysisSW/test_session_report.py b/TPPTAnalysisSW/test_session_report.py
new file mode 100644
index 0000000..71ad7d5
--- /dev/null
+++ b/TPPTAnalysisSW/test_session_report.py
@@ -0,0 +1,89 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from cherrypy import *
+
+from .base_page import BasePage
+import TPPTAnalysisSW.measurementdb as measurementdb
+from datetime import datetime
+import TPPTAnalysisSW.test_refs as test_refs
+from .info.version import Version
+from genshi.template import MarkupTemplate
+import TPPTAnalysisSW.testbase as testbase
+
+class TestSessionReport(BasePage):
+
+    exposed = True
+
+    def GET(self, session_id=None, function=None, **kwargs):
+        """ Generates one big summary report from all tests in a test session. """
+
+        if session_id is None:
+            raise HTTPError(status="500", message="Internal error - test session not found")
+            return
+
+        all_results = []
+        summaries = []
+        dbsession = measurementdb.get_database().session()
+        session = dbsession.query(measurementdb.TestSession).filter(measurementdb.TestSession.id == session_id).first()
+
+        if session is None:
+            raise HTTPError(status="500", message="Internal error - test session not found")
+            return
+
+        for test in session.test_items:
+
+            generator, cache = testbase.TestBase.create(test.id, **kwargs)
+            summary = {"id": test.id}
+
+            if cache:
+                all_results.append(test_refs.testclass_refs[str(test.id)].get_results_for_session_template())
+
+            else:
+                html, result = generator.createreport(**kwargs)
+                session = measurementdb.get_database().session()
+                dbresult = measurementdb.TestResult()
+                dbresult.test_id = test.id
+                dbresult.result = result
+                dbresult.calculated = datetime.now()
+                session.query(measurementdb.TestResult).filter(measurementdb.TestResult.test_id == test.id).delete()
+                session.add(dbresult)
+                session.commit()
+                all_results.append(test_refs.testclass_refs[str(test.id)].get_results_for_session_template())
+
+            summary['type'] = test_refs.testclass_refs[str(test.id)].results['test_type_name']
+            results = dbsession.query(measurementdb.TestResult).filter(measurementdb.TestResult.test_id == test.id).first()
+            summary['verdict'] = results.result
+            summaries.append(summary)
+
+        templateParams = {}
+        templateParams['test_type_name'] = "Test Session #%s Report" % session_id
+        templateParams['all_results'] = all_results
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['test_page'] = 'test_session_report.html'
+        templateParams['version'] = Version
+        templateParams['summaries'] = summaries
+
+        template = MarkupTemplate(open("templates/test_session_report_common.html"))
+        stream = template.generate(**(templateParams))
+
+        return stream.render('xhtml')
diff --git a/TPPTAnalysisSW/test_session_settings.py b/TPPTAnalysisSW/test_session_settings.py
new file mode 100644
index 0000000..d91aff4
--- /dev/null
+++ b/TPPTAnalysisSW/test_session_settings.py
@@ -0,0 +1,99 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import json
+
+from genshi.template import MarkupTemplate
+from genshi.filters import HTMLFormFiller
+
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.test_session as test_session
+import TPPTAnalysisSW.plotters as plotters
+import TPPTAnalysisSW.imagefactory as imagefactory
+import TPPTAnalysisSW.measurementdb as db
+import TPPTAnalysisSW.test_session as test_session
+
+from .base_page import BasePage
+
+from .info.version import Version
+
+# Settings controller for settings-view
+class TestSessionSettingsController(BasePage):
+    """ These are actually DUT-specific settings """
+
+    def GET(self, testsession_id, dut_id):
+        if dut_id is None:
+            raise HTTPError("404")
+
+        dbsession = db.get_database().session()
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=dut_id, dbsession=dbsession)
+
+        template = MarkupTemplate(open("templates/test_dut_settings.html"))
+        stream = template.generate(version=Version, testsessionid=testsession_id, dutinfo=dutinfo)
+        return stream.render('xhtml')
+
+    def POST(self, testsession_id, dut_id, **kwargs):
+        if 'data' not in kwargs:
+            raise cherrypy.HTTPError("400", "Expected data not received")
+
+        saveFields = ["size_x", "size_y", "digitizer_resolution_x", "digitizer_resolution_y",
+                      "flipx", "flipy", "switchxy",
+                      "dut_manufacturer", "dut_program", "dut_batch", "dut_sample_id"]
+        data = json.loads(kwargs['data'])
+
+        # Check that each save field exists in the data
+        for key in saveFields:
+            if key not in data:
+                print("Missing key from input: " + key)
+                raise cherrypy.HTTPError("400", "Invalid key/value pairs in POST data")
+        # Check that no extra fields exists in the data
+        for key in data.keys():
+            if key not in saveFields:
+                print ("Unrecognized key: " + key)
+                raise cherrypy.HTTPError("400", "Unrecognized key/value pairs in POST data")
+
+        # Assume that the data is of correct format -> save to DB
+        dbsession = db.get_database().session()
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=dut_id, dbsession=dbsession)
+        dutinfo.dimensions = [float(data['size_x']), float(data['size_y'])]
+        dutinfo.digitizer_resolution = [float(data['digitizer_resolution_x']), float(data['digitizer_resolution_y'])]
+        dutinfo.offset = [0.0, 0.0]
+        dutinfo.flipx = (data['flipx'] == '1')
+        dutinfo.flipy = (data['flipy'] == '1')
+        dutinfo.switchxy = (data['switchxy'] == '1')
+
+        dutinfo.manufacturer = data['dut_manufacturer']
+        dutinfo.program = data['dut_program']
+        dutinfo.batch = data['dut_batch']
+        dutinfo.sample_id = data['dut_sample_id']
+
+        dutinfo.save(dbsession=dbsession)
+
+        # Recalculate analysis results
+        test_session.TestSession.do_evaluation(dbsession, testsession_id)
+
+        cherrypy.response.headers['Content-Type']= 'text/plain'
+        return "Saved"
+
+    exposed = True
+
diff --git a/TPPTAnalysisSW/test_summary.py b/TPPTAnalysisSW/test_summary.py
new file mode 100644
index 0000000..2b9b11c
--- /dev/null
+++ b/TPPTAnalysisSW/test_summary.py
@@ -0,0 +1,56 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from .base_page import BasePage
+from cherrypy import *
+from genshi.template import MarkupTemplate
+from genshi.filters import HTMLFormFiller
+from .measurementdb import *
+from .plotinfo import TestSessionInfo
+from .info.version import Version
+
+import json
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.test_session as test_session
+import copy
+
+#Settings controller for settings-view
+class SummaryController(BasePage):
+    exposed = True
+    
+    def GET(self, testsession_id = None):
+
+        if (testsession_id == None):
+            raise HTTPError("404")
+        
+        dbsession = get_database().session()
+        
+        sessioninfo = TestSessionInfo(testsession_id=testsession_id, dbsession=dbsession)
+        test_query = dbsession.query(TestItem).filter(TestItem.testsession_id==testsession_id).values(TestItem.id)
+        test_ids = [id[0] for id in test_query]
+
+        templateparams = copy.copy(sessioninfo.__dict__)
+
+        template = MarkupTemplate(open("templates/test_summary.html"))     
+        stream = template.generate(test_ids=test_ids, version=Version, **(templateparams))
+        return stream.render('xhtml')
+    
\ No newline at end of file
diff --git a/TPPTAnalysisSW/testbase.py b/TPPTAnalysisSW/testbase.py
new file mode 100644
index 0000000..df4dadd
--- /dev/null
+++ b/TPPTAnalysisSW/testbase.py
@@ -0,0 +1,254 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from sqlalchemy.orm import joinedload
+from datetime import datetime
+import numpy as np
+import math
+
+import time
+import traceback
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.analyzers as analyzers
+
+from .measurementdb import get_database, TestItem, TestResult
+from .settings import settings
+from TPPTAnalysisSW.sqluploader import Session, is_sql_uploader_initialized
+import TPPTAnalysisSW.test_refs as test_refs
+
+TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
+
+# generator functions for the different images - will be filled by the decorator
+# This is a directory id -> generating function
+_test_generators = {}
+
+def timestr_to_datetime(timestr):
+    """
+    Convert time string that has been generated in TPPT scripts via time.strftime to datetime object.
+    :param timestr: Time string.
+    """
+    return datetime.strptime(timestr, TIME_FORMAT)
+
+# Decorator class
+class testclasscreator(object):
+    """ Creates test reports and images for the test. Gets the test type id as parameter """
+
+    _generators = {}
+
+    def __init__(self, *args, **kwargs):
+        self.args = args
+        self.kwargs = kwargs
+        pass
+
+    def __call__(self, f):
+        global _test_generators
+        for arg in self.args:
+            _test_generators[arg] = f
+        return f
+
+
+class TestBase(object):
+    """Base class for all test objects. """
+
+    def __init__(self, test_item_row, *args, **kwargs):
+        """ Initialize the common report parameters """
+
+        # Create dictionary for testsession parameters
+        self.test_item = {column.name: getattr(test_item_row, column.name) for column in test_item_row.__table__.columns}
+        self.test_item['test_type_name'] = test_item_row.type.name
+        self.test_id = self.test_item['id']
+        self.reporting_rates = {}
+        self.verdict = "Pass"
+
+        # Set in child class __init__ to allow exists_in_database_with_start_time to be called easily from child classes
+        self.sql_summary_class = None
+
+        # Create dictionary for test session parameters
+        session = test_item_row.testsession
+        self.testsession = {column.name: getattr(session, column.name) for column in session.__table__.columns}
+        dut = test_item_row.dut
+        self.dut = {column.name: getattr(dut, column.name) for column in dut.__table__.columns}
+
+    @staticmethod
+    def create(test_id, dbsession=None, **kwargs):
+        """ Create a correct subclass for given test id """
+        global _test_generators
+
+        if dbsession is None:
+            dbsession = get_database().session()
+
+        test = dbsession.query(TestItem).options(joinedload(TestItem.testsession)).\
+                                                 options(joinedload(TestItem.type)).\
+                                                 filter(TestItem.id==test_id).first()
+
+        cache = True
+        test_id = str(test_id)
+
+        if test.testtype_id in _test_generators:
+            if test_id not in test_refs.testclass_refs:
+                generator = _test_generators[test.testtype_id](test, **kwargs)
+                test_refs.testclass_refs[test_id] = generator
+                cache = False
+
+        if test.testtype_id != 15:
+            cache = False
+
+        return test_refs.testclass_refs[test_id], cache
+
+    def get_test_item(self, dbsession=None):
+        if dbsession is None:
+            dbsession = get_database().session()
+
+        test = dbsession.query(TestItem).options(joinedload(TestItem.testsession)). \
+            options(joinedload(TestItem.type)). \
+            filter(TestItem.id == self.test_id).first()
+
+        return test
+
+    def get_test_session(self, dbsession=None):
+        if dbsession is None:
+            dbsession = get_database().session()
+
+        test = dbsession.query(TestItem).options(joinedload(TestItem.testsession)). \
+            options(joinedload(TestItem.testsession)). \
+            filter(TestItem.id == self.test_id).first()
+
+        return test.testsession
+
+    def get_session_and_dutinfo(self):
+        """ Gets db session and dutinfo objects. """
+
+        dbsession = get_database().session()
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+        return dbsession, dutinfo
+
+    def disable_upload_button_if_already_uploaded(self, template_params):
+        """
+        Called from the test.createreport() for each test class
+        :param template_params: template parameters for the test case
+        """
+        test_item = self.get_test_item()
+        time_test_start = timestr_to_datetime(test_item.starttime)
+        already_exists = self.exists_in_database_with_start_time(time_test_start)
+
+        # Using pyattrs in the test_configured_body.html this disables the upload button if necessary
+        template_params['upload_button_attributes'] = {'disabled': 'true'} if already_exists else {}
+
+    def exists_in_database_with_start_time(self, time_test_start):
+        """
+        Assumes that time_test_start is a unique identifier for test items regardless of sqlite database id mixups
+        :param time_test_start: Timestamp for the TestItem.starttime in measurementdb
+        :return: True if rows found for the test class in database, False otherwise
+        """
+
+        # If DB is not initialized, return True (return value should not be used in this case)
+        if not is_sql_uploader_initialized():
+            return True
+
+        session = Session()
+
+        try:
+            query = session.query(self.sql_summary_class)\
+                            .filter(self.sql_summary_class.time_test_start == time_test_start)
+
+            exists = session.query(query.exists()).scalar()
+        finally:
+            session.close()
+
+        return exists
+
+    # These functions must be implemented in the child classes
+
+    def runanalysis(self, *args, **kwargs):
+        raise NotImplementedError("Method not implemented")
+
+    def clearanalysis(self, *args, **kwargs):
+        raise NotImplementedError("Method not implemented")
+
+    def createreport(self, *args, **kwargs):
+        raise NotImplementedError("Method not implemented")
+
+    def createimage(self, *args, **kwargs):
+        raise NotImplementedError("Method not implemented")
+
+    def create_common_templateparams(self, *args, **kwargs):
+        templateParams = {}
+        templateParams["test_item"] = self.test_item
+        templateParams["testsession"] = self.testsession
+        templateParams["dut"] = self.dut
+        templateParams["test_id"] = self.test_item['id']
+        templateParams["test_type_name"] = self.test_item['test_type_name']
+        templateParams["curtime"] = time.time()
+
+        templateParams["settings"] = settings
+
+        templateParams["sql_uploader_initialized"] = is_sql_uploader_initialized()
+
+        templateParams["kwargs"] = kwargs
+
+        return templateParams
+
+    @staticmethod
+    def evaluateresult(test_id, dbsession=None, recalculate=True):
+
+        if dbsession is None:
+            session = get_database().session()
+        else:
+            session = dbsession
+
+        result = None
+
+        if recalculate:
+            testclass = TestBase.create(test_id, dbsession=session)[0]
+
+        try:
+
+            if recalculate:
+                if testclass is not None:
+                    result = testclass.runanalysis()
+                else:
+                    # Test class not found!
+                    print("Test class not found for test " + str(test_id))
+                    result = "Error"
+
+            dbresult = TestResult()
+            dbresult.test_id = test_id
+
+            if recalculate:
+                dbresult.result = result
+            else:
+                result = "Requires recalculate"
+                dbresult.result = result
+
+            dbresult.calculated = datetime.now()
+            session.query(TestResult).filter(TestResult.test_id == test_id).delete()
+            session.add(dbresult)
+            session.commit()
+
+        except Exception as e:
+            print(traceback.format_exc())
+            result = "Error"
+
+        if dbsession is None:
+            session.close()
+
+        return result
diff --git a/TPPTAnalysisSW/tests/__init__.py b/TPPTAnalysisSW/tests/__init__.py
new file mode 100644
index 0000000..7a1c127
--- /dev/null
+++ b/TPPTAnalysisSW/tests/__init__.py
@@ -0,0 +1,21 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_config.py b/TPPTAnalysisSW/tests/test_config.py
new file mode 100644
index 0000000..dc778d9
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_config.py
@@ -0,0 +1,85 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from sqlalchemy import Column, INTEGER, DATETIME, VARCHAR, func
+
+from TPPTAnalysisSW.testbase import TestBase, timestr_to_datetime
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.sqluploader import Base
+
+
+class TestConfigSQL(Base):
+    __tablename__ = 'touch_test_config'
+    meta_id = Column(INTEGER, primary_key=True)
+    time_test_start = Column(DATETIME)
+    dut_id = Column(VARCHAR(40))
+    test_description = Column(VARCHAR(100))
+    operator = Column(VARCHAR(40))
+    station_id = Column(VARCHAR(40))
+    version_tppt_scripts = Column(VARCHAR(40))
+    version_tnt_server = Column(VARCHAR(40))
+    version_tppt_analyser = Column(VARCHAR(40))
+    created = Column(DATETIME(), server_default=func.current_timestamp())
+
+
+class TestConfig(TestBase):
+    """
+    Implements TestConfig class that is used to upload data to test_config database
+    """
+
+    def __init__(self, *args, **kwargs):
+        self.sql_summary_class = TestConfigSQL
+        self.linked_test = None
+
+    def set_linked_test(self, test_class_object):
+        """
+        Test config is always bound to an actual test and the
+        connection is set here.
+        :param test_class_object: instance of the test class we want to write the configs to
+        :return:
+        """
+        self.linked_test = test_class_object
+
+    def upload_sql_data(self, session):
+        """
+        Uploads data to SQL database
+        :param session: test object the data of which we want to upload
+        :return:
+        """
+        # Most of the needed data is saved in test_session database table
+        test_session_db_dict = self.linked_test.testsession
+        time_test_start = timestr_to_datetime(self.linked_test.test_item['starttime'])
+        # Does the database field already exist
+        if self.exists_in_database_with_start_time(time_test_start):
+            pass
+        else:
+            testconfig = TestConfigSQL()
+            testconfig.time_test_start = time_test_start
+            testconfig.dut_id = self.linked_test.dut['sample_id']
+            testconfig.test_description = test_session_db_dict['notes']
+            testconfig.operator = test_session_db_dict['operator']
+            testconfig.station_id = test_session_db_dict['station_id']
+            testconfig.version_tppt_scripts = test_session_db_dict['tppt_version']
+            testconfig.version_tnt_server = test_session_db_dict['tnt_version']
+            testconfig.version_tppt_analyser = Version.software
+            session.add(testconfig)
+            session.commit()
+
diff --git a/TPPTAnalysisSW/tests/test_dummy.py b/TPPTAnalysisSW/tests/test_dummy.py
new file mode 100644
index 0000000..7a8f1e3
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_dummy.py
@@ -0,0 +1,138 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+
+from testbase import TestBase, testclasscreator
+from imagefactory import ImageFactory
+from measurementdb import get_database
+from info.version import Version
+from utils import Timer
+import plotinfo
+import plot_factory
+
+class DummyTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(99)
+    def create_testclass(*args, **kwargs):
+        return DummyTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new DummyTest class """
+        return super(DummyTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        return "None"
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(DummyTest, self).create_common_templateparams(**kwargs)
+        dbsession = get_database().session()
+
+        # Add the image name and parameters to the report
+        # Typically image is added like this:
+        #
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'dummy')
+
+        t = Timer()
+
+        #
+        # A More complicated example:
+        # templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'dummy', str(2)) # If the last parameter is changed, a new image is generated to the report
+        # templateParams['figurestring'] = 'HelloWorld' # Just a sample - do not copy: This is used only when the image is generated for the first time
+
+        # Here we can fetch data from the database and add it to the template. E.g.:
+        # 1) Create table dummytestdata, with id, dataline and foreign key test_id
+        # 2) Create SQLAlchemy object to the measurementdb.py:
+        #
+        #class DummyTestData( Base ):
+        #    #One-finger swipe results are defined here
+        #    __tablename__ = 'dummytestdata'
+        #    id = Column( Integer, primary_key = True )
+        #    test_id = Column( Integer, ForeignKey('test_item.id') )
+        #    data = Column(Float)
+        #    ...
+        #
+        # 3) Fetch the data here
+        #
+        #dataquery = dbsession.query(DummyTestData).filter(DummyTestData.test_id == self.test_id).all()
+        #    
+        #   ... and handle the query results in for loop, adding information to the templateParams
+        #
+        # OR
+        # Create a new function to analyzers or plotinfo libraries. 
+
+        # data for the report
+        templateParams['results'] = self.read_test_results()
+
+        t.Time("Results")
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_dummy.html'
+        templateParams['version'] = Version
+        
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+        return stream.render('xhtml')
+
+      
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+        
+        # Dummy test has only one image: dummyimage.
+        if image_name == 'dummy':
+            # Create the test image (here we just pass args and kwargs to plotter - not necessarily needed)
+            # Normally we would fetch data from the database to the plotinfo-parameter
+            plotInfo = self.read_test_results()
+            plot_factory.plot_dummy_image(imagepath, plotInfo, *args, title="Temporary image", **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+            
+        return None
+
+    def read_test_results(self, testsessioninfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        plotInfo = {}
+        plotInfo['points'] = [(0.25, 0.75), (-0.22, 0,45), (-0.75, -0.1), (0.5, -0.6)]
+        return plotInfo
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_dutinformation.py b/TPPTAnalysisSW/tests/test_dutinformation.py
new file mode 100644
index 0000000..53419bc
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_dutinformation.py
@@ -0,0 +1,113 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+import math
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.measurementdb import get_database
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+
+class DutInformationTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(6)
+    def create_testclass(*args, **kwargs):
+        return DutInformationTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new DutInformationTest class """
+        super(DutInformationTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        passed = (results['resolutionTestPassed'] and results['physicalDimensionTestPassed'])
+        return "Pass" if passed else "Fail"
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        pass
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(DutInformationTest, self).create_common_templateparams(**kwargs)
+        dbsession = get_database().session()
+
+        # data for the report
+        results = self.read_test_results()
+        templateParams['results'] = results
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_dutinformation.html'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+
+        passed = (results['resolutionTestPassed'] and results['physicalDimensionTestPassed'])
+
+        return stream.render('xhtml'), "Pass" if passed else "Fail"
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        # We have no images
+        raise cherrypy.HTTPError(message = "No such image in the report")
+
+    def read_test_results(self):
+
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'])
+
+
+        results = {}
+        results["digitizerResolution"] = dutinfo.digitizer_resolution
+        results["nativeResolution"] = dutinfo.native_resolution
+        results["dimensions"] = dutinfo.dimensions
+
+        results["resolutionTestPassed"] = dutinfo.digitizer_resolution[0] >= dutinfo.native_resolution[0] and \
+                                          dutinfo.digitizer_resolution[1] >= dutinfo.native_resolution[1]
+
+        # Pixels per inch. Calculation of sqrt(x^2 + y^2)/diagonal screen size in inches, where x is the number of pixels on the horizontal axis and y is the number of pixels on the vertical axis.
+        INCH_PER_MM = 0.0393700787
+        results["ppi"] = (math.sqrt(dutinfo.digitizer_resolution[0]**2 + dutinfo.digitizer_resolution[1]**2) /
+                          math.sqrt((dutinfo.dimensions[0]*INCH_PER_MM)**2 + (dutinfo.dimensions[1]*INCH_PER_MM)**2))
+
+        results["physicalDimensionTestPassed"] = (results["ppi"] >= settings["minppi"])
+
+        return results
diff --git a/TPPTAnalysisSW/tests/test_grid_accuracy.py b/TPPTAnalysisSW/tests/test_grid_accuracy.py
new file mode 100644
index 0000000..92b8499
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_grid_accuracy.py
@@ -0,0 +1,559 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from genshi.template import MarkupTemplate
+import numpy as np
+from sqlalchemy import *
+from sqlalchemy.dialects.mysql import LONGTEXT
+from sqlalchemy.orm import joinedload
+
+from ..testbase import TestBase, testclasscreator, timestr_to_datetime
+from ..imagefactory import ImageFactory
+from ..settings import settings, precision
+from ..utils import Timer
+from ..info.version import Version
+import TPPTAnalysisSW.measurementdb as db
+import TPPTAnalysisSW.analyzers as analyzers
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+from TPPTAnalysisSW.analyzers import filter_points
+from TPPTAnalysisSW.sqluploader import Base
+import datetime
+from math import sqrt
+from TPPTAnalysisSW import toolbox
+
+import base64
+
+class GridAccuracySummarySQL(Base):
+    __tablename__ = 'touch_grid_accuracy_summary'
+
+    meta_id = Column(INTEGER, primary_key=True)
+
+    time_test_start = Column(DATETIME)
+    test_id = Column(DECIMAL(10,0))
+    time_sequence_start = Column(DATETIME)
+    time_sequence_end = Column(DATETIME)
+
+    border_width = Column(DECIMAL(8,2))
+    finger_name = Column(VARCHAR(40))
+    finger_type = Column(VARCHAR(40))
+    finger_size = Column(DECIMAL(8,2))
+    step_size = Column(DECIMAL(8, 2))
+    num_fingers = Column(DECIMAL(8, 2))
+    lift_off_distance = Column(DECIMAL(8,2))
+    ground_status = Column(VARCHAR(40))
+    display_background = Column(VARCHAR(40))
+    touch_area = Column(VARCHAR(40))
+    touch_direction = Column(VARCHAR(40))
+    contact_duration = Column(DECIMAL(8,2))
+    log = Column(LONGTEXT)
+
+    grid_accuracy_avg_of_error_avgs = Column(DECIMAL(16, 3))
+    grid_accuracy_total_stdev_error = Column(DECIMAL(16, 3))
+    grid_accuracy_avg_of_max_errors = Column(DECIMAL(16, 3))
+    grid_accuracy_max_of_max_errors = Column(DECIMAL(16, 3))
+
+    total_number_of_missing_points = Column(Integer)
+
+    # The time of database entry creation set by the database server
+    created = Column(TIMESTAMP(), server_default=func.current_timestamp())
+
+class GridAccuracyTest(TestBase):
+    """
+    Grid accuracy test measures how close reported touch events are to actual tap positions.
+    """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(15)
+    def create_testclass(*args, **kwargs):
+        return GridAccuracyTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new test case class """
+        super(GridAccuracyTest, self).__init__(ddtest_row, *args, **kwargs)
+        self.sql_summary_class = GridAccuracySummarySQL
+
+        # These are used if dut has an svg file for boundaries
+        self.dut_svg = None
+        self.analysis_region_countour = None
+        self.dut_has_notch = None
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+
+        # Test case verdict is only affected by average of maximum input error verdict.
+        verdict = "Pass" if results['avg_max_input_verdict'] else "Fail"
+
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        template_params = super(GridAccuracyTest, self).create_common_templateparams(**kwargs)
+
+        t = Timer()
+
+        # data for the report
+        results = self.read_test_results()
+        template_params['results'] = results
+
+        t.Time("Results")
+
+        # set the content to be used
+        template_params['test_page'] = 'test_grid_accuracy.html'
+        template_params['version'] = Version
+
+        template_params['test_parameters'] = (('Border width [mm]', results['border_width']),
+                                             ('Finger name', results['finger_name']),
+                                             ('Finger type', results['finger_type']),
+                                             ('Finger size [mm]', results['finger_size']),
+                                             ('Number of fingers', results['num_fingers']),
+                                             ('Step size [mm]', results['step_size']),
+                                             ('Lift off distance [mm]', results['lift_off_distance']),
+                                             ('Ground status', results['ground_status']),
+                                             ('Noise status', results['noise_status']),
+                                             ('Touch area', results['touch_area']),
+                                             ('Contact duration [ms]', results['contact_duration']),
+                                             ('Display background', results['display_background'])
+                                             )
+
+        self.disable_upload_button_if_already_uploaded(template_params)
+
+        template = MarkupTemplate(open("templates/test_configured_body.html"))
+        stream = template.generate(**(template_params))
+        t.Time("Markup")
+
+        # Test case verdict is only affected by average of maximum input error verdict.
+        verdict = "Pass" if results['avg_max_input_verdict'] and results['avg_max_edge_only_verdict'] else "Fail"
+
+        return stream.render('xhtml'), verdict
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'p2pdiff':
+            t = Timer(1)
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Preview: Grid Accuracy ' + self.dut['program']
+            plot_factory.plot_taptest_on_target(imagepath, results["touch_down"], dutinfo, *args, title=title, **kwargs)
+            plot_factory.plot_taptest_on_target(imagepath, results["touch_up"], dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdy':
+            t = Timer(1)
+            results = self.read_test_results(**kwargs)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results["touch_down"], 0.0, *args, **kwargs)
+            plot_factory.plot_dxdy_graph(imagepath, results["touch_up"], 0.0, *args, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdyltd':
+            t = Timer(1)
+            results = self.read_test_results(**kwargs)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results["touch_down"], 1.0, *args, **kwargs)
+            plot_factory.plot_dxdy_graph(imagepath, results["touch_up"], 1.0, *args, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2phistogram':
+            t = Timer(1)
+            results = self.read_test_results()
+            t.Time("Results")
+            plot_factory.plot_p2p_err_histogram(imagepath, results["touch_down"], 1.0, *args, edge_only=False, **kwargs)
+            plot_factory.plot_p2p_err_histogram(imagepath, results["touch_up"], 1.0, *args, edge_only=False, **kwargs)
+            t.Time("Image")
+
+        return None
+
+    def is_point_on_edge_only(self, point, dutinfo, border_width):
+        '''
+        Checks if point (robot point) is in edge area but not in corner or notch area. Corner detection is done
+        by using rectangle model of DUT
+        :param point: point object
+        :param dutinfo: dutinfo object
+        :param border_width: width of edge area
+        :return: True if point is in edge area, False if point is in center, corner, or notch
+        '''
+        dut_width = dutinfo.dimensions[0]
+        dut_height = dutinfo.dimensions[1]
+        x = point.robot_x
+        y = point.robot_y
+        if x < border_width and border_width < y <(dut_height - border_width):
+            # left vertical edge
+            return True
+        elif x > (dut_width - border_width) and border_width < y <(dut_height - border_width):
+            # right vertical edge
+            return True
+        elif y > (dut_height - border_width) and border_width < x < (dut_width - border_width):
+            # lower horizontal edge
+            return True
+        elif y < border_width and border_width < x < (dut_width - border_width):
+            # upper horizontal edge
+            if not self.dut_has_notch:
+                return True
+            else:
+                # if there is notch, the whole upper horizontal edge is considered
+                # as notch area and thus discarded
+                return False
+        else:
+            return False
+
+    def has_notch(self, dutinfo):
+        '''
+        Checks if dut has notch or not based on the difference of svg "test_region" and
+        "analysis_region" (draws vertical line in the middle of dut and sees if it is cut by notch)
+        :param dutinfo:
+        :return: True if there is not notch, False if not
+        '''
+        mid_point = dutinfo.dimensions[0] / 2
+        start_x, end_x = mid_point, mid_point
+        start_y, end_y = 0, dutinfo.dimensions[1]
+        filtered_points = self.dut_svg.filter_lines_str_region([(start_x, start_y, end_x, end_y)], 'analysis_region', 0)
+        return filtered_points[0][0][1] > 0.1 # True if there is notch
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        query = dbsession.query(db.GridAccuracyTest).filter(
+            db.GridAccuracyTest.test_id == self.test_id). \
+            options(joinedload(db.GridAccuracyTest.grid_accuracy_results)). \
+            order_by(db.GridAccuracyTest.id)
+
+        if self.dut_svg is None and dutinfo.svg_data is not None:
+            try:
+                self.dut_svg = toolbox.dut.SvgRegion()
+                self.dut_svg.load_string(base64.b64decode(dutinfo.svg_data).decode('ascii'))
+            except Exception as e:
+                raise Exception('Failed to load dut svg file: ' + str(e))
+
+        if self.dut_has_notch is None and dutinfo.svg_data is not None:
+            self.dut_has_notch = self.has_notch(dutinfo)
+
+        num_points = len(list(query))
+
+        # Is test case over edge area?
+        is_edge_area = (query[0].touch_area == "edge_area") if num_points > 0 else False
+
+        max_pos_error = (settings['max_error_edge_corner_notch'] if is_edge_area else settings['max_error_center'])
+
+        # Total points is 2 times the number of locations because "touch down" and "touch up" are analyzed separately.
+        # Both cases contribute to the number of missing points that is compared to total points.
+        total_points = num_points * 2
+
+        # Total results contains both touch down and touch up results and combined verdicts.
+        total_results = {'avg_max_input_error': None,
+                         'avg_max_input_verdict': None,
+                         'avg_max_edge_only_error': None,
+                         'avg_max_edge_only_verdict': None,
+                         'total_points': total_points,
+                         'missing_inputs': None,
+                         'missing_inputs_verdict': None,
+                         'passed_points': None,
+                         'failed_points': None,
+                         'maxposerror': max_pos_error,
+                         'maxposerror_edge_only': settings["max_error_edge"],
+                         'touch_down': None,
+                         'touch_up': None,
+                         'border_width': query[0].border_width if num_points > 0 else 0,
+                         'finger_name': query[0].finger_name if num_points > 0 else "",
+                         'finger_type': query[0].finger_type if num_points > 0 else "",
+                         'step_size': query[0].step_size if num_points > 0 else 0,
+                         'finger_size': query[0].finger_size if num_points > 0 else 0,
+                         'num_fingers': int(query[0].num_fingers) if num_points > 0 else 0,
+                         'lift_off_distance': query[0].lift_off_distance if num_points > 0 else 0,
+                         'ground_status': query[0].ground_status if num_points > 0 else 0,
+                         'display_background': query[0].display_background if num_points > 0 else "",
+                         'touch_area': query[0].touch_area if num_points > 0 else "",
+                         'contact_duration': query[0].contact_duration if num_points > 0 else 0,
+                         'noise_status': query[0].noise_status if num_points > 0 else 0,
+                         'calculation_time': datetime.datetime.now(),
+                         'ghost_finger_found': False
+                         }
+
+        # Distances from both "touch down" and "touch up".
+        # This is dict of lists where dict key is point id and the list contains touch down and touch up point.
+        all_distances = {}
+
+        # There is additional collection of edge only points, since they have smaller max error limit
+        edge_only_distances = {}
+
+        # Analyze separately touch down and touch up events.
+        for touch_dir in ['touch_down', 'touch_up']:
+            passed_points = [] # These are tuple-tuples: ((target_x, target_y), (hit_x, hit_y))
+            failed_points = []
+            targets = []
+            hits = [] # target points: ((target_x, target_y), radius)
+            missing = [] # target points ((target_x, target_y), radius)
+
+            distances = []
+
+            for point in query:
+                # Ghost fingers are recognized in the TPPT scripts and indicated
+                # by setting point robot positions to (None, None)
+                if point.robot_x is None:
+                    total_results['ghost_finger_found'] = True
+                    continue
+
+                is_point_edge_only = self.is_point_on_edge_only(point, dutinfo, total_results['border_width'])
+
+                target = analyzers.robot_to_target((point.robot_x, point.robot_y), dutinfo)
+                targets.append(target)
+
+                result_point = None
+
+                # Find touch down or touch up events from recorded event stream.
+                filtered_point = filter_points(point.grid_accuracy_results)
+
+                if len(filtered_point) > 0:
+                    if touch_dir == "touch_down":
+                        # Make sure the first filtered point is "touch down".
+                        result_point = filtered_point[0] if filtered_point[0].event == 0 else None
+                    elif touch_dir == "touch_up":
+                        # Make sure the last filtered point is "touch up".
+                        result_point = filtered_point[-1] if filtered_point[-1].event == 1 else None
+                    else:
+                        raise Exception("Invalid touch direction")
+
+                if result_point is None or result_point.panel_x is None or result_point.panel_y is None:
+
+                    missing.append((target, analyzers.get_max_error(target, dutinfo)))
+                else:
+                    max_error = analyzers.float_for_db(analyzers.get_max_error(target, dutinfo))
+                    hits.append((target, max_error))
+                    hit = analyzers.panel_to_target((result_point.panel_x, result_point.panel_y), dutinfo)
+                    distance = analyzers.float_for_db(np.linalg.norm((hit[0]-target[0], hit[1]-target[1])))
+                    distances.append(float(distance))
+
+                    point_id = int(point.id)
+
+                    if point_id in all_distances:
+                        all_distances[point_id].append(float(distance))
+                    else:
+                        all_distances[point_id] = [float(distance)]
+
+                    if distance > max_error:
+                        failed_points.append((target, hit))
+                    else:
+                        passed_points.append((target, hit))
+
+                    # We need to collect separately points that are on edge only:
+                    if is_edge_area and is_point_edge_only:
+                        if point_id in edge_only_distances:
+                            edge_only_distances[point_id].append(float(distance))
+                        else:
+                            edge_only_distances[point_id] = [float(distance)]
+
+            max_input_error = None
+            avg_input_error = None
+            stdev_input_error = None
+
+            if len(distances) > 0:
+                darray = np.array(distances)
+                max_input_error = float(np.max(darray))
+                avg_input_error = float(np.mean(darray))
+                stdev_input_error = float(sqrt(np.mean(darray**2)))
+
+            results = {'max_input_error': analyzers.float_for_db(max_input_error),
+                       'avg_input_error': analyzers.float_for_db(avg_input_error),
+                       'stdev_input_error': analyzers.float_for_db(stdev_input_error),
+                       'missing_inputs': len(missing),
+                       'maxposerror': analyzers.float_for_db(max_pos_error),
+                       'passed_points': passed_points,
+                       'failed_points': failed_points,
+                       'targets': targets,
+                       'hits': hits,
+                       'missing': missing,
+                       'distances': distances,
+                       'images': [(ImageFactory.create_image_name(self.test_id, 'p2pdiff'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdiff', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdy'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdy', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdyltd'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdyltd', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2phistogram'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2phistogram', 'detailed'))]
+                       }
+
+            total_results[touch_dir] = results
+
+        avg_max_input_error = None
+        max_max_input_error = None
+        avg_avg_input_error = None
+        stdev_input_error = None
+        avg_max_input_verdict = False
+
+        # Compute input error for total results that considers both "touch up" and "touch down" events.
+        if len(all_distances) > 0:
+            num_valid_locations = 0
+
+            # Loop through all tap locations. Each location may have produced 0, 1 or 2 distances.
+            for dist in all_distances.values():
+                # dist is a list that has 0, 1 or 2 values.
+                if len(dist) > 0:
+                    max_dist = max(dist)
+
+                    # When first valid location is discovered the error values are zeroed.
+                    if avg_max_input_error is None: avg_max_input_error = 0.0
+                    if max_max_input_error is None: max_max_input_error = 0.0
+                    if avg_avg_input_error is None: avg_avg_input_error = 0.0
+
+                    avg_max_input_error += max_dist
+                    max_max_input_error = max(max_max_input_error, max_dist)
+                    avg_avg_input_error += np.mean(dist)
+
+                    num_valid_locations += 1
+
+            if num_valid_locations > 0:
+                avg_max_input_error /= num_valid_locations
+                avg_avg_input_error /= num_valid_locations
+
+                avg_max_input_verdict = (avg_max_input_error < max_pos_error)
+
+            # Create array that has all distance values i.e. "touch up" and "touch down".
+            darray = []
+            for dist in all_distances.values():
+                darray += dist
+
+            if len(darray) > 0:
+                darray = np.array(darray)
+
+                # Compute standard deviation from all distance values.
+                stdev_input_error = float(sqrt(np.mean(darray**2)))
+
+        # Checking the edge only error value and whether it is pass or fail
+        avg_max_edge_only_error = 0.0
+        # needs to be true by default because it is not checked every time
+        # and affects total verdict
+        avg_max_edge_only_verdict = True
+        # Compute input error for edge only results that considers both "touch up" and "touch down" events
+        if len(edge_only_distances) > 0:
+            num_valid_locations = 0
+            # Loop through all tap locations. Each location may have produced 0, 1 or 2 distances.
+            for dist in edge_only_distances.values():
+                # dist is a list that has 0, 1 or 2 values.
+                if len(dist) > 0:
+                    max_dist = max(dist)
+
+                    # When first valid location is discovered the error values are zeroed.
+                    if avg_max_edge_only_error is None: avg_max_edge_only_error = 0.0
+
+                    avg_max_edge_only_error += max_dist
+                    num_valid_locations += 1
+
+            if num_valid_locations > 0:
+                avg_max_edge_only_error /= num_valid_locations
+                avg_max_edge_only_verdict = (avg_max_edge_only_error < settings["max_error_edge"])
+
+
+        # Compute total result verdicts from touch down and touch up cases.
+        total_results["avg_max_input_error"] = analyzers.float_for_db(avg_max_input_error)
+        total_results["max_max_input_error"] = analyzers.float_for_db(max_max_input_error)
+        total_results["avg_avg_input_error"] = analyzers.float_for_db(avg_avg_input_error)
+        total_results["stdev_input_error"] = analyzers.float_for_db(stdev_input_error)
+        total_results["avg_max_input_verdict"] = avg_max_input_verdict
+        total_results["missing_inputs"] = total_results["touch_down"]["missing_inputs"] + total_results["touch_up"]["missing_inputs"]
+        total_results["avg_max_edge_only_error"] = analyzers.float_for_db(avg_max_edge_only_error)
+        total_results["avg_max_edge_only_verdict"] = avg_max_edge_only_verdict
+
+        # Calculating the percentage of missing inputs and the verdict for it
+        if total_results["total_points"] > 0:
+            total_results["missing_inputs_percentage"] = analyzers.float_for_db(100*total_results["missing_inputs"]/total_results["total_points"])
+        else:
+            total_results["missing_inputs_percentage"] = 100
+        if total_results["missing_inputs_percentage"] <= settings["grid_acc_missing_points"]:
+            total_results["missing_inputs_verdict"] = "Pass"
+        else:
+            total_results["missing_inputs_verdict"] = "Fail"
+
+        return total_results
+
+    def upload_sql_data(self, session):
+        test_results = self.read_test_results()
+
+        test_item = self.get_test_item()
+        test_session = self.get_test_session()
+
+        # Write SQL row for both touch directions and combined results.
+        for touch_dir in ['touch_down', 'touch_up', 'both']:
+            summary = GridAccuracySummarySQL()
+
+            summary.test_id = self.test_id
+
+            summary.time_test_start = timestr_to_datetime(test_item.starttime)
+            summary.time_sequence_start = timestr_to_datetime(test_session.starttime)
+
+            # End time is None if sequence was not completed.
+            if test_session.endtime is not None:
+                summary.time_sequence_end = timestr_to_datetime(test_session.endtime)
+
+            summary.border_width = test_results["border_width"]
+            summary.finger_name = test_results["finger_name"]
+            summary.finger_type = test_results["finger_type"]
+            summary.finger_size = test_results["finger_size"]
+            summary.num_fingers = test_results["num_fingers"]
+            summary.step_size = test_results["step_size"]
+            summary.lift_off_distance = test_results["lift_off_distance"]
+            summary.ground_status = test_results["ground_status"]
+            summary.display_background = test_results["display_background"]
+            summary.touch_area = test_results["touch_area"]
+            summary.touch_direction = touch_dir
+            summary.contact_duration = test_results["contact_duration"]
+            summary.log = self.test_item['kmsg_log'] # The test_item comes form Testbase
+
+            if touch_dir == 'both':
+                summary.grid_accuracy_avg_of_error_avgs = test_results["avg_avg_input_error"]
+                summary.grid_accuracy_avg_of_max_errors = test_results["avg_max_input_error"]
+
+                summary.grid_accuracy_max_of_max_errors = test_results["max_max_input_error"]
+                summary.grid_accuracy_total_stdev_error = test_results["stdev_input_error"]
+
+                summary.total_number_of_missing_points = test_results["missing_inputs"]
+            else:
+                # In grid accuracy there is only one point per grid location so "avg of avg" and "avg of max" are the same.
+                summary.grid_accuracy_avg_of_error_avgs = test_results[touch_dir]["avg_input_error"]
+                summary.grid_accuracy_avg_of_max_errors = test_results[touch_dir]["avg_input_error"]
+
+                summary.grid_accuracy_max_of_max_errors = test_results[touch_dir]["max_input_error"]
+                summary.grid_accuracy_total_stdev_error = test_results[touch_dir]["stdev_input_error"]
+
+                summary.total_number_of_missing_points = test_results[touch_dir]["missing_inputs"]
+
+            session.add(summary)
+            session.commit()
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_linearity.py b/TPPTAnalysisSW/tests/test_linearity.py
new file mode 100644
index 0000000..25e7a13
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_linearity.py
@@ -0,0 +1,1016 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import threading
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+from sqlalchemy import Column, DECIMAL, INTEGER, TIMESTAMP, DATETIME, VARCHAR, ForeignKey, BOOLEAN, func
+from sqlalchemy.dialects.mysql import LONGTEXT
+
+import numpy as np
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator, timestr_to_datetime
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.sqluploader import Base
+import TPPTAnalysisSW.measurementdb as measurementdb
+import TPPTAnalysisSW.analyzers as analyzers
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+from TPPTAnalysisSW.analyzers import filter_points, float_for_db
+from TPPTAnalysisSW import toolbox
+
+import base64
+
+
+ALLOWED_EVENTS = [0, 1, 2]  # going down, getting up, continous touch
+TOUCH_DOWN = 0
+CONTINUOUS_TOUCH = 2
+TOUCH_UP = 1
+
+def is_point_in_center(x, y, width, height, border_width, dut_svg = None, contour = None):
+    """
+    Check if point is in the center area of dut. If dut has svg form defined, please use
+    precalculated contour for faster analysis
+    :param x: point x coordinate
+    :param y: point y coordinate
+    :param width: dut width
+    :param height: dut height
+    :param border_width: width of the edge area
+    :param dut_svg: toolbox.dut.SvgRegion object
+    :param contour: contour calculated from the dut svg with toolbox
+    :return: True if point is in the center area, false if not
+    """
+    # We might have only SvgRegion object but no precalculated region
+    if dut_svg is not None and contour is None:
+        return is_point_in_center_svg(x, y, border_width, dut_svg)
+    elif dut_svg is not None and contour is not None:
+        return is_point_in_center_contour(x, y, border_width, dut_svg, contour)
+    else: # If there is no svg we assume the dut is square
+        return is_point_in_center_square(x, y, width, height, border_width)
+
+def is_point_in_center_svg(x, y, border_width, dut_svg):
+    """
+    Uses svg image through toolbox to define if point is inside center area
+    :param x: point x coordinate
+    :param y: point y coordinate
+    :param border_width: width of the edge area
+    :param dut_svg: toolbox.dut.SvgRegion object
+    :return: True if point is in the center area, false if not
+    """
+    res = dut_svg.filter_points_str_region([[x, y]], 'test_region', margin=border_width)
+    # If point is not in the center area filtering will return empty list
+    if len(res) > 0:
+        return True
+    else:
+        return False
+
+def is_point_in_center_contour(x, y, border_width, dut_svg, contour):
+    """
+    Uses precalculated contour through toolbox to define if point is inside center area
+    :param x: point x coordinate
+    :param y: point y coordinate
+    :param border_width: width of the edge area
+    :param dut_svg: toolbox.SvgRegion object
+    :param contour: precalculated contour
+    :return: True if point is in the center area, false if not
+    """
+    # If point is not in the center area filtering will return empty list
+    res = dut_svg.filter_points_contour([[x, y]], border_width, contour)
+    if len(res) > 0:
+        return True
+    else:
+        return False
+
+
+def is_point_in_center_square(x, y, width, height, border_width):
+    """
+    Check if given point is center point within region [0, width] x [0, height]
+    that has given border.
+    """
+    if x < border_width or x > width - border_width:
+        return False
+
+    if y < border_width or y > height - border_width:
+        return False
+
+    return True
+
+
+def get_passed_failed_target_points(swipe_points, target_points):
+    passfail_values = [analyzers.float_for_db(abs(p[1])) <= settings['max_avg_of_max_errors'] for p in swipe_points]
+
+    passed = [target_points[i] for (i, t) in enumerate(passfail_values) if t]
+    failed = [target_points[i] for (i, t) in enumerate(passfail_values) if not t]
+
+    return passed, failed
+
+class LinearitySummarySQL(Base):
+    __tablename__ = 'touch_linearity_lower_sensitivity_moving_noise_summary'
+
+    meta_id = Column(INTEGER, primary_key=True)
+    test_id = Column(DECIMAL(10, 0))
+
+    # "Pass-through" settings that are not needed for anything in the analysis
+    time_test_start = Column(DATETIME)
+    time_sequence_start = Column(DATETIME)
+    time_sequence_end = Column(DATETIME)
+    border_width = Column(DECIMAL(8,2))
+    finger_name = Column(VARCHAR(40))
+    finger_type = Column(VARCHAR(40))
+    finger_size = Column(DECIMAL(8,2))
+    step_size = Column(DECIMAL(8,2))
+    display_background = Column(VARCHAR(40))
+
+    test_type = Column(VARCHAR(40))
+    lift_off_distance = Column(DECIMAL(8,2))
+    swipe_speed = Column(DECIMAL(8,2))
+    ground_status = Column(VARCHAR(40))
+    noise_status = Column(VARCHAR(40))
+    swipe_direction = Column(VARCHAR(40))
+    log = Column(LONGTEXT)
+
+    number_of_fingers = Column(DECIMAL(8,2))
+
+    # Settings we need for analysis and that might still
+    # also be passed through
+
+    touch_area = Column(VARCHAR(40))
+
+    # Results that are created here in analysis
+
+    total_number_of_broken_lines = Column(DECIMAL(10,3))
+    total_number_of_missing_swipes = Column(INTEGER)
+
+    linearity_avg_of_error_avgs = Column(DECIMAL(10,3))
+    linearity_total_stdev_error = Column(DECIMAL(10,3))
+    linearity_avg_of_max_errors = Column(DECIMAL(10,3))
+    linearity_max_of_max_errors = Column(DECIMAL(10,3))
+    total_linearity_rms_error = Column(DECIMAL(10, 3))
+
+    moving_jitter_avg_of_error_avgs = Column(DECIMAL(10,3))
+    moving_jitter_total_stdev_error = Column(DECIMAL(10,3))
+    moving_jitter_avg_of_max_errors = Column(DECIMAL(10,3))
+    moving_jitter_max_of_max_errors = Column(DECIMAL(10,3))
+
+    offset_avg_of_error_avgs = Column(DECIMAL(10,3))
+    offset_total_stdev_error = Column(DECIMAL(10, 3))
+    offset_avg_of_max_errors = Column(DECIMAL(10, 3))
+    offset_max_of_max_errors = Column(DECIMAL(10, 3))
+    total_offset_rms_error = Column(DECIMAL(10, 3))
+
+    avg_of_avg_report_rate = Column(DECIMAL(8, 2))
+    total_std_report_rate = Column(DECIMAL(8, 2))
+    avg_of_min_report_rate = Column(DECIMAL(8, 2))
+    min_of_min_report_rate = Column(DECIMAL(8, 2))
+
+    successful_swipe_percentage = Column(DECIMAL(8, 2))
+
+    # The time of database entry creation set by the database server
+    created = Column(TIMESTAMP(), server_default=func.current_timestamp())
+
+
+
+class LinearityResultsSQL(Base):
+    __tablename__ = 'touch_linearity_lower_sensitivity_moving_noise_results'
+    meta_id = Column(INTEGER, primary_key=True)
+    test_meta_id = Column(INTEGER, ForeignKey('touch_linearity_lower_sensitivity_moving_noise_summary.meta_id', ondelete='CASCADE'), nullable=False)
+    line_id = Column(INTEGER)
+
+    linearity_mean_error = Column(DECIMAL(10,3))
+    linearity_stdev_error = Column(DECIMAL(10,3))
+    linearity_max_error = Column(DECIMAL(10,3))
+    linearity_rms_mean_error = Column(DECIMAL(10,3))
+
+    moving_jitter_mean_error = Column(DECIMAL(10,3))
+    moving_jitter_stdev_error = Column(DECIMAL(10,3))
+    moving_jitter_max_error = Column(DECIMAL(10,3))
+
+    offset_mean_error = Column(DECIMAL(10,3))
+    offset_stdev_error = Column(DECIMAL(10,3))
+    offset_max_error = Column(DECIMAL(10,3))
+    offset_rms_mean_error = Column(DECIMAL(10,3))
+
+    line_broken = Column(BOOLEAN)
+    number_of_fingers = Column(DECIMAL(8,2))
+
+    avg_report_rate = Column(DECIMAL(8, 2))
+    std_report_rate = Column(DECIMAL(8, 2))
+    min_report_rate = Column(DECIMAL(8, 2))
+
+
+class LinearityTest(TestBase):
+    """ Contains one linearity test and, thus, a new instance is  created for each individual test"""
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(13)
+    def create_testclass(*args, **kwargs):
+        return LinearityTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new OneFingerSwipeTest class """
+        super(LinearityTest, self).__init__(ddtest_row, *args, **kwargs)
+        self.meta_id = None
+        self.sql_summary_class = LinearitySummarySQL
+
+        # These are used if dut has an svg file for boundaries
+        self.dut_svg = None
+        self.test_region_contour = None
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+
+        return results['verdict']
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        template_params = super(LinearityTest, self).create_common_templateparams(**kwargs)
+
+        s = Timer()
+        s.Time("START")
+
+        results = self.read_test_results()
+
+        s.Time("Results")
+
+        template_params['test_parameters'] = (('Border width [mm]', results['border_width']),
+                                             ('Finger name', results['finger_name']),
+                                             ('Finger type', results['finger_type']),
+                                             ('Finger size [mm]', results['finger_size']),
+                                             ('Number of fingers', results['num_fingers']),
+                                             ('Display background', results['display_background']),
+                                             ('Step size [mm]', results['step_size']),
+                                             ('Lift off distance [mm]', results['lift_off_distance']),
+                                             ('Swipe speed [mm/s]', results['swipe_speed']),
+                                             ('Ground status', results['ground_status']),
+                                             ('Noise status', results['noise_status']),
+                                             ('Touch area', results['touch_area']),
+                                             ('Swipe direction', results['swipe_direction']))
+        template_params['results'] = results
+        template_params['figure'] = ImageFactory.create_image_name(self.test_id, "swipes")
+        template_params['detailed_figure'] = ImageFactory.create_image_name(self.test_id, "swipes", "detailed")
+        template_params['test_page'] = 'test_linearity.html'
+        template_params['test_script'] = 'test_page_subplots.js'
+        template_params['version'] = Version
+
+        self.disable_upload_button_if_already_uploaded(template_params)
+
+        template = MarkupTemplate(open("templates/test_configured_body.html"))
+        stream = template.generate(**(template_params))
+        s.Time("READY")
+
+        # Start creating the preview image already - the call will probably come soon
+        # NOTE: this is not necessary in summary tests
+        if 'noimages' not in kwargs:
+            threading.Thread(target = self.createpreviewimage, args = (results,)).start()
+
+        return stream.render('xhtml'), results['verdict']
+
+    def createpreviewimage(self, results):
+        """ Creates a swipe preview image with the specified results """
+        imagepath = ImageFactory.create_image_path(self.test_id, "swipes")
+        dbsession = measurementdb.get_database().session()
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+        title = 'Preview: Linearity ' + self.dut['program']
+        plot_factory.plot_swipes_on_target(imagepath, results, dutinfo, title=title)
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'swipes':
+            # See above: preview image is normally generated after the report creation
+            dbsession = measurementdb.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            pinfo = self.read_test_results(dbsession=dbsession, dutinfo=dutinfo)
+            title = 'Preview: Linearity ' + self.dut['program']
+            plot_factory.plot_swipes_on_target(imagepath, pinfo, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'jittdtls':
+            dbsession = measurementdb.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_swipe_details(args[0], dbsession=dbsession, dutinfo=dutinfo)
+            title = 'Preview: Linearity details ' + self.dut['program']
+            plot_factory.plot_one_finger_swipe_with_linear_fit(imagepath, results, dutinfo, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    # This is only used in createimage, do not get mixed up with read test results that partially
+    # does same things
+    def read_swipe_details(self, swipe_id, dbsession=None, dutinfo=None):
+        if dbsession is None:
+            dbsession = measurementdb.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(self.testsession['id'], dbsession)
+
+        line = dbsession.query(measurementdb.LinearityTest).filter(measurementdb.LinearityTest.id == swipe_id). \
+            order_by(measurementdb.LinearityTest.id). \
+            options(joinedload('linearity_results')).first()
+
+        panel_points = []
+
+        dut_width = dutinfo.dimensions[0]
+        dut_height = dutinfo.dimensions[1]
+
+        touch_area = line.touch_area
+        is_edge_area = (touch_area == "edge_area")
+        border_width = line.border_width
+
+        # If we have svg file for dut and have not yet defined the SvgRegion object
+        # for dut we should do it here
+        if self.dut_svg is None and dutinfo.svg_data is not None:
+            try:
+                self.dut_svg = toolbox.dut.SvgRegion()
+                self.dut_svg.load_string(base64.b64decode(dutinfo.svg_data).decode('ascii'))
+                # Pre-calculating the contour greatly speeds up the calculations
+                # (then the contour is only calculated once)
+                self.test_region_contour = self.dut_svg.region_str_to_contour('test_region')
+            except:
+                raise Exception('Failed to load dut svg file')
+
+        for point in line.linearity_results:
+            target_point = analyzers.panel_to_target_transform(dutinfo).transform((point.panel_x, point.panel_y))
+
+            # If test area is center, all points go through. With edge as test area, one has to filter the center
+            # points away
+            x, y = target_point[0], target_point[1]
+            if not is_edge_area or not is_point_in_center(x, y, dut_width, dut_height, border_width,
+                                                          self.dut_svg, self.test_region_contour):
+                panel_points.append((point.panel_x, point.panel_y))
+
+        target_points = analyzers.panel_to_target(panel_points, dutinfo)
+        line_start, line_end = analyzers.robot_to_target([(line.start_x, line.start_y), (line.end_x, line.end_y)],
+                                                         dutinfo)
+        swipe_points = analyzers.target_to_swipe(target_points, line_start, line_end)
+        jitterinfo = analyzers.analyze_swipe_jitter(swipe_points, float(settings['jitter_mask']))
+        linearity_results = analyzers.analyze_swipe_linearity(swipe_points)
+
+        passed, failed = get_passed_failed_target_points(swipe_points, target_points)
+
+        return {'passed_points': passed, 'failed_points': failed, 'swipe_points': swipe_points,
+                'line_start': line_start, 'line_end': line_end, 'jitters': jitterinfo['jitters'],
+                'linear_error': linearity_results['linear_error'], 'lin_error_max': linearity_results['lin_error_max'],
+                'lin_error_rms': linearity_results['lin_error_rms'],
+                'lin_error_avg': linearity_results['lin_error_avg']}
+
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+        s = Timer(2)
+        if dbsession is None:
+            dbsession = measurementdb.get_database().session()
+
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        dbswipes = dbsession.query(measurementdb.LinearityTest).filter(measurementdb.LinearityTest.test_id==self.test_id).\
+                                                                     options(joinedload('linearity_results')).\
+                                                                     order_by(measurementdb.LinearityTest.id)
+
+        dut_width = dutinfo.dimensions[0]
+        dut_height = dutinfo.dimensions[1]
+
+        # If we have svg file for dut and have not yet defined the SvgRegion object
+        # for dut we should do it here
+        if self.dut_svg is None and dutinfo.svg_data is not None:
+            try:
+                self.dut_svg = toolbox.dut.SvgRegion()
+                self.dut_svg.load_string(base64.b64decode(dutinfo.svg_data).decode('ascii'))
+                # Pre-calculating the contour greatly speeds up the calculations
+                # (then the contour is only calculated once)
+                self.test_region_contour = self.dut_svg.region_str_to_contour('test_region')
+            except:
+                raise Exception('Failed to load dut svg file')
+
+        s.Time('DB')
+
+        swipes = []
+        # swipe_additions is used to store values from individual swipes that are not
+        # included in the swipes (this is done not to break anything)
+        swipe_additions = {}
+        missing_swipes = []
+        swipe_id = 1
+        lines = []
+        passed_points = []
+        failed_points = []
+        num_of_broken_lines = 0
+        ghost_fingers = 0
+
+        num_valid_lines = 0
+        linearity_avg_of_error_avgs = None
+        linearity_avg_of_max_errors = None
+        linearity_max_of_max_errors = None
+        fitted_y = []
+
+        moving_jitter_avg_of_error_avgs = None
+        moving_jitter_avg_of_max_errors = None
+        moving_jitter_max_of_max_errors = None
+        jitters = []
+
+        offset_avg_of_error_avgs = None
+        offset_avg_of_max_errors = None
+        offset_max_of_max_errors = None
+        signed_offsets = []
+
+        avg_of_avg_report_rate = None
+        avg_of_min_report_rate = None
+        min_of_min_report_rate = None
+        report_rates = []
+        num_report_rates = 0
+
+        num_swipes = len(list(dbswipes))
+
+        touch_area = dbswipes[0].touch_area if num_swipes > 0 else ""
+        is_edge_area = (touch_area == "edge_area")
+        border_width = dbswipes[0].border_width if num_swipes > 0 else 0
+
+        # Checking/collecting all the conditions that might change the pass/faill limits
+        test_type = dbswipes[0].test_type if num_swipes > 0 else ""
+
+        if num_swipes > 0 and len(dbswipes[0].noise_status) == 0:
+            noise_inserted = False
+        else:
+            noise_inserted = True
+
+        # Accepted fingers list define which fingers we consider in the analysis
+        # as real fingers. All other fingers are ghost fingers
+        num_fingers = int(dbswipes[0].num_fingers) if num_swipes > 0 else 1
+        accepted_fingers = [i for i in range(num_fingers)]
+        if num_fingers > 1: # tool is multifinger
+            multifinger = True
+        else:
+            multifinger = False
+
+
+        # Setting the report rate limits based on noise insertion
+        # The limit is used for both single swipes and for total result
+        if not noise_inserted:
+            report_rate_limit = settings['min_report_rate']
+        elif not multifinger:
+            report_rate_limit = settings['min_report_rate_noise_inj_single']
+        else:  # multifinger and noise inserted
+            report_rate_limit = settings['min_report_rate_noise_inj_multi']
+
+        if test_type == 'sensitivity_lower':
+            # This will be typecasted to string after the value comparison is done
+            max_broken_lines = settings['max_broken_lines']
+        else:
+            max_broken_lines = 'N/A'
+
+        if test_type == 'noise_test_moving':
+            # This will be typecasted to string after the value comparison is done
+            max_ghost_fingers = settings['max_ghost_fingers']
+        else:
+            max_ghost_fingers = 'N/A'
+
+
+
+        for swipe in dbswipes:
+            assert(swipe.start_x is not None)
+            assert(swipe.start_y is not None)
+            assert(swipe.end_x is not None)
+            assert(swipe.end_y is not None)
+
+            finger_ids = []
+            touch_events = []
+            panel_points = []
+            swipe_report_rates = []
+            prev_timestamp = None
+            line_broken = False
+            ghost_finger = False
+
+            # Get points between first touch down and last touch up.
+            filtered_points = filter_points(swipe.linearity_results)
+
+            for point in filtered_points:
+                # we need to store all the finger_values that appear
+                if point.finger_id not in finger_ids:
+                    finger_ids.append(point.finger_id)
+                # any other event that allowed will cause the line to be "broken"
+                if point.event not in ALLOWED_EVENTS:
+                    line_broken = True
+                # We assume that the first finger(s) to touch the screen are the actual fingers and
+                # other fingers are ghosts. The accepted fingers list is based on amount of fingers in tool
+                if int(point.finger_id) in accepted_fingers and point.event in ALLOWED_EVENTS:
+                    # these points go forward to analysis
+                    target_point = analyzers.panel_to_target_transform(dutinfo).transform((point.panel_x, point.panel_y))
+
+                    # If test area is center, all points go through. With edge as test area, one has to
+                    # filter the center points away
+                    x, y = target_point[0], target_point[1]
+                    if not is_edge_area or not is_point_in_center(x, y, dut_width, dut_height, border_width,
+                                                                  self.dut_svg, self.test_region_contour):
+                        panel_points.append((point.panel_x, point.panel_y))
+                        touch_events.append((point.id, point.event))  # we need to know the order of touch events
+
+            # Compute delays between adjacent events. Finger ID and event type is ignored.
+            for point in swipe.linearity_results:
+                target_point = analyzers.panel_to_target_transform(dutinfo).transform((point.panel_x, point.panel_y))
+                x, y = target_point[0], target_point[1]
+                if is_point_in_center(x, y, dut_width, dut_height, border_width, self.dut_svg, self.test_region_contour):
+                    point_area = "center_area"
+                else:
+                    point_area = "edge_area"
+
+                # Only calculate report rate from points within the target area.
+                if prev_timestamp is None or point_area != touch_area:
+                    prev_timestamp = point.time
+                # If adjacent times are the same for some reason, ignore it.
+                elif point.time != prev_timestamp:
+                    report_rate = 1000.0 / (point.time - prev_timestamp)
+                    prev_timestamp = point.time
+
+                    swipe_report_rates.append(report_rate)
+                    report_rates.append(report_rate)
+
+            min_report_rate = None
+            avg_report_rate = None
+            std_report_rate = None
+
+            # if the whole swipe missed, there won't be any panel points
+            if len(panel_points) >= 2:
+                # it is assumed that touch events are read from database in order, so first
+                # and last are removed and there should only be continuous touch events left
+                if touch_events[0][1] != TOUCH_DOWN:
+                    line_broken = True
+                if touch_events[-1][1] != TOUCH_UP:
+                    line_broken = True
+
+                for event in touch_events[1:-1]:
+                    if event[1] != CONTINUOUS_TOUCH:
+                        line_broken = True
+
+                # Line is not empty but is broken.
+                # If line is empty i.e. len(panel_points) == 0 then can't be broken.
+                if line_broken:
+                    num_of_broken_lines += 1
+
+                # If we have more than one finger id appearing in one swipe it means we have ghost finger
+                if len(finger_ids) > 1:
+                    ghost_fingers += 1
+                    ghost_finger = True
+
+            # Compute report rate measures for the swipe.
+            if len(swipe_report_rates) > 0:
+                # num_report_rates is used to compute the average values over each swipe.
+                num_report_rates += 1
+                min_report_rate = min(swipe_report_rates)
+                avg_report_rate = np.average(swipe_report_rates)
+
+                std_report_rate = np.std(swipe_report_rates)
+
+                # Accumulate reporting rate values to later compute average values for the whole test.
+                if avg_of_avg_report_rate is None: avg_of_avg_report_rate = 0.0
+                avg_of_avg_report_rate += avg_report_rate
+
+                if avg_of_min_report_rate is None: avg_of_min_report_rate = 0.0
+                avg_of_min_report_rate += min_report_rate
+
+                if min_of_min_report_rate is None:
+                    min_of_min_report_rate = min_report_rate
+                else:
+                    min_of_min_report_rate = min(min_of_min_report_rate, min_report_rate)
+
+            # Transform panel -> robot -> swipe
+            target_points = analyzers.panel_to_target(panel_points, dutinfo)
+            swipe_start, swipe_end = analyzers.robot_to_target([(swipe.start_x, swipe.start_y), (swipe.end_x, swipe.end_y)], dutinfo)
+            lines.append((swipe_start, swipe_end))
+
+            # Transform swipe points to frame where x-axis is the robot swipe line and y-axis is perpendicular to that.
+            # Swipe points is a list of tuples (x, y).
+            swipe_points = analyzers.target_to_swipe(target_points, swipe_start, swipe_end)
+
+            swipe_linearity = analyzers.analyze_swipe_linearity(swipe_points)
+            swipe_jitter = analyzers.analyze_swipe_jitter(swipe_points, float(settings['jitter_mask']))
+            swipe_offset = analyzers.analyze_swipe_offset(swipe_points)
+
+            # There needs to be at least 1 non-repeated point in jitter data for swipe to be valid.
+            if len(panel_points) > 0 and len(swipe_jitter['jitters_no_none']) > 0:
+                swipe_empty = False
+                num_valid_lines += 1
+            else:
+                swipe_empty = True
+
+            swipe_additions[swipe_id] = {'linearity_mean_error': float_for_db(swipe_linearity['lin_error_avg']),
+                                         'linearity_stdev_error': float_for_db(swipe_linearity['lin_error_stdev']),
+                                         'linearity_max_error': float_for_db(swipe_linearity['lin_error_max']),
+                                         'linearity_rms_mean_error': float_for_db(swipe_linearity['lin_error_rms']),
+                                         'moving_jitter_mean_error': float_for_db(swipe_jitter['jitter_avg']),
+                                         'moving_jitter_stdev_error': float_for_db(swipe_jitter['jitter_stdev']),
+                                         'moving_jitter_max_error': float_for_db(swipe_jitter['max_jitter']),
+                                         'offset_mean_error': float_for_db(swipe_offset['offset_mean']),
+                                         'offset_stdev_error': float_for_db(swipe_offset['offset_stdev']),
+                                         'offset_max_error': float_for_db(swipe_offset['offset_max']),
+                                         'offset_rms_mean_error': float_for_db(swipe_offset['offset_rms_mean']),
+                                         'min_report_rate': float_for_db(min_report_rate),
+                                         'avg_report_rate': float_for_db(avg_report_rate),
+                                         'std_report_rate': float_for_db(std_report_rate),
+                                         'line_broken': line_broken,
+                                         'num_of_fingers': len(finger_ids), #ghost finger detection
+                                         'ghost_finger_detected': ghost_finger,
+                                         'swipe_empty': swipe_empty
+                                        }
+
+            # Accumulate linearity, jitter and offset values to later compute average values for the whole test.
+            if not swipe_empty:
+                assert isinstance(swipe_linearity['fitted_y'], list)
+                fitted_y += swipe_linearity['fitted_y']
+
+                assert isinstance(swipe_jitter['jitters_no_none'], list)
+                jitters += swipe_jitter['jitters_no_none']
+
+                signed_offsets += [point[1] for point in swipe_points]
+
+                if linearity_avg_of_error_avgs is None: linearity_avg_of_error_avgs = 0.0
+                linearity_avg_of_error_avgs += swipe_linearity['lin_error_avg']
+
+                if linearity_avg_of_max_errors is None: linearity_avg_of_max_errors = 0.0
+                linearity_avg_of_max_errors += swipe_linearity['lin_error_max']
+
+                if linearity_max_of_max_errors is None: linearity_max_of_max_errors = 0.0
+                linearity_max_of_max_errors = max(linearity_max_of_max_errors, swipe_linearity['lin_error_max'])
+
+                if moving_jitter_avg_of_error_avgs is None: moving_jitter_avg_of_error_avgs = 0.0
+                moving_jitter_avg_of_error_avgs += swipe_jitter['jitter_avg']
+
+                if moving_jitter_avg_of_max_errors is None: moving_jitter_avg_of_max_errors = 0.0
+                moving_jitter_avg_of_max_errors += swipe_jitter['max_jitter']
+
+                if moving_jitter_max_of_max_errors is None: moving_jitter_max_of_max_errors = 0.0
+                moving_jitter_max_of_max_errors = max(moving_jitter_max_of_max_errors, swipe_jitter['max_jitter'])
+
+                if offset_avg_of_error_avgs is None: offset_avg_of_error_avgs = 0.0
+                offset_avg_of_error_avgs += swipe_offset['offset_mean']
+
+                if offset_avg_of_max_errors is None: offset_avg_of_max_errors = 0.0
+                offset_avg_of_max_errors += swipe_offset['offset_max']
+
+                if offset_max_of_max_errors is None: offset_max_of_max_errors = 0.0
+                offset_max_of_max_errors = max(offset_max_of_max_errors, swipe_offset['offset_max'])
+
+            passed, failed = get_passed_failed_target_points(swipe_points, target_points)
+            passed_points.extend(passed)
+            failed_points.extend(failed)
+
+            # Swipe is missing if there are no points in it.
+            if len(swipe_points) == 0:
+                missing_swipes.append(swipe.id)
+
+            # Verdict of individual swipe.
+            swipe_verdict = "N/A"
+
+            # Determine individual swipe linearity verdict. This affects swipe verdict.
+            swipe_max_linearity = None
+            if len(swipe_points) > 0:
+                swipe_max_linearity = analyzers.float_for_db(swipe_linearity['lin_error_max'])
+                swipe_verdict = "Fail" if swipe_max_linearity > settings['max_avg_of_max_errors'] else "Pass"
+
+            # Determine individual swipe offset verdict.
+            swipe_max_offset = None
+            if len(swipe_points) > 0:
+                swipe_max_offset = analyzers.float_for_db(swipe_offset['offset_max'])
+
+            # Determine individual swipe jitter verdict.
+            swipe_max_jitter = None
+            if len(swipe_points) > 0:
+                swipe_max_jitter = analyzers.float_for_db(swipe_jitter['max_jitter'])
+
+
+            # Report rate affects swipe verdict.
+            swipe_min_report_rate = None
+            if min_report_rate is not None:
+                swipe_min_report_rate = analyzers.float_for_db(min_report_rate)
+                if swipe_verdict != "Fail":
+                    swipe_verdict = "Pass" if min_report_rate >= report_rate_limit else "Fail"
+
+            # Broken line makes swipe fail.
+            if line_broken:
+                swipe_verdict = "Fail"
+
+            swipes.append({
+                "id": swipe_id,
+                "max_linearity": swipe_max_linearity,
+                "max_jitter": swipe_max_jitter,
+                "max_offset": swipe_max_offset,
+                "min_report_rate": swipe_min_report_rate,
+                "verdict": swipe_verdict,
+                "image_name": ImageFactory.create_image_name(self.test_id, "jittdtls", str(swipe.id))
+            })
+            swipe_id += 1
+
+        s.Time('Analysis')
+
+        total_std_report_rate = None
+
+        # Compute average of report rate from values accumulated from individual swipes.
+        if num_report_rates > 0:
+            avg_of_avg_report_rate = avg_of_avg_report_rate / num_report_rates
+            avg_of_min_report_rate = avg_of_min_report_rate / num_report_rates
+
+        if len(report_rates) > 0:
+            total_std_report_rate = np.std(report_rates)
+
+        # Compute total averages of linearity, jitter and offset from values accumulated from individual swipes.
+        if num_valid_lines > 0:
+            if linearity_avg_of_error_avgs is not None:
+                linearity_avg_of_error_avgs = linearity_avg_of_error_avgs / num_valid_lines
+
+            if linearity_avg_of_max_errors is not None:
+                linearity_avg_of_max_errors = linearity_avg_of_max_errors / num_valid_lines
+
+            if moving_jitter_avg_of_error_avgs is not None:
+                moving_jitter_avg_of_error_avgs = moving_jitter_avg_of_error_avgs / num_valid_lines
+
+            if moving_jitter_avg_of_max_errors is not None:
+                moving_jitter_avg_of_max_errors = moving_jitter_avg_of_max_errors / num_valid_lines
+
+            if offset_avg_of_error_avgs is not None:
+                offset_avg_of_error_avgs = offset_avg_of_error_avgs / num_valid_lines
+
+            if offset_avg_of_max_errors is not None:
+                offset_avg_of_max_errors = offset_avg_of_max_errors / num_valid_lines
+
+        linearity_total_stdev_error = None
+        total_linearity_rms_error = None
+        moving_jitter_total_stdev_error = None
+        offset_total_stdev_error = None
+        total_offset_rms_error = None
+
+        if len(fitted_y) > 0:
+            linearity_total_stdev_error = np.std(fitted_y, ddof=1)
+            total_linearity_rms_error = np.sqrt(np.mean(np.power(fitted_y, 2)))
+
+        if len(jitters) > 0:
+            moving_jitter_total_stdev_error = np.sqrt(np.mean(np.power(jitters, 2)))
+
+        if len(signed_offsets) > 0:
+            offset_total_stdev_error = np.std(signed_offsets, ddof=1)
+            total_offset_rms_error = np.sqrt(np.mean(np.power(signed_offsets, 2)))
+
+        missing_count = len(missing_swipes)
+
+        # Determine total test case verdicts. Note that some verdicts can be "N/A" and these should not affect total verdict.
+        verdict = "N/A"
+
+        # Linearity verdict for average of maxima affects the total test case verdict
+        linearity_max_verdict = "N/A"
+        if linearity_avg_of_max_errors is not None:
+            if linearity_avg_of_max_errors <= settings["max_avg_of_max_errors"]:
+                linearity_max_verdict = "Pass"
+                if verdict != "Fail": verdict = "Pass"
+            else:
+                linearity_max_verdict = "Fail"
+                verdict = "Fail"
+
+        # Linearity total rms verdict affects the total test case verdict
+        linearity_rms_verdict = "N/A"
+        if total_linearity_rms_error is not None:
+            if total_linearity_rms_error <= settings["max_rms_error"]:
+                linearity_rms_verdict = "Pass"
+                if verdict != "Fail": verdict = "Pass"
+            else:
+                linearity_rms_verdict = "Fail"
+                verdict = "Fail"
+
+        # Report rate affects the total test case verdict and report rate
+        # limit depends on test conditions
+        report_rate_verdict = "N/A"
+        if avg_of_min_report_rate is not None:
+            if avg_of_min_report_rate >= report_rate_limit:
+                report_rate_verdict = "Pass"
+                if verdict != "Fail": verdict = "Pass"
+            else:
+                report_rate_verdict = "Fail"
+                verdict = "Fail"
+
+        # Broken lines affect the total test case verdict in the sensitivity (lower) test case
+        broken_lines_verdict = 'Pass'
+        if test_type == 'sensitivity_lower':
+            if num_of_broken_lines != max_broken_lines:
+                broken_lines_verdict = "Pass"
+                if verdict != "Fail": verdict = "Pass"
+            else:
+                broken_lines_verdict = "Fail"
+                verdict = "Fail"
+            max_broken_lines = str(max_broken_lines)
+
+        # Broken lines affect the total test case verdict in the noise test (moving) test case
+        ghost_fingers_verdict = "Pass"
+        if test_type == 'noise_test_moving':
+            if ghost_fingers <= max_ghost_fingers:
+                ghost_fingers_verdict = "Pass"
+                if verdict != "Fail": verdict = "Pass"
+            else:
+                ghost_fingers_verdict = "Fail"
+                verdict = "Fail"
+            max_ghost_fingers = str(max_ghost_fingers)
+
+
+        if len(swipes) > 0:
+            # Successful swipes are ones that are not missing nor broken. Not that missing line is not broken.
+            successful_swipe_percentage = 100.0 * (len(swipes) - missing_count - num_of_broken_lines) / len(swipes)
+            # Missing swipes are the one that are completely lost
+            missing_swipe_percentage = 100*(missing_count/len(swipes))
+        else:
+            successful_swipe_percentage = 0.0
+            missing_swipe_percentage = 100
+
+        if missing_swipe_percentage <= settings['max_missing_swipes']:
+            missing_swipes_verdict = "Pass"
+        else:
+            missing_swipes_verdict = "Fail"
+
+        results = {'verdict': verdict,
+                   'linearity_max_verdict': linearity_max_verdict,
+                   'linearity_rms_verdict': linearity_rms_verdict,
+                   'report_rate_verdict': report_rate_verdict,
+                   'report_rate_limit': report_rate_limit,
+                   'missing_swipes_verdict': missing_swipes_verdict,
+                   'ghost_fingers_verdict': ghost_fingers_verdict,
+                   'max_ghost_fingers': max_ghost_fingers,
+                   'broken_lines_verdict': broken_lines_verdict,
+                   'swipes': swipes,
+                   'swipe_additions': swipe_additions,
+                   'swipe_count': len(swipes),
+                   'missing_swipes': missing_swipes,
+                   'missing_swipes_percentage': missing_swipe_percentage,
+                   'missing_count': missing_count,
+                   'lines': lines,
+                   'num_of_broken_lines': num_of_broken_lines,
+                   'max_broken_lines': max_broken_lines,
+                   'num_of_ghost_fingers': ghost_fingers,
+                   'passed_points': passed_points,
+                   'failed_points': failed_points,
+                   'linearity_avg_of_error_avgs': float_for_db(linearity_avg_of_error_avgs),
+                   'linearity_avg_of_max_errors': float_for_db(linearity_avg_of_max_errors),
+                   'linearity_max_of_max_errors': float_for_db(linearity_max_of_max_errors),
+                   'linearity_total_stdev_error': float_for_db(linearity_total_stdev_error),
+                   'total_linearity_rms_error': float_for_db(total_linearity_rms_error),
+                   'moving_jitter_avg_of_error_avgs': float_for_db(moving_jitter_avg_of_error_avgs),
+                   'moving_jitter_avg_of_max_errors': float_for_db(moving_jitter_avg_of_max_errors),
+                   'moving_jitter_max_of_max_errors': float_for_db(moving_jitter_max_of_max_errors),
+                   'moving_jitter_total_stdev_error': float_for_db(moving_jitter_total_stdev_error),
+                   'offset_avg_of_error_avgs': float_for_db(offset_avg_of_error_avgs),
+                   'offset_avg_of_max_errors': float_for_db(offset_avg_of_max_errors),
+                   'offset_max_of_max_errors': float_for_db(offset_max_of_max_errors),
+                   'offset_total_stdev_error': float_for_db(offset_total_stdev_error),
+                   'total_offset_rms_error': float_for_db(total_offset_rms_error),
+                   'avg_of_avg_report_rate': float_for_db(avg_of_avg_report_rate),
+                   'avg_of_min_report_rate': float_for_db(avg_of_min_report_rate),
+                   'min_of_min_report_rate': float_for_db(min_of_min_report_rate),
+                   'total_std_report_rate': float_for_db(total_std_report_rate),
+                   'successful_swipe_percentage': successful_swipe_percentage,
+                   'finger_name': dbswipes[0].finger_name if num_swipes > 0 else "",
+                   'finger_type': dbswipes[0].finger_type if num_swipes > 0 else "",
+                   'finger_size': dbswipes[0].finger_size if num_swipes > 0 else 0,
+                   'num_fingers': num_fingers,
+                   'step_size': dbswipes[0].step_size if num_swipes > 0 else 0,
+                   'border_width': dbswipes[0].border_width if num_swipes > 0 else 0,
+                   'display_background': dbswipes[0].display_background if num_swipes > 0 else "",
+                   'lift_off_distance': dbswipes[0].lift_off_distance if num_swipes > 0 else 0,
+                   'swipe_speed': dbswipes[0].swipe_speed if num_swipes > 0 else 0,
+                   'ground_status': dbswipes[0].ground_status if num_swipes > 0 else "",
+                   'noise_status': dbswipes[0].noise_status if num_swipes > 0 else "",
+                   'swipe_direction': dbswipes[0].swipe_direction if num_swipes > 0 else "",
+                   'touch_area': dbswipes[0].touch_area if num_swipes > 0 else "",
+                   'test_type': test_type
+                  }
+
+        return results
+
+    def upload_sql_data(self, session):
+        # Add test summary to database
+        test_results = self.read_test_results()
+        linearitysummary = LinearitySummarySQL()
+        linearitysummary.test_id = self.test_id
+
+        test_item = self.get_test_item()
+        test_session = self.get_test_session()
+
+        linearitysummary.time_test_start = timestr_to_datetime(test_item.starttime)
+        linearitysummary.time_sequence_start = timestr_to_datetime(test_session.starttime)
+
+        # End time is None if sequence was not completed.
+        if test_session.endtime is not None:
+            linearitysummary.time_sequence_end = timestr_to_datetime(test_session.endtime)
+
+        linearitysummary.finger_name = test_results["finger_name"]
+        linearitysummary.finger_type = test_results["finger_type"]
+        linearitysummary.finger_size = test_results["finger_size"]
+        linearitysummary.number_of_fingers = test_results["num_fingers"]
+        linearitysummary.step_size = test_results["step_size"]
+        linearitysummary.border_width = test_results["border_width"]
+        linearitysummary.display_background = test_results["display_background"]
+        linearitysummary.lift_off_distance = test_results["lift_off_distance"]
+        linearitysummary.swipe_speed = test_results["swipe_speed"]
+        linearitysummary.ground_status = test_results["ground_status"]
+        linearitysummary.noise_status = test_results["noise_status"]
+        linearitysummary.swipe_direction = test_results["swipe_direction"]
+        linearitysummary.touch_area = test_results["touch_area"]
+        linearitysummary.log = self.test_item['kmsg_log'] # The test_item comes form Testbase
+        linearitysummary.test_type = test_results['test_type']
+
+        linearitysummary.total_number_of_broken_lines = test_results['num_of_broken_lines']
+        linearitysummary.total_number_of_missing_swipes = test_results['missing_count']
+
+        linearitysummary.linearity_avg_of_error_avgs = test_results['linearity_avg_of_error_avgs']
+        linearitysummary.linearity_avg_of_max_errors = test_results['linearity_avg_of_max_errors']
+        linearitysummary.linearity_max_of_max_errors = test_results['linearity_max_of_max_errors']
+        linearitysummary.linearity_total_stdev_error = test_results['linearity_total_stdev_error']
+        linearitysummary.total_linearity_rms_error = test_results['total_linearity_rms_error']
+
+        linearitysummary.moving_jitter_avg_of_error_avgs = test_results['moving_jitter_avg_of_error_avgs']
+        linearitysummary.moving_jitter_avg_of_max_errors = test_results['moving_jitter_avg_of_max_errors']
+        linearitysummary.moving_jitter_max_of_max_errors = test_results['moving_jitter_max_of_max_errors']
+        linearitysummary.moving_jitter_total_stdev_error = test_results['moving_jitter_total_stdev_error']
+
+        linearitysummary.offset_avg_of_error_avgs = test_results['offset_avg_of_error_avgs']
+        linearitysummary.offset_avg_of_max_errors = test_results['offset_avg_of_max_errors']
+        linearitysummary.offset_max_of_max_errors = test_results['offset_max_of_max_errors']
+        linearitysummary.offset_total_stdev_error = test_results['offset_total_stdev_error']
+        linearitysummary.total_offset_rms_error = test_results['total_offset_rms_error']
+
+        linearitysummary.avg_of_avg_report_rate = test_results['avg_of_avg_report_rate']
+        linearitysummary.avg_of_min_report_rate = test_results['avg_of_min_report_rate']
+        linearitysummary.min_of_min_report_rate = test_results['min_of_min_report_rate']
+        linearitysummary.total_std_report_rate = test_results['total_std_report_rate']
+
+        linearitysummary.successful_swipe_percentage = test_results['successful_swipe_percentage']
+
+        session.add(linearitysummary)
+        session.commit()
+
+        # Add individual swipes to database (NOTE: test meta_id is only created when
+        # the test summary is added to database)
+        test_meta_id = linearitysummary.meta_id
+        for swipe in test_results["swipes"]:
+            # Reading values from swipe list
+            swipe_id = int(swipe["id"])
+
+            # metadata
+            linearityresults = LinearityResultsSQL()
+            linearityresults.test_meta_id = test_meta_id
+            linearityresults.line_id = swipe_id
+
+            swipe_additions = test_results['swipe_additions'][swipe_id]
+
+            linearityresults.linearity_mean_error = swipe_additions['linearity_mean_error']
+            linearityresults.linearity_stdev_error = swipe_additions['linearity_stdev_error']
+            linearityresults.linearity_max_error = swipe_additions['linearity_max_error']
+            linearityresults.linearity_rms_mean_error = swipe_additions['linearity_rms_mean_error']
+
+            linearityresults.moving_jitter_mean_error = swipe_additions['moving_jitter_mean_error']
+            linearityresults.moving_jitter_stdev_error = swipe_additions['moving_jitter_stdev_error']
+            linearityresults.moving_jitter_max_error = swipe_additions['moving_jitter_max_error']
+
+            linearityresults.offset_mean_error = swipe_additions['offset_mean_error']
+            linearityresults.offset_stdev_error = swipe_additions['offset_stdev_error']
+            linearityresults.offset_max_error = swipe_additions['offset_max_error']
+            linearityresults.offset_rms_mean_error = swipe_additions['offset_rms_mean_error']
+
+            linearityresults.avg_report_rate = swipe_additions['avg_report_rate']
+            linearityresults.std_report_rate = swipe_additions['std_report_rate']
+            linearityresults.min_report_rate = swipe_additions['min_report_rate']
+
+            linearityresults.line_broken = swipe_additions['line_broken']
+            linearityresults.number_of_fingers = swipe_additions['num_of_fingers']
+
+            session.add(linearityresults)
+            session.commit()
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_multifinger_swipe.py b/TPPTAnalysisSW/tests/test_multifinger_swipe.py
new file mode 100644
index 0000000..b980c3a
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_multifinger_swipe.py
@@ -0,0 +1,363 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import math
+import numpy as np
+import numpy.linalg as npl
+from sqlalchemy.orm import joinedload
+from genshi.template import MarkupTemplate
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.measurementdb import get_database, MultifingerSwipeTest, MultifingerSwipeResults
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.settings import settings
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.analyzers as analyzers
+
+
+class MultiFingerSwipeTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(5)
+    def create_testclass(*args, **kwargs):
+        return MultiFingerSwipeTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.ddttest (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new MultiFingerSwipeTest class """
+        super(MultiFingerSwipeTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        verdict = results['missing_swipes_verdict'] and results['errors_verdict']
+        if verdict:
+            if results['offset_verdict'] is None:
+                verdict = None
+            elif results['jitter_verdict'] is None:
+                # what to do???
+                verdict = results['offset_verdict']
+            else:
+                verdict = results['offset_verdict'] and results['jitter_verdict']
+
+        return "N/A" if verdict is None else "Pass" if verdict else "Fail"
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+        self.clearanalysis()
+
+        # Create common template parameters (including ddttest dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(MultiFingerSwipeTest, self).create_common_templateparams(**kwargs)
+
+        t = Timer()
+
+        # data for the report
+        results = self.read_test_results()
+        templateParams['results'] = results
+
+        t.Time("Results")
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_multifinger_swipe.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+
+        verdict = results['missing_swipes_verdict'] and results['errors_verdict']
+        if verdict:
+            if results['offset_verdict'] is None:
+                verdict = None
+            elif results['jitter_verdict'] is None:
+                # what to do???
+                verdict = results['offset_verdict']
+            else:
+                verdict = results['offset_verdict'] and results['jitter_verdict']
+
+        return stream.render('xhtml'), "N/A" if verdict is None else "Pass" if verdict else "Fail"
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'swpgen':
+            t = Timer(1)
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            passed_points = []
+            failed_points = []
+            lines = []
+            for multiswipe in results['swipes']:
+                for finger in multiswipe['fingers']:
+                    for points in finger['passed_points'].values():
+                        passed_points.extend(points)
+                    for points in finger['failed_points'].values():
+                        failed_points.extend(points)
+                    lines.append((finger['swipe_start'], finger['swipe_end']))
+            pinfo = {'passed_points': passed_points,
+                     'failed_points': failed_points,
+                     'lines': lines}
+            t.Time("Results")
+            title = 'Preview: Multifinger swipe overview ' + self.dut['program']
+            plot_factory.plot_swipes_on_target(imagepath, pinfo, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'swpdtls':
+            t = Timer(1)
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_swipe_results(args[0], dbsession=dbsession, dutinfo=dutinfo, **kwargs)
+            t.Time("Results")
+            title = 'Preview: Multifinger swipe details ID:' + args[0]
+            plot_factory.plot_multifinger_swipedetails(imagepath, results, dutinfo, title=title, **kwargs)
+            t.Time("Image")
+        else:
+            raise cherrypy.HTTPError(message="No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo=None, dbsession=None, **kwargs):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        s = Timer(2)
+        results = dbsession.query(MultifingerSwipeTest).filter(MultifingerSwipeTest.test_id == self.test_id). \
+            order_by(MultifingerSwipeTest.id).options(joinedload('multi_finger_swipe_results')).all()
+
+        s.Time("DB Results")
+        swipes = []
+        errors = set()
+        max_offset = None
+        max_jitter = None
+        missing_swipes = 0
+        total_swipes = 0
+        swipe_id = 0
+
+        for multiswipe in results:
+            swipe = self.calculate_swipe_details(multiswipe, dutinfo, **kwargs)
+            swipe_id += 1
+            swipe['id'] = swipe_id
+            swipes.append(swipe)
+
+            # Calculate common parameters
+            errors = errors.union(swipe['errors'])
+            max_offset = swipe['max_offset'] if max_offset is None else max(swipe['max_offset'], max_offset)
+            max_jitter = swipe['max_jitter'] if max_jitter is None else max(swipe['max_jitter'], max_jitter)
+            missing_swipes += swipe['missing_swipes']
+            total_swipes += swipe['num_fingers']
+
+        s.Time("Analysis")
+
+        results = {'swipes': swipes,
+                   'errors': errors,
+                   'offset_verdict': None if max_offset is None else max_offset <= settings['maxoffset'],
+                   'jitter_verdict': None if max_jitter is None else max_jitter <= settings['maxjitter'],
+                   'max_offset': max_offset,
+                   'max_jitter': max_jitter,
+                   'edge_analysis_done': False,
+                   'total_swipes': total_swipes,
+                   'missing_swipes': missing_swipes,
+                   'missing_swipes_verdict': (missing_swipes <= settings['maxmissingswipes']),
+                   'errors_verdict': len(errors) == 0,
+                   'images': [(ImageFactory.create_image_name(self.test_id, 'swpgen'),
+                               ImageFactory.create_image_name(self.test_id, 'swpgen', 'detailed')),
+                              ],
+                   }
+
+        return results
+
+    def read_swipe_results(self, swipe_id, dbsession=None, dutinfo=None, **kwargs):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        multiswipe = dbsession.query(MultifingerSwipeTest).filter(MultifingerSwipeTest.id == swipe_id). \
+            options(joinedload('multi_finger_swipe_results')).first()
+
+        return self.calculate_swipe_details(multiswipe, dutinfo, **kwargs)
+
+    def calculate_swipe_details(self, multiswipe, dutinfo, **kwargs):
+        # Transfer swipe info to individual swipes
+        start_point, end_point = analyzers.robot_to_target([(multiswipe.start_x, multiswipe.start_y),
+                                                            (multiswipe.end_x, multiswipe.end_y)], dutinfo)
+        separation_x = multiswipe.separation_distance * math.cos(math.radians(multiswipe.separation_angle))
+        separation_y = multiswipe.separation_distance * math.sin(math.radians(multiswipe.separation_angle))
+        start_points_x = [start_point[0] + i * separation_x for i in range(multiswipe.number_of_fingers)]
+        start_points_y = [start_point[1] + i * separation_y for i in range(multiswipe.number_of_fingers)]
+        end_points_x = [end_point[0] + i * separation_x for i in range(multiswipe.number_of_fingers)]
+        end_points_y = [end_point[1] + i * separation_y for i in range(multiswipe.number_of_fingers)]
+        startpoints = list(zip(start_points_x, start_points_y))
+        endpoints = list(zip(end_points_x, end_points_y))
+
+        allpoints = analyzers.panel_to_target([(p.panel_x, p.panel_y) for p in multiswipe.multi_finger_swipe_results],
+                                              dutinfo)
+        swipepoints = analyzers.target_to_swipe(allpoints, startpoints[0], endpoints[0])
+        swipestarts = analyzers.target_to_swipe(startpoints, startpoints[0], endpoints[0])
+        fingerids = np.array([p.finger_id for p in multiswipe.multi_finger_swipe_results])
+
+        swipe_errors = set()
+        # Check if we have the correct number of finger ids
+        uniqids = np.unique(fingerids)
+        if len(uniqids) > multiswipe.number_of_fingers:
+            swipe_errors.add('Too many fingers were detected in input')
+
+        pointsbyid = {}
+        swipepointsbyid = {}
+        for id in uniqids:
+            pointsbyid[id] = [p for pid, p in zip(fingerids, allpoints) if pid == id]
+            swipepointsbyid[id] = np.array([np.array(p) for pid, p in zip(fingerids, swipepoints) if pid == id])
+
+        # Map the finger ids in the database to the id's in the points list
+        max_jitter = None
+        fingers = []
+        finger_offsets = []
+        missing_fingers = 0
+
+        fingerids = self.find_fingerids(swipestarts, swipepointsbyid, swipe_errors)
+        for startpoint, endpoint, swipestart, ids_in_place in zip(startpoints, endpoints, swipestarts, fingerids):
+            fingerpoints = {}
+            swipepoints = {}
+            passed = {}
+            failed = {}
+            jitters = {}
+            results = []
+            finger = {'swipe_start': startpoint,
+                      'swipe_end': endpoint,
+                      'points': fingerpoints,
+                      'passed_points': passed,
+                      'failed_points': failed,
+                      'swipe_points': swipepoints,
+                      'jitters': jitters,
+                      'results': results,
+                      'verdict': False}
+            fingers.append(finger)
+            if ids_in_place is None:
+                # Missing finger
+                # swipe_errors.add('Not all fingers were detected in input')
+                finger_offsets.append(None)
+                missing_fingers += 1
+                continue
+
+            max_finger_offset = None
+            max_finger_jitter = None
+            for id in ids_in_place:
+                fingerpoints[id] = pointsbyid[id]
+                swipepoints[id] = swipepointsbyid[
+                                      id] - swipestart  # Transform coordinates to individual swipe coordinates
+                results = analyzers.analyze_swipe_jitter(swipepointsbyid[id], float(settings['jittermask']))
+                jitters[id] = results['jitters']
+                offsets = np.abs(swipepointsbyid[id][:, 1] - swipestart[1])
+                max_id_offset = analyzers.round_dec(np.max(offsets))
+                results['max_offset'] = max_id_offset
+                # Passed/failed points to visualization
+                passfail_values = [analyzers.round_dec(o) <= settings['maxoffset'] for p, o in
+                                   zip(swipepoints[id], offsets)]
+                passed[id] = [fingerpoints[id][i] for (i, t) in enumerate(passfail_values) if t]
+                failed[id] = [fingerpoints[id][i] for (i, t) in enumerate(passfail_values) if not t]
+                max_finger_offset = max_id_offset if max_finger_offset is None else max(max_id_offset,
+                                                                                        max_finger_offset)
+                max_id_jitter = analyzers.round_dec(results['max_jitter'])
+                max_finger_jitter = max_id_jitter if max_finger_jitter is None else max(max_id_jitter,
+                                                                                        max_finger_jitter)
+            finger['max_offset'] = max_finger_offset
+            finger_offsets.append(max_finger_offset)
+            finger['max_jitter'] = max_finger_jitter
+            if max_finger_jitter is not None:
+                max_jitter = max_finger_jitter if max_jitter is None else max(max_jitter, max_finger_jitter)
+
+            if max_finger_offset <= settings['maxoffset']:
+                finger['verdict'] = True
+            # else:
+            # swipe_errors.add('Maximum offset exceeded')
+
+        max_offset = None
+        # Find max offset from non-None offsets
+        if finger_offsets.count(None) < len(finger_offsets):
+            max_offset = max([o for o in finger_offsets if o is not None])
+
+        if max_offset is None:
+            verdict = None
+            verdict_text = 'N/A'
+            verdict_class = ''
+        else:
+            verdict = max_offset <= settings['maxoffset'] and max_jitter <= settings['maxjitter'] and (
+                        len(swipe_errors) == 0)
+            verdict_text = 'Pass' if verdict else 'Fail'
+            verdict_class = 'passed' if verdict else 'failed'
+
+        swipe = {'num_fingers': multiswipe.number_of_fingers,
+                 'startpoints': startpoints,
+                 'endpoints': endpoints,
+                 'missing_swipes': missing_fingers,
+                 'offsets': finger_offsets,
+                 'fingerids': fingerids,
+                 'fingers': fingers,
+                 'max_offset': max_offset,
+                 'max_jitter': max_jitter,
+                 'errors': swipe_errors,
+                 'verdict': verdict,
+                 'verdict_text': verdict_text,
+                 'verdict_class': verdict_class,
+                 'image': ImageFactory.create_image_name(self.test_id, 'swpdtls', str(multiswipe.id))}
+
+        return swipe
+
+    def find_fingerids(self, swipestarts, swipepointsbyid, swipe_errors):
+        ''' Find finger ids for the points sorted by ids. Returns an array,
+            where each id gives the finger_id for the specified point in targetpoints '''
+
+        numids = len(swipepointsbyid.keys())
+        numpoints = len(swipestarts)
+
+        if numids == 0:
+            # No measurements found
+            return [None] * numpoints
+
+        # Find the distances from each median point per id to each of the target points
+        distances = {}
+        # print str(targetpoints)
+        for id in swipepointsbyid.keys():
+            # For each fingerid check the closest target swipe - very easy in swipe coordinates
+            median_offset = np.median([p[1] for p in swipepointsbyid[id]])
+            dists = [np.abs(median_offset - p[1]) for p in swipestarts]
+            distances[id] = dists
+
+        return analyzers.find_closest_id_match(distances)
diff --git a/TPPTAnalysisSW/tests/test_multifinger_tap.py b/TPPTAnalysisSW/tests/test_multifinger_tap.py
new file mode 100644
index 0000000..c47d368
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_multifinger_tap.py
@@ -0,0 +1,343 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import math
+import numpy as np
+import numpy.linalg as npl
+from sqlalchemy.orm import joinedload
+from genshi.template import MarkupTemplate
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.measurementdb import get_database, MultifingerTapTest, MultifingerTapResults
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.settings import settings
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.analyzers as analyzers
+
+
+class MultiFingerTapTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(8)
+    def create_testclass(*args, **kwargs):
+        return MultiFingerTapTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.ddttest (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new MultiFingerTapTest class """
+        super(MultiFingerTapTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        verdict = "Pass" if results['verdict'] else "Fail"
+        # No measurements - special case
+        if results['verdict'] and results['max_input_offset'] is None:
+            verdict = 'N/A'
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+        self.clearanalysis()
+
+        # Create common template parameters (including ddttest dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(MultiFingerTapTest, self).create_common_templateparams(**kwargs)
+
+        t = Timer()
+
+        # data for the report
+        results = self.read_test_results()
+        templateParams['results'] = results
+
+        t.Time("Results")
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_multifinger_tap.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+
+        verdict = "Pass" if results['verdict'] else "Fail"
+        # No measurements - special case
+        if results['verdict'] and results['max_input_offset'] is None:
+            verdict = 'N/A'
+
+        return stream.render('xhtml'), verdict
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'passfailgen':
+            t = Timer(1)
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            pinfo = {'passed_points': [tap['targetpoints'][0] for tap in results['taps'] if tap['verdict']],
+                     'failed_points': [tap['targetpoints'][0] for tap in results['taps'] if not tap['verdict']],
+                     }
+            t.Time("Results")
+            title = 'Preview: Multifinger Tap overview ' + self.dut['program']
+            plot_factory.plot_passfail_on_target(imagepath, pinfo, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'passfaildet':
+            t = Timer(1)
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Preview: Multifinger Tap detailed overview ' + self.dut['program']
+            plot_factory.plot_multifinger_p2p(imagepath, results, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdy':
+            t = Timer(1)
+            results = self.read_dxdy_results(**kwargs)
+            t.Time("Results")
+            # Avoid glitches - use 2.0 limit for display
+            plot_factory.plot_dxdy_graph(imagepath, results, 2.0, *args, **kwargs)
+            t.Time("Image")
+        elif image_name == 'tapdtls':
+            t = Timer(1)
+            results = self.read_tap_results(args[0], **kwargs)
+            t.Time("Results")
+            title = 'Preview: Multifinger Tap details'
+            plot_factory.plot_multifinger_tapdetails(imagepath, results, *args, title=title, **kwargs)
+            t.Time("Image")
+        else:
+            raise cherrypy.HTTPError(message="No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo=None, dbsession=None, **kwargs):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        s = Timer(2)
+        results = dbsession.query(MultifingerTapTest).filter(MultifingerTapTest.test_id == self.test_id). \
+            order_by(MultifingerTapTest.id).options(joinedload('multi_finger_tap_results')).all()
+
+        s.Time("DB Results")
+        taps = []
+        errors = set()
+        max_offset = None
+        missing_inputs = 0
+        missing_edge_inputs = 0
+        total_points = 0
+        point_id = 0
+
+        for multitap in results:
+            tap = self.calculate_tap_details(multitap, dutinfo, **kwargs)
+            point_id += 1
+            tap['id'] = point_id
+            taps.append(tap)
+
+            # Calculate common parameters
+            errors = errors.union(tap['errors'])
+            if tap['max_input_offset'] is not None:
+                max_offset = tap['max_input_offset'] if max_offset is None else max(tap['max_input_offset'], max_offset)
+            missing_inputs += tap['missing_inputs']
+            total_points += tap['num_fingers']
+
+        s.Time("Analysis")
+
+        results = {'taps': taps,
+                   'errors': errors,
+                   'maxposerror': float(settings['maxposerror']),
+                   'verdict': (max_offset <= settings['maxposerror']
+                               and missing_inputs - missing_edge_inputs <= settings['maxmissing']
+                               and len(errors) == 0),
+                   'max_input_offset_verdict': 'N/A' if max_offset is None else 'Pass' if max_offset <= settings[
+                       'maxposerror'] else 'Fail',
+                   'max_input_offset': max_offset,
+                   'edge_analysis_done': False,
+                   'missing_inputs': missing_inputs,
+                   'missing_inputs_verdict': (missing_inputs - missing_edge_inputs <= settings['maxmissing']),
+                   'total_points': total_points,
+                   'images': [(ImageFactory.create_image_name(self.test_id, 'passfailgen'),
+                               ImageFactory.create_image_name(self.test_id, 'passfailgen', 'detailed')),
+                              (ImageFactory.create_image_name(self.test_id, 'passfaildet'),
+                               ImageFactory.create_image_name(self.test_id, 'passfaildet', 'detailed')),
+                              (ImageFactory.create_image_name(self.test_id, 'p2pdxdy'),
+                               ImageFactory.create_image_name(self.test_id, 'p2pdxdy', 'detailed')),
+                              ],
+                   }
+
+        return results
+
+    def read_dxdy_results(self, **kwargs):
+        results = self.read_test_results(**kwargs)
+
+        # Parse failed and passed points
+        passed_points = []
+        failed_points = []
+        for tap in results['taps']:
+            for finger in tap['fingers']:
+                for id in finger['points'].keys():
+                    passed_points.extend([(finger['target'], p) for d, p
+                                          in zip(finger['distances'][id], finger['points'][id])
+                                          if d <= finger['maxposerror']])
+                    failed_points.extend([(finger['target'], p) for d, p
+                                          in zip(finger['distances'][id], finger['points'][id])
+                                          if d > finger['maxposerror']])
+
+        results['passed_points'] = passed_points
+        results['failed_points'] = failed_points
+
+        return results
+
+    def read_tap_results(self, tap_id, dbsession=None, dutinfo=None, **kwargs):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        multitap = dbsession.query(MultifingerTapTest).filter(MultifingerTapTest.id == tap_id). \
+            options(joinedload('multi_finger_tap_results')).first()
+
+        return self.calculate_tap_details(multitap, dutinfo, **kwargs)
+
+    def calculate_tap_details(self, multitap, dutinfo, **kwargs):
+        missing_tap_inputs = 0
+
+        # Transfer the tap info to individual points
+        robot_point = analyzers.robot_to_target((multitap.robot_x, multitap.robot_y), dutinfo)
+        points_x = [
+            robot_point[0] + i * multitap.separation_distance * math.cos(math.radians(multitap.separation_angle))
+            for i in range(multitap.number_of_fingers)]
+        points_y = [
+            robot_point[1] + i * multitap.separation_distance * math.sin(math.radians(multitap.separation_angle))
+            for i in range(multitap.number_of_fingers)]
+        targetpoints = list(zip(points_x, points_y))
+
+        allpoints = analyzers.panel_to_target([(p.panel_x, p.panel_y) for p in multitap.multi_finger_tap_results],
+                                              dutinfo)
+        fingerids = np.array([p.finger_id for p in multitap.multi_finger_tap_results])
+
+        taperrors = set()
+        # Check if we have the correct number of finger ids
+        uniqids = np.unique(fingerids)
+        if len(uniqids) > multitap.number_of_fingers:
+            taperrors.add('Too many fingers were detected in input')
+
+        pointsbyid = {}
+        for id in uniqids:
+            pointsbyid[id] = np.array([np.array(p) for pid, p in zip(fingerids, allpoints) if pid == id])
+
+        # Map the finger ids in the database to the id's in the points list
+        max_tap_offset = None
+        fingers = []
+        finger_offsets = []
+
+        fingerids = self.find_fingerids(targetpoints, pointsbyid, taperrors)
+        for target_point, ids_in_place in zip(targetpoints, fingerids):
+            fingerpoints = {}
+            distances = {}
+            finger = {'target': target_point,
+                      'maxposerror': float(settings['maxposerror']),
+                      'points': fingerpoints,
+                      'distances': distances,
+                      'verdict': False}
+            fingers.append(finger)
+            if ids_in_place is None or len(ids_in_place) == 0:
+                # Missing finger
+                # taperrors.add('Not all fingers were detected in input')
+                finger_offsets.append(None)
+                missing_tap_inputs += 1
+                continue
+
+            max_finger_offset = None
+            for id in ids_in_place:
+                fingerpoints[id] = pointsbyid[id]
+                fdistances = npl.norm(fingerpoints[id] - target_point, axis=1)
+                distances[id] = [analyzers.round_dec(d) for d in fdistances]
+                max_id_offset = analyzers.round_dec(np.max(fdistances))
+                max_finger_offset = max_id_offset if max_finger_offset is None else max(max_id_offset,
+                                                                                        max_finger_offset)
+            finger['max_input_error'] = max_finger_offset
+            finger_offsets.append(max_finger_offset)
+
+            if max_finger_offset <= settings['maxposerror']:
+                finger['verdict'] = True
+            # else:
+            # taperrors.add('Maximum offset exceeded')
+
+        max_tap_offset = None
+        # Find max offset from non-None offsets
+        if finger_offsets.count(None) < len(finger_offsets):
+            max_tap_offset = max([o for o in finger_offsets if o is not None])
+
+        verdict = (max_tap_offset is not None and max_tap_offset <= settings['maxposerror'] and len(taperrors) == 0)
+        tap = {'num_fingers': multitap.number_of_fingers,
+               'targetpoints': targetpoints,
+               'missing_inputs': missing_tap_inputs,
+               'offsets': finger_offsets,
+               'fingerids': fingerids,
+               'fingers': fingers,
+               'max_input_offset': max_tap_offset,
+               'errors': taperrors,
+               'verdict': verdict,
+               'verdict_text': 'N/A' if max_tap_offset is None else 'Pass' if verdict else 'Fail',
+               'image': ImageFactory.create_image_name(self.test_id, 'tapdtls', str(multitap.id))}
+
+        return tap
+
+    def find_fingerids(self, targetpoints, pointsbyid, taperrors):
+        ''' Find finger ids for the points sorted by ids. Returns an array,
+            where each id gives the finger_id for the specified point in targetpoints '''
+
+        numids = len(pointsbyid.keys())
+        numpoints = len(targetpoints)
+
+        if numids == 0:
+            # No measurements found
+            return [None] * numpoints
+
+        # Find the distances from each median point per id to each of the target points
+        distances = {}
+        # print str(targetpoints)
+        for id in pointsbyid.keys():
+            # For each fingerid check the closest target point
+            median = np.median(pointsbyid[id], axis=0)
+            # print str(median)
+            dists = [npl.norm(median - p) for p in targetpoints]
+            distances[id] = dists
+
+        return analyzers.find_closest_id_match(distances)
diff --git a/TPPTAnalysisSW/tests/test_non_stationary_reporting_rate.py b/TPPTAnalysisSW/tests/test_non_stationary_reporting_rate.py
new file mode 100644
index 0000000..df08bff
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_non_stationary_reporting_rate.py
@@ -0,0 +1,289 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+import numpy
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.measurementdb import *
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.analyzers as analyzers
+
+class NonStationaryReportingRateTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(12)
+    def create_testclass(*args, **kwargs):
+        return NonStationaryReportingRateTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new NonStationaryReportingRateTest class """
+        super(NonStationaryReportingRateTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        return results['verdict']
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        s = Timer(1)
+
+        # clear analysis data
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(NonStationaryReportingRateTest, self).create_common_templateparams(**kwargs)
+
+        s.Time("Init")
+
+        # Read test results
+        results = self.read_test_results()
+
+        s.Time("Results")
+
+        templateParams['slowest_reporting_rate'] = results['slowest_reporting_rate']
+        templateParams['fastest_reporting_rate'] = results['fastest_reporting_rate']
+        templateParams['missing_lines'] = results['missing_lines']
+        templateParams['detailed_data'] = zip(results['swipe_ids'], results['max_reporting_rates'],
+                                              results['min_reporting_rates'], results['average_reporting_rates'], results['verdicts'], results['images'])
+
+        # Add the image name and parameters to the report
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'nonstrr')
+        templateParams['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'nonstrr', 'detailed')
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_non_stationary_reporting_rate.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+        s.Time("Parameters")
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        s.Time("Generate")
+        return stream.render('xhtml'), results['verdict']
+
+    # Create images for the report. If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'nonstrr':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results()
+            title = 'Preview: Non-stationary reporting rate ' + self.dut['program']
+            plot_factory.plot_swipes_on_target_with_labels(imagepath, results, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'nonstrdtl':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_swipe_info(args[0], dutinfo=dutinfo, dbsession=dbsession)
+            title = 'Preview: Non-stationary reporting rate ' + self.dut['program']
+            plot_factory.plot_reporting_rate(imagepath, results, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+
+        s = Timer(2)
+
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        test_results = dbsession.query(OneFingerNonStationaryReportingRateTest).filter(OneFingerNonStationaryReportingRateTest.test_id == self.test_id).\
+                                                                                order_by(OneFingerNonStationaryReportingRateTest.id).\
+                                                                                options(joinedload('one_finger_non_stationary_reporting_rate_results')).all()
+
+        s.Time("DB")
+
+        max_reporting_rates = []
+        min_reporting_rates = []
+        average_reporting_rates = []
+        verdicts = []
+        swipe_id = 0
+        swipe_ids = []
+        passed_points = []
+        failed_points = []
+        images = []
+        lines = []
+        missing_lines = 0
+        if 'minreportingrate' in settings and settings['minreportingrate'] > 0.0:
+            accept_delay = (1000.0 / float(settings['minreportingrate']))
+        else:
+            accept_delay = 0.0
+
+        for test_result in test_results:
+            max_reporting_rate = 0.0
+            min_reporting_rate = 0.0
+            previous_timestamp = 0.0
+            max_delay = 0.0
+            min_delay = 0.0
+            delays = []
+            verdict = "N/A" # No points
+            for result in test_result.one_finger_non_stationary_reporting_rate_results:
+                if previous_timestamp == 0.0:
+                    previous_timestamp = result.time
+                    passed_points.append((result.panel_x, result.panel_y))
+                else:
+                    delay = result.time - previous_timestamp
+                    delays.append(delay)
+                    if delay >= max_delay:
+                        max_delay = delay
+                    if min_delay == 0.0:
+                        min_delay = delay
+                    elif delay > 0.0 and delay < min_delay:
+                        min_delay = delay
+                    previous_timestamp = result.time
+
+                    if delay > accept_delay:
+                        failed_points.append((result.panel_x, result.panel_y))
+                        verdict = "Fail"
+                    else:
+                        passed_points.append((result.panel_x, result.panel_y))
+                        if verdict == "N/A":
+                            verdict = "Pass" # At least one point exists -> Pass (if not later set to fail)
+
+            if len(test_result.one_finger_non_stationary_reporting_rate_results) == 0:
+                verdict = "Fail" # If no points in the measurement -> missing line
+                missing_lines += 1
+
+            min_reporting_rate = analyzers.round_dec(1.0/(max_delay/1000.0)) if max_delay != 0.0 else None
+            max_reporting_rate = analyzers.round_dec(1.0/(min_delay/1000.0)) if min_delay != 0.0 else None
+            average_reporting_rate = analyzers.round_dec(1.0/(numpy.average(delays)/1000)) if len(delays) != 0 else None
+            min_reporting_rates.append(min_reporting_rate)
+            max_reporting_rates.append(max_reporting_rate)
+            average_reporting_rates.append(average_reporting_rate)
+            lines.append(((test_result.start_x, test_result.start_y), (test_result.end_x, test_result.end_y)))
+            verdicts.append(verdict)
+            swipe_id += 1
+            swipe_ids.append(swipe_id)
+            images.append(ImageFactory.create_image_name(self.test_id, 'nonstrdtl', str(test_result.id)))
+
+        s.Time("Analysis")
+
+        results = {}
+        results['swipe_ids'] = swipe_ids
+        results['max_reporting_rates'] = max_reporting_rates
+        results['min_reporting_rates'] = min_reporting_rates
+        results['average_reporting_rates'] = average_reporting_rates
+        results['verdicts'] = verdicts
+        results['images'] = images
+        results['passed_points'] = analyzers.panel_to_target(passed_points, dutinfo)
+        results['failed_points'] = analyzers.panel_to_target(failed_points, dutinfo)
+        results['lines'] = analyzers.robot_to_target(lines, dutinfo)
+        results['missing_lines'] = missing_lines
+
+        try:
+            results['slowest_reporting_rate'] = numpy.min([f for f in results['min_reporting_rates'] if f is not None])
+            results['verdict'] = "Pass" if results['slowest_reporting_rate'] > settings['minreportingrate'] and results['missing_lines'] == 0 else "Fail"
+        except ValueError:
+            results['slowest_reporting_rate'] = None
+            results['verdict'] = "Fail"
+        try:
+            results['fastest_reporting_rate'] = numpy.max([f for f in results['max_reporting_rates'] if f is not None])
+        except ValueError:
+            results['fastest_reporting_rate'] = None
+
+        return results
+
+    def read_swipe_info(self, swipe_id, dutinfo = None, dbsession = None):
+
+        s = Timer(2)
+
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        swipe = dbsession.query(OneFingerNonStationaryReportingRateTest).filter(OneFingerNonStationaryReportingRateTest.id == swipe_id).\
+                                                                           order_by(OneFingerNonStationaryReportingRateTest.id).\
+                                                                           options(joinedload('one_finger_non_stationary_reporting_rate_results')).first()
+
+        points = []
+        pindex = 0
+        passed = []
+        failed = []
+        delays = []
+        max_delay = None
+        previous_timestamp = 0.0
+        #start = analyzers.robot_to_target((swipe.start_x, swipe.start_y), dutinfo)
+        #end = analyzers.robot_to_target((swipe.end_x, swipe.end_y), dutinfo)
+        #transform = analyzers.panel_to_target_transform(dutinfo) + analyzers.target_to_swipe_transform(start, end)
+
+        if 'minreportingrate' in settings and settings['minreportingrate'] > 0.0:
+            accept_delay = (1000.0 / float(settings['minreportingrate']))
+        else:
+            accept_delay = 0.0
+
+        for result in swipe.one_finger_non_stationary_reporting_rate_results:
+            #point = transform.transform(((result.panel_x, result.panel_y)))
+            #points.append(point)
+            if previous_timestamp == 0.0:
+                previous_timestamp = result.time
+                #passed.append((pindex, 0,0))
+                #delays.append(None)
+            else:
+                delay = result.time - previous_timestamp
+                if delay > 0.0:
+                    delays.append(delay)
+                    previous_timestamp = result.time
+
+                    if max_delay is None or max_delay < delay:
+                        max_delay = delay
+
+                    if delay > accept_delay:
+                        failed.append((pindex, delay))
+                    else:
+                        passed.append((pindex, delay))
+                    pindex += 1
+
+        results = {'passed': passed,
+                   'failed': failed,
+                    'max_allowed_delay': analyzers.round_dec(1.0/(float(settings['minreportingrate'])/1000.0)),
+                   #'points': points,
+                   'delays': delays,
+                   'max_delay': max_delay
+                   }
+
+        return results
diff --git a/TPPTAnalysisSW/tests/test_one_finger_swipe.py b/TPPTAnalysisSW/tests/test_one_finger_swipe.py
new file mode 100644
index 0000000..bf50c5f
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_one_finger_swipe.py
@@ -0,0 +1,270 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import threading
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.measurementdb as measurementdb
+import TPPTAnalysisSW.analyzers as analyzers
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+
+class OneFingerSwipeTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(1)
+    def create_testclass(*args, **kwargs):
+        return OneFingerSwipeTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new OneFingerSwipeTest class """
+        super(OneFingerSwipeTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        verdict = "N/A"
+        results = self.read_test_results()
+        if results['jitter_verdict'] == "Pass" and results['offset_verdict'] == "Pass" and results['missing_count'] <= settings['maxmissingswipes']:
+            verdict = "Pass"
+        elif results['jitter_verdict'] == "Fail" or results['offset_verdict'] == "Fail" or results['missing_count'] > settings['maxmissingswipes']:
+            verdict = "Fail"
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(OneFingerSwipeTest, self).create_common_templateparams(**kwargs)
+
+        s = Timer()
+        s.Time("START")
+
+        results = self.read_test_results()
+
+        s.Time("Results")
+
+        templateParams['results'] = results
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, "swipes")
+        templateParams['detailed_figure'] = ImageFactory.create_image_name(self.test_id, "swipes", "detailed")
+        templateParams['test_page'] = 'test_one_finger_swipe.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        s.Time("READY")
+
+        # Start creating the preview image already - the call will probably come soon
+        # NOTE: this is not necessary in summary tests
+        if 'noimages' not in kwargs:
+            threading.Thread(target = self.createpreviewimage, args = (results,)).start()
+
+        if results['jitter_verdict'] == "Pass" and results['offset_verdict'] == "Pass" and results['missing_count'] <= settings['maxmissingswipes']:
+            verdict = "Pass"
+        elif results['jitter_verdict'] == "Fail" or results['offset_verdict'] == "Fail" or results['missing_count'] > settings['maxmissingswipes']:
+            verdict = "Fail"
+
+        return stream.render('xhtml'), verdict
+
+    def createpreviewimage(self, results):
+        """ Creates a swipe preview image with the specified results """
+        imagepath = ImageFactory.create_image_path(self.test_id, "swipes")
+        dbsession = measurementdb.get_database().session()
+        dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+        title = 'Preview: One Finger Swipe ' + self.dut['program']
+        plot_factory.plot_swipes_on_target(imagepath, results, dutinfo, title=title)
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'swipes':
+            # See above: preview image is normally generated after the report creation
+            dbsession = measurementdb.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            pinfo = self.read_test_results(dbsession=dbsession, dutinfo=dutinfo)
+            title = 'Preview: One Finger Swipe ' + self.dut['program']
+            plot_factory.plot_swipes_on_target(imagepath, pinfo, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'jittdtls':
+            dbsession = measurementdb.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_swipe_details(args[0], dbsession=dbsession, dutinfo=dutinfo)
+            title = 'Preview: One Finger Swipe details ' + self.dut['program']
+            plot_factory.plot_one_finger_swipe_with_linear_fit(imagepath, results, dutinfo, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+
+        s = Timer(2)
+        if dbsession is None:
+            dbsession = measurementdb.get_database().session()
+        if dutinfo is None:
+            dutinfo = dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        dbswipes = dbsession.query(measurementdb.OneFingerSwipeTest).filter(measurementdb.OneFingerSwipeTest.test_id==self.test_id).\
+                                                                     options(joinedload('one_finger_swipe_results')).\
+                                                                     order_by(measurementdb.OneFingerSwipeTest.id)
+
+        s.Time('DB')
+
+        max_jitter = None
+        jitter_verdict = "N/A"
+        max_offset = None
+        offset_verdict = "N/A"
+        max_offsets_from_linear_fit = []
+        swipes = []
+        missing_swipes = []
+        swipe_id = 1
+        lines = []
+        passed_points = []
+        failed_points = []
+
+        for swipe in dbswipes:
+            assert(swipe.start_x is not None)
+            assert(swipe.start_y is not None)
+            assert(swipe.end_x is not None)
+            assert(swipe.end_y is not None)
+
+            panel_points = [(p.panel_x, p.panel_y) for p in swipe.one_finger_swipe_results]
+            # Transform panel -> robot -> swipe
+            target_points = analyzers.panel_to_target(panel_points, dutinfo)
+            swipe_start, swipe_end = analyzers.robot_to_target([(swipe.start_x, swipe.start_y), (swipe.end_x, swipe.end_y)], dutinfo)
+            lines.append((swipe_start, swipe_end))
+            swipe_points = analyzers.target_to_swipe(target_points, swipe_start, swipe_end)
+            swipe_results = analyzers.analyze_swipe_jitter(swipe_points, float(settings['jittermask']))
+            linearity_results = analyzers.analyze_swipe_linearity(swipe_points)
+
+            # Check is NaN
+            if linearity_results['lin_error_max'] == linearity_results['lin_error_max']:
+                max_offsets_from_linear_fit.append(linearity_results['lin_error_max'])
+
+            passfail_values = [analyzers.round_dec(abs(p[1])) <= settings['maxoffset'] for p in swipe_points]
+            passed = [target_points[i] for (i,t) in enumerate(passfail_values) if t]
+            failed = [target_points[i] for (i,t) in enumerate(passfail_values) if not t]
+            passed_points.extend(passed)
+            failed_points.extend(failed)
+
+            swipe_verdict = "N/A"
+
+            offset = None
+            if len(swipe_points) > 0:
+                offset = analyzers.round_dec(max([abs(p[1]) for p in swipe_points]))
+                if max_offset is None or offset > max_offset:
+                    max_offset = offset
+                if offset > settings['maxoffset']:
+                    offset_verdict = "Fail"
+                    swipe_verdict = "Fail"
+                else:
+                    swipe_verdict = "Pass"
+                    if offset_verdict == "N/A":
+                        offset_verdict = "Pass"
+
+                jitter = analyzers.round_dec(swipe_results['max_jitter']) if 'max_jitter' in swipe_results else None
+                if jitter is not None:
+                    if max_jitter is None or jitter > max_jitter:
+                        max_jitter = jitter
+                    if jitter > settings['maxjitter']:
+                        jitter_verdict = "Fail"
+                        swipe_verdict = "Fail"
+                    else:
+                        if swipe_verdict != "Fail":
+                            swipe_verdict = "Pass"
+                        if jitter_verdict == "N/A":
+                            jitter_verdict = "Pass"
+            else:
+                swipe_verdict = "Fail"
+                missing_swipes.append(swipe.id)
+
+            swipes.append((swipe_id, jitter, offset, swipe_verdict, ImageFactory.create_image_name(self.test_id, "jittdtls", str(swipe.id))))
+            swipe_id += 1
+
+        s.Time('Analysis')
+        if len(max_offsets_from_linear_fit) > 0:
+            linear_fit_avg = float(sum(max_offsets_from_linear_fit)) / len(max_offsets_from_linear_fit)
+        else:
+            linear_fit_avg = None
+
+        results = {'max_jitter': max_jitter,
+                   'jitter_verdict': jitter_verdict,
+                   'max_offset': max_offset,
+                   'offset_verdict': offset_verdict,
+                   'swipes': swipes,
+                   'swipe_count': len(swipes),
+                   'missing_swipes': missing_swipes,
+                   'missing_count': len(missing_swipes),
+                   'lines': lines,
+                   'passed_points': passed_points,
+                   'failed_points': failed_points,
+                   'max_offset_from_linear_fit': max(max_offsets_from_linear_fit) if max_offsets_from_linear_fit != [] else 0,
+                   'avg_of_offsets_from_linear_fit': linear_fit_avg
+                  }
+
+        return results
+
+    def read_swipe_details(self, swipe_id, dbsession=None, dutinfo=None):
+        if dbsession is None:
+            dbsession = measurementdb.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(self.testsession['id'], dbsession)
+
+        line = dbsession.query(measurementdb.OneFingerSwipeTest).filter(measurementdb.OneFingerSwipeTest.id == swipe_id).\
+                                                                 order_by(measurementdb.OneFingerSwipeTest.id).\
+                                                                 options(joinedload('one_finger_swipe_results')).first()
+
+        panel_points = [(point.panel_x, point.panel_y) for point in line.one_finger_swipe_results]
+        target_points = analyzers.panel_to_target(panel_points, dutinfo)
+        line_start, line_end = analyzers.robot_to_target([(line.start_x, line.start_y), (line.end_x, line.end_y)], dutinfo)
+        swipe_points = analyzers.target_to_swipe(target_points, line_start, line_end)
+        jitterinfo = analyzers.analyze_swipe_jitter(swipe_points, float(settings['jittermask']))
+        linearity_results = analyzers.analyze_swipe_linearity(swipe_points)
+
+        passfail_values = [abs(p[1]) <= settings['maxoffset'] for p in swipe_points]
+        passed = [target_points[i] for (i,t) in enumerate(passfail_values) if t]
+        failed = [target_points[i] for (i,t) in enumerate(passfail_values) if not t]
+
+        return {'passed_points': passed, 'failed_points': failed, 'swipe_points': swipe_points,
+                'line_start': line_start, 'line_end': line_end, 'jitters': jitterinfo['jitters'],
+                'linear_error': linearity_results['linear_error'], 'lin_error_max': linearity_results['lin_error_max'],
+                'lin_error_rms': linearity_results['lin_error_rms'], 'lin_error_avg': linearity_results['lin_error_avg']}
diff --git a/TPPTAnalysisSW/tests/test_one_finger_tap.py b/TPPTAnalysisSW/tests/test_one_finger_tap.py
new file mode 100644
index 0000000..abcfa8e
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_one_finger_tap.py
@@ -0,0 +1,274 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from genshi.template import MarkupTemplate
+import numpy as np
+from sqlalchemy import Column, DECIMAL, Integer, TIMESTAMP
+from sqlalchemy.ext.declarative import declarative_base
+
+from ..testbase import TestBase, testclasscreator
+from ..imagefactory import ImageFactory
+from ..settings import settings, precision
+from ..utils import Timer
+from ..info.version import Version
+import TPPTAnalysisSW.measurementdb as db
+import TPPTAnalysisSW.analyzers as analyzers
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+
+Base = declarative_base()
+
+
+class OneFingerTapTestSQL(Base):
+    __tablename__ = 'tapping'
+
+    max_input_error = Column(DECIMAL)
+    maxposerror = Column(DECIMAL)
+    max_edge_error = Column(DECIMAL)
+
+    META_ID = Column(Integer, primary_key=True)
+    CREATED = Column(TIMESTAMP)
+    UPDATED = Column(TIMESTAMP)
+
+
+class OneFingerTapTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(0)
+    def create_testclass(*args, **kwargs):
+        return OneFingerTapTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new OneFingerTapTest class """
+        return super(OneFingerTapTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        verdict = "Pass" if (results['max_input_verdict'] and results['missing_inputs_verdict']) else "Fail"
+        if settings['edgelimit'] >= 0:
+            if not results['missing_edge_inputs_verdict']:
+                verdict = "Fail"
+
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(OneFingerTapTest, self).create_common_templateparams(**kwargs)
+
+        t = Timer()
+
+        # data for the report
+        results = self.read_test_results()
+        templateParams['results'] = results
+
+        t.Time("Results")
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_one_finger_tap.html'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+
+        verdict = "Pass" if (results['max_input_verdict'] and results['missing_inputs_verdict']) else "Fail"
+        if settings['edgelimit'] >= 0:
+            if not results['missing_edge_inputs_verdict']:
+                verdict = "Fail"
+
+        return stream.render('xhtml'), verdict
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'p2pdiff':
+            t = Timer(1)
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Preview: One Finger Tap ' + self.dut['program']
+            plot_factory.plot_taptest_on_target(imagepath, results, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdy':
+            t = Timer(1)
+            results = self.read_test_results(**kwargs)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results, 0.0, *args, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdyltd':
+            t = Timer(1)
+            results = self.read_test_results(**kwargs)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results, 1.0, *args, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdyltdc':
+            t = Timer(1)
+            results = self.read_test_results(center_only=True)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results, 1.0, *args, center_only=True, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2pdxdyltde':
+            t = Timer(1)
+            results = self.read_test_results(edge_only=True)
+            t.Time("Results")
+            plot_factory.plot_dxdy_graph(imagepath, results, 1.0, *args, edge_only=True, **kwargs)
+            t.Time("Image")
+        elif image_name == 'p2phistogram':
+            t = Timer(1)
+            results = self.read_test_results()
+            t.Time("Results")
+            plot_factory.plot_p2p_err_histogram(imagepath, results, 1.0, *args, edge_only=False, **kwargs)
+            t.Time("Image")
+
+        return None
+
+    def read_test_results(self, dutinfo = None, dbsession = None, **kwargs):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        query = dbsession.query(db.OneFingerTapTest).filter(db.OneFingerTapTest.test_id==self.test_id).\
+                                                     order_by(db.OneFingerTapTest.id)
+
+        passed_points = [] # These are tuple-tuples: ((target_x, target_y), (hit_x, hit_y))
+        failed_points = []
+        targets = []
+        hits = [] # target points: ((target_x, target_y), radius)
+        missing = [] # target points ((target_x, target_y), radius)
+        missing_edge = []
+        edge_points = 0
+        max_input_error = analyzers.round_dec(0.0)
+        max_edge_error = analyzers.round_dec(0.0)
+        distances = []
+
+        for point in query:
+            target = analyzers.robot_to_target((point.robot_x, point.robot_y), dutinfo)
+            targets.append(target)
+
+            edge_point = False
+            if analyzers.is_edge_point(target, dutinfo):
+                edge_point = True
+                edge_points += 1
+                if 'center_only' in kwargs:
+                    continue
+            else:
+                if 'edge_only' in kwargs:
+                    continue
+
+            if point.panel_x is None or point.panel_y is None:
+                missing.append((target, analyzers.get_max_error(target, dutinfo)))
+                if edge_point:
+                    missing_edge.append((target, analyzers.get_max_error(target, dutinfo)))
+
+            else:
+                max_error = analyzers.round_dec(analyzers.get_max_error(target, dutinfo))
+                hits.append((target, max_error))
+                hit = analyzers.panel_to_target((point.panel_x, point.panel_y), dutinfo)
+                distance = analyzers.round_dec(np.linalg.norm((hit[0]-target[0], hit[1]-target[1])))
+                distances.append(float(distance))
+                if distance > max_error:
+                    failed_points.append((target, hit))
+                else:
+                    passed_points.append((target, hit))
+                if edge_point:
+                    if distance > max_edge_error:
+                        max_edge_error = distance
+                else:
+                    if distance > max_input_error:
+                        max_input_error = distance
+
+        max_input_verdict = (max_input_error < settings['maxposerror'])
+        if settings['edgelimit'] >= 0:
+            max_input_verdict = max_input_verdict and max_edge_error < settings['edgepositioningerror']
+
+        results = {'max_input_error': max_input_error,
+                   'edge_analysis_done': (settings['edgelimit'] >= 0),
+                   'max_edge_error': max_edge_error,
+                   'max_input_verdict': max_input_verdict,
+                   'total_points': len(targets),
+                   'edge_points': edge_points,
+                   'missing_inputs': len(missing),
+                   'missing_inputs_verdict': (len(missing) - len(missing_edge) <= settings['maxmissing']),
+                   'missing_edge_inputs': len(missing_edge),
+                   'missing_edge_inputs_verdict': (len(missing_edge) <= settings['maxedgemissing']),
+                   'passed_points': passed_points,
+                   'failed_points': failed_points,
+                   'targets': targets,
+                   'maxposerror': settings['maxposerror'],
+                   'hits': hits,
+                   'missing': missing,
+                   'distances': distances,
+                   }
+
+        if settings['edgelimit'] >= 0:
+            # Edge analysis
+            results['edgepositioningerror'] = settings['edgepositioningerror']
+            results['images'] = [(ImageFactory.create_image_name(self.test_id, 'p2pdiff'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdiff', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdy'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdy', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdyltdc'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdyltdc', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdyltde'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdyltde', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2phistogram'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2phistogram', 'detailed'))]
+        else:
+            results['images'] = [(ImageFactory.create_image_name(self.test_id, 'p2pdiff'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdiff', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdy'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdy', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2pdxdyltd'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2pdxdyltd', 'detailed')),
+                                 (ImageFactory.create_image_name(self.test_id, 'p2phistogram'),
+                                  ImageFactory.create_image_name(self.test_id, 'p2phistogram', 'detailed'))]
+
+        return results
+
+    def create_sql_rows(self):
+        test_results = self.read_test_results()
+        rows = []
+        rows.append(OneFingerTapTestSQL())
+        rows[0].max_input_error = test_results['max_input_error']
+        rows[0].maxposerror = test_results['maxposerror']
+        rows[0].max_edge_error = test_results['max_edge_error']
+
+        return rows
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_repeatability.py b/TPPTAnalysisSW/tests/test_repeatability.py
new file mode 100644
index 0000000..5d209b6
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_repeatability.py
@@ -0,0 +1,280 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import numpy as np
+import numpy.linalg
+from genshi.template import MarkupTemplate
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.utils import Timer
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.analyzers as analyzers
+from TPPTAnalysisSW.measurementdb import *
+from TPPTAnalysisSW.info.version import Version
+
+class RepeatabilityTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(10)
+    def create_testclass(*args, **kwargs):
+        return RepeatabilityTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new RepeatabilityTest class """
+        super(RepeatabilityTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        verdict = "Pass"
+        results = self.read_test_results()
+        if len(results['failed_points']) > 0:
+            verdict = "Fail"
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        t = Timer(1)
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(RepeatabilityTest, self).create_common_templateparams(**kwargs)
+        verdict = "Pass"
+        results = self.read_test_results()
+
+        t.Time("Results")
+        # Add the image name and parameters to the report
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'rept')
+        templateParams['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'rept', 'detailed')
+
+        templateParams['repeatability_errors'] = results['repeatability_errors']
+        templateParams['max_x_repeatability_error'] = results['max_x_repeatability_error']
+        templateParams['verdict_x'] = 'Pass' if results['max_x_repeatability_error'] <= settings['maxrepeaterror'] else 'Fail'
+        templateParams['max_y_repeatability_error'] = results['max_y_repeatability_error']
+        templateParams['verdict_y'] = 'Pass' if results['max_y_repeatability_error'] <= settings['maxrepeaterror'] else 'Fail'
+        templateParams['max_repeatability_error'] = results['max_repeatability_error']
+
+        templateParams['test_page'] = 'test_repeatability.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        # Create individual plot image names
+        subfigures = [None] # Use one-based indexing
+        for result in results['repeatability_errors']:
+            subfigures.append(ImageFactory.create_image_name(self.test_id, "repinfo", str(result[4])))
+        templateParams['pointPlots'] = subfigures
+        #print str(templateParams['pointPlots'])
+
+        t.Time("Params")
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+
+        if len(results['failed_points']) > 0:
+            verdict = "Fail"
+
+        return stream.render('xhtml'), verdict
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'rept':
+            # Overview image
+            t = Timer(1)
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("DB")
+            title = 'Preview: One Finger Tap Repeatability ' + self.dut['program']
+            plot_factory.plot_passfail_labels_on_target(imagepath, results, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'repinfo':
+            # Individual point image
+            t = Timer(1)
+            point_id = int(args[0])
+            results = self.read_point_details(point_id)
+            t.Time("DB")
+            title = 'Preview: One Finger Tap Repeatability details ' + self.dut['program']
+            plot_factory.plot_repeatability_details(imagepath, results, *args, **kwargs)
+            t.Time("Image")
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        columns = OneFingerTapRepeatabilityTest.__table__.columns
+        test_results = dbsession.query(OneFingerTapRepeatabilityTest).filter(OneFingerTapRepeatabilityTest.test_id == self.test_id).\
+                                                                      order_by(OneFingerTapRepeatabilityTest.point_number).values(*columns)
+
+        # Group the results by the point_id for easier handling
+        # At the same time add a running point id as the first member of the array
+        results = {}
+        point_counter = 0;
+        for result in test_results:
+            if result.panel_x is not None and result.panel_y is not None:
+                if result.point_number in results:
+                    results[result.point_number].append(result)
+                else:
+                    results[result.point_number] = [point_counter, result]
+                    point_counter += 1
+
+        x_repeatability_errors = [None] * point_counter # Initialize lists for the correct length
+        y_repeatability_errors = [None] * point_counter
+        verdicts = [None] * point_counter
+        point_ids = [None] * point_counter
+        passed_points = []
+        failed_points = []
+
+        for point_id, measurements in results.items():
+            x_coordinates = []
+            y_coordinates = []
+            point_nbr = measurements[0]
+
+            for result in measurements[1:]:
+                point = analyzers.panel_to_target((result.panel_x, result.panel_y), dutinfo)
+                x_coordinates.append(point[0])
+                y_coordinates.append(point[1])
+
+            # Arrays must have at least one coordinate - otherwise they won't exist in db
+            x_error = analyzers.round_dec(np.ptp(x_coordinates))
+            y_error = analyzers.round_dec(np.ptp(y_coordinates))
+            x_repeatability_errors[point_nbr] = x_error
+            y_repeatability_errors[point_nbr] = y_error
+            point_ids[point_nbr] = point_id
+
+            if x_error > analyzers.round_dec(settings['maxrepeaterror']) or y_error > analyzers.round_dec(settings['maxrepeaterror']):
+                failed_points.append((measurements[1].robot_x, measurements[1].robot_y, point_nbr + 1))
+                verdicts[point_nbr] = "Fail"
+            else:
+                passed_points.append((measurements[1].robot_x, measurements[1].robot_y, point_nbr + 1))
+                verdicts[point_nbr] = "Pass"
+
+        results = {}
+        results['x_repeatability_errors'] = x_repeatability_errors
+        results['y_repeatability_errors'] = y_repeatability_errors
+        if len(x_repeatability_errors) > 0:
+            results['max_x_repeatability_error'] = np.max(x_repeatability_errors)
+        else:
+            results['max_x_repeatability_error'] = 0.0
+        if len(y_repeatability_errors) > 0:
+            results['max_y_repeatability_error'] = np.max(y_repeatability_errors)
+        else:
+            results['max_y_repeatability_error'] = 0.0
+
+        # Result tuple for the generator
+        results['repeatability_errors'] = list(
+            zip(range(1, len(x_repeatability_errors) + 1), x_repeatability_errors, y_repeatability_errors, verdicts,
+                point_ids))
+        results['max_repeatability_error'] = max(results['max_x_repeatability_error'],
+                                                 results['max_y_repeatability_error'])
+
+        # For plotting
+        results['passed_points'] = passed_points
+        results['failed_points'] = failed_points
+
+        return results
+
+    def read_point_details(self, point_id, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        points = dbsession.query(OneFingerTapRepeatabilityTest).filter(OneFingerTapRepeatabilityTest.test_id == self.test_id,
+                                                                       OneFingerTapRepeatabilityTest.point_number == point_id).all()
+
+        results = {}
+        points_arr = []
+        passed = []
+        passed_count = []
+        failed = []
+        failed_count = []
+        results['robot_point'] = (0,0)
+
+        for point in points:
+            results['robot_point'] = [point.robot_x, point.robot_y] # This will be overwritten in each round
+            if point.panel_x is not None and point.panel_y is not None:
+                points_arr.append(analyzers.panel_to_target((point.panel_x, point.panel_y), dutinfo))
+
+        if len(points_arr) > 0:
+            average_point = np.average(points_arr, axis=0)
+            results['average_point'] = average_point
+            top_left = np.min(points_arr, axis=0)
+
+            for point in points_arr:
+                distance = max([point[0] - top_left[0], point[1] - top_left[1]])
+                if distance > settings['maxrepeaterror']:
+                    if point in failed:
+                        failed_count[failed.index(point)] += 1
+                    else:
+                        failed.append(point)
+                        failed_count.append(1)
+                else:
+                    if point in passed:
+                        passed_count[passed.index(point)] += 1
+                    else:
+                        passed.append(point)
+                        passed_count.append(1)
+
+        results['passed_points'] = passed
+        results['passed_points_count'] = passed_count
+        results['failed_points'] = failed
+        results['failed_points_count'] = failed_count
+        if len(points_arr) > 0:
+            # Top-left has been declared before
+            reference = top_left
+            x_range = np.ptp([p[0] for p in points_arr])
+            y_range = np.ptp([p[1] for p in points_arr])
+            if x_range < settings['maxrepeaterror']:
+                reference[0] = top_left[0] + ((x_range - float(settings['maxrepeaterror'])) / 2)
+            if y_range < settings['maxrepeaterror']:
+                reference[1] = top_left[1] + ((y_range - float(settings['maxrepeaterror'])) / 2)
+
+            results['reference_point'] = reference
+            results['distance'] = settings['maxrepeaterror']
+
+        return results
diff --git a/TPPTAnalysisSW/tests/test_separation.py b/TPPTAnalysisSW/tests/test_separation.py
new file mode 100644
index 0000000..3213cbc
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_separation.py
@@ -0,0 +1,254 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import math
+import numpy as np
+import numpy.linalg as npl
+from sqlalchemy.orm import joinedload
+from genshi.template import MarkupTemplate
+from functools import cmp_to_key
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.settings import settings
+import TPPTAnalysisSW.measurementdb as db
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.analyzers as analyzers
+
+# Python 3 version of Python 2 built-in function cmp.
+def cmp(a, b):
+    return (a>b)-(a<b)
+
+class SeparationTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(14)
+    def create_testclass(*args, **kwargs):
+        return SeparationTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.ddttest (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new SeparationTest class """
+        super(SeparationTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        if results['verdict'] is None:
+            verdict = 'N/A'
+        elif results['verdict']:
+            verdict = 'Pass'
+        else:
+            verdict = 'Fail'
+
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+        self.clearanalysis()
+
+        # Create common template parameters (including ddttest dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(SeparationTest, self).create_common_templateparams(**kwargs)
+        t = Timer()
+        results = self.read_test_results()
+
+        # data for the report
+        templateParams['results'] = results
+        templateParams['figures'] = [ImageFactory.create_image_name(self.test_id, 'sepgen'),
+                                     ImageFactory.create_image_name(self.test_id, 'sepdet')]
+
+        t.Time("Results")
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_separation.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+
+        if results['verdict'] is None:
+            verdict = 'N/A'
+        elif results['verdict']:
+            verdict = 'Pass'
+        else:
+            verdict = 'Fail'
+
+        return stream.render('xhtml'), verdict
+
+    # Create images for the report. If the function returns a value, it is used as the new image (including full path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'sepgen':
+            t = Timer(1)
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Preview: Separation overview ' + self.dut['program']
+            plot_factory.plot_separation_results(imagepath, results, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'sepdet':
+            t = Timer(1)
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Preview: Separation details ' + self.dut['program']
+            plot_factory.plot_separation_details(imagepath, results, dutinfo, *args, title=title, **kwargs)
+            t.Time("Image")
+        elif image_name == 'sepdtls':
+            t = Timer(1)
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo=dutinfo, dbsession=dbsession)
+            t.Time("Results")
+            title = 'Separation details for angle %s distance %s ' %(args[0], args[1]) + self.dut['program']
+            plot_factory.plot_separation_tapdetails(imagepath, results['angles'][args[0]]['distances'][args[1]], dutinfo, title=title, **kwargs)
+            t.Time("Image")
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo=None, dbsession=None, **kwargs):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        s = Timer(2)
+        tests = dbsession.query(db.SeparationTest).filter(db.SeparationTest.test_id == self.test_id).\
+                                                   order_by(db.SeparationTest.id).options(joinedload('separation_results')).all()
+
+        s.Time("DB Results")
+
+        # Directory that contains the angles of the measurements
+        angles = {}
+        errors = set()
+
+        for test in tests:
+            # Single separation angle & distance
+            angle = "%.1f" % test.separation_angle
+            if angle not in angles:
+                angles[angle] = {'distances':{}}
+
+            distance = "%.1f" % test.tool_separation
+            if distance in angles[angle]:
+                # Error - the same angle and distance twice in the same measurement
+                # Cannot re-do the analysis, because it would potentially mess up the results
+                errors.add('The separation angle %s and distance %f occurs twice in data' % (angle, distance))
+                continue
+            else:
+                dresults = {}
+                angles[angle]['distances'][distance] = dresults
+
+            pdist = (math.cos(math.radians(test.separation_angle)) * test.tool_separation,
+                     math.sin(math.radians(test.separation_angle)) * test.tool_separation)
+            dresults['point']    = analyzers.robot_to_target((test.robot_x, test.robot_y), dutinfo)
+            dresults['point_diameter'] = test.finger1_diameter
+            dresults['angle']    = test.separation_angle
+            dresults['point2']   = [c + d for c, d in zip(dresults['point'], pdist)]
+            dresults['point2_diameter'] = test.finger2_diameter
+            dresults['errors']   = set()
+            dresults['image']    = ImageFactory.create_image_name(self.test_id, 'sepdtls', angle, distance)
+            taps = {}
+            dresults['taps']     = taps
+            for tap in test.separation_results:
+                if tap.finger_id not in taps:
+                    taps[tap.finger_id] = []
+                taps[tap.finger_id].append(analyzers.panel_to_target((tap.panel_x, tap.panel_y), dutinfo))
+
+            if len(taps.keys()) == 0:
+                # No measurements found
+                dresults['errors'].add('No measurements for tap')
+                errors.add('No measurements for tap')
+                dresults['verdict'] = False
+                dresults['verdict_text'] = 'N/A'
+            elif len(taps.keys()) == 1:
+                # No separation
+                dresults['verdict'] = False
+                dresults['verdict_text'] = 'Fail'
+            elif len(taps.keys()) == 2:
+                # Separation found
+                dresults['verdict'] = True
+                dresults['verdict_text'] = 'Pass'
+            else:
+                # Too many id's
+                dresults['errors'].add('Too many ids for tap')
+                errors.add('Too many ids for tap')
+                dresults['verdict'] = False
+                dresults['verdict_text'] = 'Fail'
+
+        # Calculate results
+        verdict = None
+        for angle, values in angles.items():
+            sorteddist = sorted(values['distances'].keys(), key=cmp_to_key(lambda x,y: cmp(float(x), float(y))))
+            #print "Angle %s - %s" % (angle, str(sorteddist))
+            mindist = None
+            for dist in sorteddist:
+                if values['distances'][dist]['verdict']:
+                    if mindist is None:
+                        mindist = dist
+                else:
+                    mindist = None
+
+            values['distance_ids'] = sorteddist
+            values['separation'] = mindist
+            # Verdict calculation
+            if angle == '0.0' or angle == '90.0':
+                dverdict = mindist is not None and (float(mindist) <= settings['maxseparation'])
+                values['maxseparation'] = settings['maxseparation']
+            else:
+                dverdict = mindist is not None and (float(mindist) <= settings['maxdiagseparation'])
+                values['maxseparation'] = settings['maxdiagseparation']
+            values['verdict'] = dverdict
+            if verdict is None:
+                verdict = dverdict
+            elif dverdict == False:
+                verdict = False
+
+        angle_ids = sorted(angles.keys(), key=cmp_to_key(lambda x,y: cmp(float(x), float(y))))
+
+        results = {'angles': angles,
+                   'angle_ids': angle_ids,
+                   'errors': errors,
+                   'verdict': verdict,
+                   }
+
+        return results
diff --git a/TPPTAnalysisSW/tests/test_stationary_jitter.py b/TPPTAnalysisSW/tests/test_stationary_jitter.py
new file mode 100644
index 0000000..ca0f059
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_stationary_jitter.py
@@ -0,0 +1,218 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+import numpy as np
+import numpy.linalg
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.measurementdb import get_database, OneFingerStationaryJitterTest, OneFingerStationaryJitterResults
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.analyzers as analyzers
+
+class StationaryJitterTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(9)
+    def create_testclass(*args, **kwargs):
+        return StationaryJitterTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new StationaryJitterTest class """
+        super(StationaryJitterTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        return results['verdict']
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        t = Timer(1)
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(StationaryJitterTest, self).create_common_templateparams(**kwargs)
+
+        results = self.read_test_results()
+
+        t.Time("Results")
+
+        # Add the image name and parameters to the report
+        templateParams['results'] = results
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'stjitt')
+        templateParams['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'stjitt', 'detailed')
+        templateParams['test_page'] = 'test_stationary_jitter.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        t.Time("Markup")
+        return stream.render('xhtml'), results['verdict']
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        # Dummy test has only one image: dummyimage.
+        if image_name == 'stjitt':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo, dbsession)
+            title = 'Preview: Stationary Jitter ' + self.dut['program']
+            plot_factory.plot_passfail_labels_on_target(imagepath, results, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'stjittdtls':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_point_details(args[0], dutinfo, dbsession)
+            title = 'Preview: Stationary Jitter details ' + self.dut['program']
+            plot_factory.plot_passfail_labels(imagepath, results, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        pts = dbsession.query(OneFingerStationaryJitterTest).filter(OneFingerStationaryJitterTest.test_id==self.test_id).\
+                                                             options(joinedload(OneFingerStationaryJitterTest.one_finger_stationary_jitter_results)).\
+                                                             order_by(OneFingerStationaryJitterTest.id)
+
+        passed = []
+        failed = []
+        points = []
+        max_jitter = None
+        verdict = "N/A"
+        point_id = 1
+
+        for point in pts:
+            panel_points = [(p.panel_x, p.panel_y) for p in point.one_finger_stationary_jitter_results]
+            target_points = analyzers.panel_to_target(panel_points, dutinfo)
+
+            if len(target_points) == 0:
+                # No measurements for point
+                target = analyzers.robot_to_target((point.robot_x, point.robot_y), dutinfo)
+                failed.append(list(target) + [str(point_id)])
+                points.append((point_id, None, "N/A", None))
+                point_id += 1
+            else:
+                jitter = 0.0
+                if len(target_points) > 1:
+                    orig = np.array(target_points[0])
+                    distances = np.array([np.linalg.norm(np.array(p) - orig) for p in target_points[1:]])
+                    jitter = analyzers.round_dec(np.max(distances))
+
+                point_verdict = "Fail" if jitter > settings['maxstationaryjitter'] else "Pass"
+                points.append((point_id, jitter, point_verdict, ImageFactory.create_image_name(self.test_id, 'stjittdtls', str(point.id))))
+
+                if max_jitter is None or jitter > max_jitter:
+                    max_jitter = jitter
+
+                if point_verdict == "Pass":
+                    passed.append(list(target_points[0]) + [point_id])
+                    if verdict == "N/A":
+                        verdict = "Pass"
+                else:
+                    failed.append(list(target_points[0]) + [point_id])
+                    verdict = "Fail"
+
+                point_id += 1
+
+        results = {'passed_points': passed,
+                   'failed_points': failed,
+                   'max_jitter': max_jitter,
+                   'verdict': verdict,
+                   'points': points
+                   }
+
+        return results
+
+    def read_point_details(self, point_id, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        points = dbsession.query(OneFingerStationaryJitterResults).filter(OneFingerStationaryJitterResults.point_id==point_id).\
+                                                                   order_by(OneFingerStationaryJitterResults.id)
+
+        robot_point = dbsession.query(OneFingerStationaryJitterTest).filter(OneFingerStationaryJitterTest.id==point_id).\
+                                                                    order_by(OneFingerStationaryJitterTest.id)
+
+        target_points = analyzers.panel_to_target([(p.panel_x, p.panel_y) for p in points], dutinfo)
+
+        points = []
+        point_count = []
+
+        for point in target_points:
+            if point in points:
+                point_count[points.index(point)] += 1
+            else:
+                points.append(point)
+                point_count.append(1)
+
+        if len(points) > 1:
+            orig = np.array(points[0])
+            distances = np.array([np.linalg.norm(np.array(p) - orig) for p in points])
+            passed = []
+            failed = []
+            for point, distance, count in zip(points, distances, point_count):
+                if distance > settings['maxstationaryjitter']:
+                    failed.append((point[0], point[1], str(count) if count > 1 else ''))
+                else:
+                    passed.append((point[0], point[1], str(count) if count > 1 else ''))
+            result = {'passed_points': passed, 'failed_points': failed, 'robot_point': robot_point}
+        elif len(points) == 1:
+            # Only one point in lists...
+            points = [(points[0][0], points[0][1], str(point_count[0]) if point_count[0] > 1 else '')]
+            result = {'passed_points': points, 'failed_points': [], 'robot_point': robot_point}
+        if len(points) == 0:
+            # No points
+            result = {'passed_points': [], 'failed_points': [], 'robot_point': robot_point}
+        return result
diff --git a/TPPTAnalysisSW/tests/test_stationary_jitter_static_noise.py b/TPPTAnalysisSW/tests/test_stationary_jitter_static_noise.py
new file mode 100644
index 0000000..40d5c62
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_stationary_jitter_static_noise.py
@@ -0,0 +1,424 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+import numpy as np
+import numpy.linalg
+from math import sqrt
+from sqlalchemy import *
+from sqlalchemy.dialects.mysql import LONGTEXT
+
+
+from TPPTAnalysisSW.sqluploader import Base
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator, timestr_to_datetime
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.utils import Timer
+import TPPTAnalysisSW.measurementdb as db
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.analyzers as analyzers
+import datetime
+
+
+class StationaryJitterStaticNoiseSummarySQL(Base):
+    __tablename__ = 'touch_stationary_jitter_static_noise_summary'
+
+    meta_id = Column(Integer, primary_key=True)
+
+    time_test_start = Column(DATETIME)
+    test_id = Column(DECIMAL(10, 0))
+    time_sequence_start = Column(DATETIME)
+    time_sequence_end = Column(DATETIME)
+
+    border_width = Column(DECIMAL(8, 2))
+    finger_name = Column(VARCHAR(40))
+    finger_type = Column(VARCHAR(40))
+    finger_size = Column(DECIMAL(8, 2))
+    step_size = Column(DECIMAL(8, 2))
+    lift_off_distance = Column(DECIMAL(8, 2))
+    ground_status = Column(VARCHAR(40))
+    display_background = Column(VARCHAR(40))
+    noise_status = Column(VARCHAR(40))
+    touch_area = Column(VARCHAR(40))
+    contact_duration = Column(DECIMAL(8, 2))
+    number_of_fingers_on_screen = Column(DECIMAL(6, 2))
+    log = Column(LONGTEXT)
+    test_type = Column(VARCHAR(40))
+
+    stationary_jitter_avg_of_error_avgs = Column(DECIMAL(16, 3))
+    stationary_jitter_total_stdev_error = Column(DECIMAL(16, 3))
+    stationary_jitter_avg_of_max_errors = Column(DECIMAL(16, 3))
+    stationary_jitter_max_of_max_errors = Column(DECIMAL(16, 3))
+
+    total_number_of_missing_points = Column(Integer)
+
+    # The time of database entry creation set by the database server
+    created = Column(TIMESTAMP(), server_default=func.current_timestamp())
+
+class StationaryJitterStaticNoiseTest(TestBase):
+    """
+    Stationary jitter static noise test measures how much reported touch locations vary
+    from actual robot position under different conditions.
+    """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(16)
+    def create_testclass(*args, **kwargs):
+        return StationaryJitterStaticNoiseTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new test case class """
+        super(StationaryJitterStaticNoiseTest, self).__init__(ddtest_row, *args, **kwargs)
+        self.sql_summary_class = StationaryJitterStaticNoiseSummarySQL
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        return results['verdict']
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        t = Timer(1)
+
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        template_params = super(StationaryJitterStaticNoiseTest, self).create_common_templateparams(**kwargs)
+
+        results = self.read_test_results()
+
+        t.Time("Results")
+
+        # Add the image name and parameters to the report
+        template_params['results'] = results
+        template_params['figure'] = ImageFactory.create_image_name(self.test_id, 'stjitt')
+        template_params['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'stjitt', 'detailed')
+        template_params['test_page'] = 'test_stationary_jitter_static_noise.html'
+        template_params['test_script'] = 'test_page_subplots.js'
+        template_params['version'] = Version
+
+        template_params['test_parameters'] = (('Border width [mm]', results['border_width']),
+                                             ('Finger name', results['finger_name']),
+                                             ('Finger type', results['finger_type']),
+                                             ('Finger size [mm]', results['finger_size']),
+                                             ('Finger 2 name', results['finger2_name']),
+                                             ('Separation [mm]', results['separation']),
+                                             ('Step size [mm]', results['step_size']),
+                                             ('Lift off distance [mm]', results['lift_off_distance']),
+                                             ('Ground status', results['ground_status']),
+                                             ('Touch area', results['touch_area']),
+                                             ('Contact duration [ms]', results['contact_duration']),
+                                             ('Noise status', results['noise_status']),
+                                             ('Display background', results['display_background']),
+                                             ('Number of fingers on screen', results['number_of_fingers_on_screen']),
+                                             )
+
+        self.disable_upload_button_if_already_uploaded(template_params)
+
+        template = MarkupTemplate(open("templates/test_configured_body.html"))
+        stream = template.generate(**(template_params))
+        t.Time("Markup")
+        return stream.render('xhtml'), results['verdict']
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        # Dummy test has only one image: dummyimage.
+        if image_name == 'stjitt':
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results(dutinfo, dbsession)
+            title = 'Preview: Stationary Jitter Static Noise ' + self.dut['program']
+            plot_factory.plot_passfail_labels_on_target(imagepath, results, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'stjittdtls':
+            dbsession = db.get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_point_details(args[0], dutinfo, dbsession)
+            title = 'Preview: Stationary Jitter Static Noise details ' + self.dut['program']
+            plot_factory.plot_passfail_labels(imagepath, results, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        pts = dbsession.query(db.StationaryJitterStaticNoiseTest).filter(db.StationaryJitterStaticNoiseTest.test_id==self.test_id).\
+                                                             options(joinedload(db.StationaryJitterStaticNoiseTest.stationary_jitter_static_noise_results)).\
+                                                             order_by(db.StationaryJitterStaticNoiseTest.id)
+
+        num_pts = len(list(pts))
+
+        passed = []
+        failed = []
+        points = []
+        all_deviations = []
+        avg_max_jitter = 0
+        avg_mean_jitter = 0
+        total_stdev_jitter = 0
+        max_max_jitter = None
+        verdict = "N/A"
+        point_id = 1
+
+        noise_status = pts[0].noise_status if num_pts > 0 else ""
+        test_type = pts[0].test_type if num_pts > 0 else ""
+
+        # The pass/fail limit depends on the test case
+        if noise_status == '':
+            jitter_limit = settings['max_stat_jitter_no_noise']
+        else:
+            jitter_limit = settings['max_stat_jitter_noise']
+        if test_type == 'noise_test':
+            jitter_limit = settings['max_noise_test_jitter']
+
+        num_missing_points = 0
+        num_valid_points = 0
+
+        # For each touch location, compute maximum and standard deviation jitter.
+        for point in pts:
+            # Get panel points that result from the first finger (ID 0).
+            panel_points = []
+            for p in point.stationary_jitter_static_noise_results:
+                if p.finger_id == 0:
+                    panel_points.append((p.panel_x, p.panel_y))
+
+            target_points = analyzers.panel_to_target(panel_points, dutinfo)
+
+            robot_point = analyzers.robot_to_target((point.robot_x, point.robot_y), dutinfo)
+
+            if len(target_points) == 0:
+                # No measurements for point
+
+                failed.append(list(robot_point) + [str(point_id)])
+                points.append((point_id, None, "N/A", None))
+                point_id += 1
+
+                num_missing_points += 1
+            else:
+                num_valid_points += 1
+
+                points_np = np.array([np.array(p) for p in target_points])
+
+                min_point = np.min(points_np, axis=0)
+                max_point = np.max(points_np, axis=0)
+                point_max_jitter = np.linalg.norm(max_point - min_point)
+
+                point_max_jitter_rounded = analyzers.float_for_db(point_max_jitter)
+
+                mean_point = np.mean(points_np, axis=0)
+                mean_points = np.tile(mean_point, (len(target_points), 1))
+                deviations = np.linalg.norm(mean_points - points_np, axis=1)
+
+                all_deviations = np.concatenate((all_deviations, deviations))
+
+                point_avg_jitter = np.mean(deviations)
+                avg_mean_jitter += point_avg_jitter
+
+                point_verdict = "Fail" if point_max_jitter > jitter_limit else "Pass"
+                points.append((point_id, point_max_jitter_rounded, point_verdict, ImageFactory.create_image_name(self.test_id, 'stjittdtls', str(point.id))))
+
+                if max_max_jitter is None or point_max_jitter > max_max_jitter:
+                    max_max_jitter = point_max_jitter
+
+                avg_max_jitter += point_max_jitter
+
+                if point_verdict == "Pass":
+                    passed.append(list(target_points[0]) + [point_id])
+                else:
+                    failed.append(list(target_points[0]) + [point_id])
+
+                point_id += 1
+
+        if num_valid_points > 0:
+            avg_mean_jitter = analyzers.float_for_db(avg_mean_jitter / num_valid_points)
+            avg_max_jitter = analyzers.float_for_db(avg_max_jitter / num_valid_points)
+            max_max_jitter = analyzers.float_for_db(max_max_jitter)
+
+            verdict = "Fail" if avg_max_jitter > jitter_limit else "Pass"
+
+            # Compute standard deviation of all deviations.
+            total_stdev_jitter = analyzers.float_for_db(sqrt(np.mean(all_deviations ** 2)))
+        else:
+            # None values show up as "N/A" in the result page.
+            avg_mean_jitter = None
+            avg_max_jitter = None
+            max_max_jitter = None
+            total_stdev_jitter = None
+
+        if num_pts > 0:
+            missing_points_percentage = 100*num_missing_points / num_pts
+        else:
+            missing_points_percentage = 100
+
+        if missing_points_percentage <= settings['jitter_missing_points']:
+            missing_inputs_verdict = 'Pass'
+        else:
+            missing_inputs_verdict = 'Fail'
+
+        results = {'passed_points': passed,
+                   'failed_points': failed,
+                   'total_points': num_pts,
+                   'missing_points_percentage': missing_points_percentage,
+                   'missing_inputs_verdict': missing_inputs_verdict,
+                   'avg_mean_jitter': avg_mean_jitter,
+                   'avg_max_jitter': avg_max_jitter,
+                   'max_max_jitter': max_max_jitter,
+                   'total_stdev_jitter': total_stdev_jitter,
+                   'verdict': verdict,
+                   'points': points,
+                   'border_width': pts[0].border_width if num_pts > 0 else 0,
+                   'finger_name': pts[0].finger_name if num_pts > 0 else "",
+                   'finger_type': pts[0].finger_type if num_pts > 0 else "",
+                   'finger2_name': pts[0].finger2_name if num_pts > 0 else "",
+                   'separation': pts[0].separation if num_pts > 0 else 0,
+                   'step_size': pts[0].step_size if num_pts > 0 else 0,
+                   'finger_size': pts[0].finger_size if num_pts > 0 else 0,
+                   'lift_off_distance': pts[0].lift_off_distance if num_pts > 0 else 0,
+                   'noise_status': pts[0].noise_status if num_pts > 0 else "",
+                   'ground_status': pts[0].ground_status if num_pts > 0 else "",
+                   'display_background': pts[0].display_background if num_pts > 0 else "",
+                   'touch_area': pts[0].touch_area if num_pts > 0 else "",
+                   'contact_duration': pts[0].contact_duration if num_pts > 0 else 0,
+                   'number_of_fingers_on_screen': pts[0].number_of_fingers_on_screen if num_pts > 0 else 0,
+                   'missing_inputs': num_missing_points,
+                   'test_type': test_type
+                   }
+
+        return results
+
+    def read_point_details(self, point_id, dutinfo = None, dbsession = None):
+        if dbsession is None:
+            dbsession = db.get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        points = dbsession.query(db.StationaryJitterStaticNoiseResults).filter(db.StationaryJitterStaticNoiseResults.point_id==point_id).\
+                                                                   order_by(db.StationaryJitterStaticNoiseResults.id)
+
+        robot_point = dbsession.query(db.StationaryJitterStaticNoiseTest).filter(db.StationaryJitterStaticNoiseTest.id==point_id).\
+                                                                    order_by(db.StationaryJitterStaticNoiseTest.id)
+
+        # Get panel points that result from the first finger (ID 0).
+        panel_points = []
+        for p in points:
+            if p.finger_id == 0:
+                panel_points.append((p.panel_x, p.panel_y))
+
+        target_points = analyzers.panel_to_target(panel_points, dutinfo)
+
+        points = []
+        point_count = []
+
+        for point in target_points:
+            if point in points:
+                point_count[points.index(point)] += 1
+            else:
+                points.append(point)
+                point_count.append(1)
+
+        result = None
+
+        # When using max error metric it is not possible to separate passed and failed points.
+        # Just put all points in passed list.
+        if len(points) > 1:
+            orig = np.array(points[0])
+            distances = np.array([np.linalg.norm(np.array(p) - orig) for p in points])
+            passed = []
+            failed = []
+
+            for point, distance, count in zip(points, distances, point_count):
+                passed.append((point[0], point[1], str(count) if count > 1 else ''))
+
+            result = {'passed_points': passed, 'failed_points': failed, 'robot_point': robot_point}
+        elif len(points) == 1:
+            # Only one point in lists...
+            points = [(points[0][0], points[0][1], str(point_count[0]) if point_count[0] > 1 else '')]
+            result = {'passed_points': points, 'failed_points': [], 'robot_point': robot_point}
+        if len(points) == 0:
+            # No points
+            result = {'passed_points': [], 'failed_points': [], 'robot_point': robot_point}
+
+        return result
+
+    def upload_sql_data(self, session):
+        test_results = self.read_test_results()
+
+        test_item = self.get_test_item()
+        test_session = self.get_test_session()
+
+        summary = StationaryJitterStaticNoiseSummarySQL()
+
+        summary.test_id = self.test_id
+
+        summary.time_test_start = timestr_to_datetime(test_item.starttime)
+        summary.time_sequence_start = timestr_to_datetime(test_session.starttime)
+
+        # End time is None if sequence was not completed.
+        if test_session.endtime is not None:
+            summary.time_sequence_end = timestr_to_datetime(test_session.endtime)
+
+        summary.border_width = test_results["border_width"]
+        summary.finger_name = test_results["finger_name"]
+        summary.finger_type = test_results["finger_type"]
+        summary.finger_size = test_results["finger_size"]
+        summary.step_size = test_results["step_size"]
+        summary.lift_off_distance = test_results["lift_off_distance"]
+        summary.ground_status = test_results["ground_status"]
+        summary.display_background = test_results["display_background"]
+        summary.touch_area = test_results["touch_area"]
+        summary.noise_status = test_results["noise_status"]
+        summary.number_of_fingers_on_screen = test_results["number_of_fingers_on_screen"]
+        summary.contact_duration = test_results["contact_duration"]
+        summary.log = self.test_item['kmsg_log'] # The test_item comes form Testbase
+        summary.test_type = test_results['test_type']
+
+        summary.stationary_jitter_avg_of_error_avgs = test_results["avg_mean_jitter"]
+        summary.stationary_jitter_total_stdev_error = test_results["total_stdev_jitter"]
+        summary.stationary_jitter_avg_of_max_errors = test_results["avg_max_jitter"]
+        summary.stationary_jitter_max_of_max_errors = test_results["max_max_jitter"]
+
+        summary.total_number_of_missing_points = test_results["missing_inputs"]
+
+        session.add(summary)
+        session.commit()
\ No newline at end of file
diff --git a/TPPTAnalysisSW/tests/test_stationary_reporting_rate.py b/TPPTAnalysisSW/tests/test_stationary_reporting_rate.py
new file mode 100644
index 0000000..89a56fa
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_stationary_reporting_rate.py
@@ -0,0 +1,287 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import cherrypy
+import numpy
+from genshi.template import MarkupTemplate
+from sqlalchemy.orm import joinedload
+
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.measurementdb import get_database, OneFingerStationaryReportingRateTest
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.utils import Timer
+from TPPTAnalysisSW.info.version import Version
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+import TPPTAnalysisSW.analyzers as analyzers
+
+class StationaryReportingRateTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(11)
+    def create_testclass(*args, **kwargs):
+        return StationaryReportingRateTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name) and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new StationaryReportingRateTest class """
+        super(StationaryReportingRateTest, self).__init__(ddtest_row, *args, **kwargs)
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        results = self.read_test_results()
+        verdict = "N/A"
+        if "Fail" in results['verdicts']:
+            verdict = "Fail"
+        elif "Pass" in results['verdicts']:
+            verdict = "Pass"
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        s = Timer(1)
+
+        # clear analysis data
+        self.clearanalysis()
+
+        # Create common template parameters (including test_item dictionary, testsession dictionary, test_id, test_type_name etc)
+        templateParams = super(StationaryReportingRateTest, self).create_common_templateparams(**kwargs)
+
+        s.Time("Init")
+
+        # Read test results
+        results = self.read_test_results()
+
+        s.Time("Results")
+
+        templateParams['slowest_reporting_rate'] = results['slowest_reporting_rate']
+        templateParams['fastest_reporting_rate'] = results['fastest_reporting_rate']
+        templateParams['detailed_data'] = zip(results['point_ids'], results['max_reporting_rates'],
+                                              results['min_reporting_rates'], results['average_reporting_rates'], results['verdicts'], results['images'])
+
+        # Add the image name and parameters to the report
+        templateParams['figure'] = ImageFactory.create_image_name(self.test_id, 'strr')
+        templateParams['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'strr', 'detailed')
+
+        # set the content to be used
+        templateParams['test_page'] = 'test_stationary_reporting_rate.html'
+        templateParams['test_script'] = 'test_page_subplots.js'
+        templateParams['version'] = Version
+        s.Time("Parameters")
+
+        template = MarkupTemplate(open("templates/test_common_body.html"))
+        stream = template.generate(**(templateParams))
+        s.Time("Generate")
+
+        verdict = "N/A"
+        if "Fail" in results['verdicts']:
+            verdict = "Fail"
+        elif "Pass" in results['verdicts']:
+            verdict = "Pass"
+
+        return stream.render('xhtml'), verdict
+
+
+    # Create images for the report. If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+
+        if image_name == 'strr':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_test_results()
+            title = 'Preview: Stationary reporting rate ' + self.dut['program']
+            plot_factory.plot_passfail_labels_on_target(imagepath, results, dutinfo, *args, title=title, **kwargs)
+        elif image_name == 'strrdtls':
+            dbsession = get_database().session()
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+            results = self.read_point_info(args[0], dutinfo=dutinfo, dbsession=dbsession)
+            title = 'Preview: Stationary reporting rate ' + self.dut['program']
+            plot_factory.plot_reporting_rate(imagepath, results, title=title, **kwargs)
+        else:
+            raise cherrypy.HTTPError(message = "No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo = None, dbsession = None):
+
+        t = Timer(2)
+
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        test_results = dbsession.query(OneFingerStationaryReportingRateTest).filter(OneFingerStationaryReportingRateTest.test_id == self.test_id).\
+                                                                             order_by(OneFingerStationaryReportingRateTest.id).\
+                                                                             options(joinedload('one_finger_stationary_reporting_rate_results')).all()
+
+        t.Time("DB")
+
+        max_reporting_rates = []
+        min_reporting_rates = []
+        average_reporting_rates = []
+        verdicts = []
+        point_id = 0
+        point_ids = []
+        passed_points = []
+        failed_points = []
+        images = []
+
+        if 'minreportingrate' in settings and settings['minreportingrate'] > 0.0:
+            accept_delay = (1000.0 / float(settings['minreportingrate']))
+        else:
+            accept_delay = 0.0
+
+        for test_result in test_results:
+            results = test_result.one_finger_stationary_reporting_rate_results
+            max_reporting_rate = 0.0
+            min_reporting_rate = 0.0
+            previous_timestamp = 0.0
+            max_delay = 0.0
+            min_delay = 0.0
+            delays = []
+            verdict = "N/A" # No points
+            for result in results:
+                if previous_timestamp == 0.0:
+                    previous_timestamp = result.time
+                else:
+                    delay = result.time - previous_timestamp
+                    delays.append(delay)
+                    if delay >= max_delay:
+                        max_delay = delay
+                    if min_delay == 0.0:
+                        min_delay = delay
+                    elif delay > 0.0 and delay < min_delay:
+                        min_delay = delay
+                    previous_timestamp = result.time
+
+                    if delay > accept_delay:
+                        verdict = "Fail"
+                    elif verdict == "N/A":
+                        verdict = "Pass" # At least one accepted point exists -> Pass (if not later set to fail)
+
+
+            min_reporting_rate = analyzers.round_dec(1.0/(max_delay/1000.0)) if max_delay != 0.0 else None
+            max_reporting_rate = analyzers.round_dec(1.0/(min_delay/1000.0)) if min_delay != 0.0 else None
+            average_reporting_rate = analyzers.round_dec(1.0/(numpy.average(delays)/1000)) if len(delays) != 0 else None
+            min_reporting_rates.append(min_reporting_rate)
+            max_reporting_rates.append(max_reporting_rate)
+            average_reporting_rates.append(average_reporting_rate)
+            point_id += 1
+            point_ids.append(point_id)
+            if verdict == "Pass":
+                point = analyzers.robot_to_target((test_result.robot_x, test_result.robot_y), dutinfo)
+                passed_points.append((point[0], point[1], point_id, verdict))
+            else:
+                point = analyzers.robot_to_target((test_result.robot_x, test_result.robot_y), dutinfo)
+                failed_points.append((point[0], point[1], point_id, verdict))
+            verdicts.append(verdict)
+            images.append(ImageFactory.create_image_name(self.test_id, 'strrdtls', str(test_result.id)))
+
+        t.Time("Analysis")
+
+        results = {}
+        results['point_ids'] = point_ids
+        results['max_reporting_rates'] = max_reporting_rates
+        results['min_reporting_rates'] = min_reporting_rates
+        results['average_reporting_rates'] = average_reporting_rates
+        results['failed_points'] = failed_points
+        results['passed_points'] = passed_points
+        results['verdicts'] = verdicts
+        results['images'] = images
+
+        try:
+            results['slowest_reporting_rate'] = numpy.min([f for f in results['min_reporting_rates'] if f is not None])
+        except ValueError:
+            results['slowest_reporting_rate'] = None
+        try:
+            results['fastest_reporting_rate'] = numpy.max([f for f in results['max_reporting_rates'] if f is not None])
+        except ValueError:
+            results['fastest_reporting_rate'] = None
+
+        return results
+
+    def read_point_info(self, point_id, dutinfo = None, dbsession = None):
+
+        s = Timer(2)
+
+        if dbsession is None:
+            dbsession = get_database().session()
+        if dutinfo is None:
+            dutinfo = plotinfo.TestDUTInfo(testdut_id=self.dut['id'], dbsession=dbsession)
+
+        point = dbsession.query(OneFingerStationaryReportingRateTest).filter(OneFingerStationaryReportingRateTest.id == point_id).\
+                                                                             options(joinedload('one_finger_stationary_reporting_rate_results')).first()
+
+        points = []
+        pindex = 0
+        passed = []
+        failed = []
+        delays = []
+        max_delay = None
+        previous_timestamp = 0.0
+
+        if 'minreportingrate' in settings and settings['minreportingrate'] > 0.0:
+            accept_delay = (1000.0 / float(settings['minreportingrate']))
+        else:
+            accept_delay = 0.0
+
+        for result in point.one_finger_stationary_reporting_rate_results:
+            if previous_timestamp == 0.0:
+                previous_timestamp = result.time
+            else:
+                delay = result.time - previous_timestamp
+                if delay > 0.0:
+                    delays.append(delay)
+                    previous_timestamp = result.time
+
+                    if max_delay is None or max_delay < delay:
+                        max_delay = delay
+
+                    if delay > accept_delay:
+                        failed.append((pindex, delay))
+                    else:
+                        passed.append((pindex, delay))
+                    pindex += 1
+
+        results = {'passed': passed,
+                   'failed': failed,
+                   'max_allowed_delay': analyzers.round_dec(1.0/(float(settings['minreportingrate'])/1000.0)),
+                   #'points': points,
+                   'delays': delays,
+                   'max_delay': max_delay
+                   }
+
+        return results
diff --git a/TPPTAnalysisSW/tests/test_tapping_repeatability.py b/TPPTAnalysisSW/tests/test_tapping_repeatability.py
new file mode 100644
index 0000000..7a3c6e6
--- /dev/null
+++ b/TPPTAnalysisSW/tests/test_tapping_repeatability.py
@@ -0,0 +1,773 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from math import sqrt, isnan
+
+import cherrypy
+import numpy as np
+from genshi.template import MarkupTemplate
+from sqlalchemy import Column, DECIMAL, INTEGER, VARCHAR, ForeignKey, DATETIME, TIMESTAMP, func
+from sqlalchemy.dialects.mysql import LONGTEXT
+from sqlalchemy.orm import joinedload
+
+import TPPTAnalysisSW.analyzers as analyzers
+import TPPTAnalysisSW.measurementdb as db
+import TPPTAnalysisSW.plot_factory as plot_factory
+import TPPTAnalysisSW.plotinfo as plotinfo
+from TPPTAnalysisSW.sqluploader import Base
+from TPPTAnalysisSW.imagefactory import ImageFactory
+from TPPTAnalysisSW.info.version import Version
+from TPPTAnalysisSW.measurementdb import get_database, OneFingerTappingRepeatabilityTest
+from TPPTAnalysisSW.settings import settings
+from TPPTAnalysisSW.testbase import TestBase, testclasscreator, timestr_to_datetime
+from TPPTAnalysisSW.utils import Timer
+
+
+class TappingRepeatabilitySummarySQL(Base):
+    __tablename__ = 'touch_tapping_repeatability_summary'
+
+    meta_id = Column(INTEGER, primary_key=True)
+    time_test_start = Column(DATETIME)
+    test_id = Column(DECIMAL(10, 3))
+    time_sequence_start = Column(DATETIME)
+    time_sequence_end = Column(DATETIME)
+
+    border_width = Column(DECIMAL(8, 2))
+    finger_name = Column(VARCHAR(40))
+    finger_type = Column(VARCHAR(40))
+    finger_size = Column(DECIMAL(8,2))
+    display_background = Column(VARCHAR(40))
+
+    number_of_random_locations_center = Column(DECIMAL(8, 2))
+    number_of_random_locations_edge = Column(DECIMAL(8, 2))
+    number_of_random_locations_corner = Column(DECIMAL(8, 2))
+    number_of_taps_at_each_location = Column(DECIMAL(8, 2))
+
+    lift_off_distance = Column(DECIMAL(8, 2))
+    ground_status = Column(VARCHAR(40))
+    noise_status = Column(VARCHAR(40))
+    touch_area = Column(VARCHAR(40))
+    log = Column(LONGTEXT)
+
+
+    touch_direction = Column(VARCHAR(40))
+
+    tapping_repeatability_avg_of_error_avgs = Column(DECIMAL(16, 3))
+    tapping_repeatability_total_stdev_error = Column(DECIMAL(16, 3))
+    tapping_repeatability_avg_of_max_errors = Column(DECIMAL(16, 3))
+    tapping_repeatability_max_of_max_errors = Column(DECIMAL(16, 3))
+
+    total_number_of_missing_points = Column(INTEGER)
+
+    # The time of database entry creation set by the database server
+    created = Column(TIMESTAMP(), server_default=func.current_timestamp())
+
+
+class TappingRepeatabilityResultsSQL(Base):
+    __tablename__ = 'touch_tapping_repeatability_results'
+    meta_id = Column(INTEGER, primary_key=True)
+    test_meta_id = Column(INTEGER, ForeignKey('touch_tapping_repeatability_summary.meta_id', ondelete='CASCADE'),
+                          nullable=False)
+    point_id = Column(INTEGER)
+    touch_direction = Column(VARCHAR(40))
+
+    avg_tapping_repeatability = Column(DECIMAL(10, 3))
+    stdev_tapping_repeatability = Column(DECIMAL(10, 3))
+    max_tapping_repeatability = Column(DECIMAL(10, 3))
+
+    number_of_missing_points = Column(INTEGER)
+
+
+class TappingRepeatabilityTest(TestBase):
+    """ A dummy test class for use as a template in creating new test classes """
+
+    # This is the generator function for the class - it must exist in all derived classes
+    # Just update the id (dummy=99) and class name
+    @staticmethod
+    @testclasscreator(17)
+    def create_testclass(*args, **kwargs):
+        return TappingRepeatabilityTest(*args, **kwargs)
+
+    # Init function: make necessary initializations.
+    # Parent function initializes: self.test_id, self.test_item (dictionary, contains test_type_name),
+    # and self.testsession (dictionary)
+    def __init__(self, ddtest_row, *args, **kwargs):
+        """ Initializes a new TappingRepeatabilityTest class """
+        super(TappingRepeatabilityTest, self).__init__(ddtest_row, *args, **kwargs)
+
+        # Even though one could collect all this data from many different sources
+        # for clarity it is better to put everything in one dict (so that nothing breaks)
+        self.point_db_data = {}
+        self.point_errors_down = []
+        self.point_errors_up = []
+        self.results = None
+        self.dut_info = None
+        self.sql_summary_class = TappingRepeatabilitySummarySQL
+
+    # Override to make necessary analysis for test session success
+    def runanalysis(self, *args, **kwargs):
+        """ Runs the analysis, return a string containing the test result """
+        verdict = "Fail"
+        self.results = self.read_test_results()
+
+        max_allowed_error_pen_down, max_allowed_error_pen_lift = get_maximum_errors(self.results['touch_area'])
+
+        up_verdict = True if not isnan(self.results['avg_of_max_up_repeatability_error']) and \
+            self.results['avg_of_max_up_repeatability_error'] <= max_allowed_error_pen_lift else False
+
+        down_verdict = True if not isnan(self.results['avg_of_max_down_repeatability_error']) and \
+            self.results['avg_of_max_down_repeatability_error'] <= max_allowed_error_pen_down else False
+
+        if up_verdict and down_verdict:
+            verdict = "Pass"
+
+        return verdict
+
+    # Override to make necessary operations for clearing test results
+    # Clearing the test result from the results table is done elsewhere
+    def clearanalysis(self, *args, **kwargs):
+        """ Clears analysis results """
+        ImageFactory.delete_images(self.test_id)
+
+    # Create the test report. Return the created HTML, or raise cherrypy.HTTPError
+    def createreport(self, *args, **kwargs):
+
+        t = Timer(1)
+
+        self.clearanalysis()
+
+        # Create common template parameters,
+        # including test_item dictionary, testsession dictionary, test_id, test_type_name etc
+        template_params = super(TappingRepeatabilityTest, self).create_common_templateparams(**kwargs)
+        verdict = "Pass"
+        self.results = self.read_test_results()
+
+        template_params['touch_area'] = self.results['touch_area']
+        test_parameters = self.results['test_parameters']
+
+        # We need to use here embedded list (instead of dict) to be able to decide the order of appearance
+        template_params['test_parameters'] = (('Border Width [mm]', test_parameters['border_width']),
+                                              ('Finger Name', test_parameters['finger_name']),
+                                              ('Display Background', test_parameters['display_background']),
+                                              ('Number of taps at each location', test_parameters[
+                                                  'number_of_taps_at_each_location']),
+                                              ('Lift off distance [mm]', test_parameters['lift_off_distance']),
+                                              ('Ground status', test_parameters['ground_status']),
+                                              ('Touch area', self.results['touch_area']),
+                                              ('Noise status', test_parameters['noise_status']))
+
+        if self.results['touch_area'] == 'center_area':
+            template_params['test_parameters'] = template_params['test_parameters'] + \
+                                                 (('Number of random locations',
+                                                   test_parameters['number_of_random_locations_center']),)
+        elif self.results['touch_area'] == 'edge_area':
+            template_params['test_parameters'] = template_params['test_parameters'] + \
+                                                 (('Number of random locations, edge',
+                                                   test_parameters['number_of_random_locations_edge']),)
+        elif self.results['touch_area'] == 'corner_area':
+            template_params['test_parameters'] = template_params['test_parameters'] + \
+                                                 (('Number of random locations, corner',
+                                                   test_parameters['number_of_random_locations_corner']),)
+        else:
+            raise Exception('Invalid touch area "' + self.results['touch_area'] + '"')
+
+        template_params['max_allowed_error_pen_down'], template_params[
+            'max_allowed_error_pen_lift'] = get_maximum_errors(self.results['touch_area'])
+
+        t.Time("Results")
+        # Add the image name and parameters to the report
+        template_params['figure'] = ImageFactory.create_image_name(self.test_id, 'rept')
+        template_params['detailed_figure'] = ImageFactory.create_image_name(self.test_id, 'rept', 'detailed')
+
+        template_params['max_down_repeatability_error'] = self.results['max_down_repeatability_error']
+        template_params['avg_of_max_down_repeatability_error'] = self.results['avg_of_max_down_repeatability_error']
+        template_params['avg_down_repeatability_error'] = self.results['avg_down_repeatability_error']
+        template_params['std_dev_down_repeatability_error'] = self.results['stdev_down_repeatability_error']
+        template_params['verdict_down'] = 'Pass' if not isnan(self.results['avg_of_max_down_repeatability_error']) and \
+                                                    self.results['avg_of_max_down_repeatability_error'] <= template_params[
+                                                        'max_allowed_error_pen_down'] else 'Fail'
+
+        template_params['max_lift_repeatability_error'] = self.results['max_up_repeatability_error']
+        template_params['avg_of_max_lift_repeatability_error'] = self.results['avg_of_max_up_repeatability_error']
+        template_params['avg_lift_repeatability_error'] = self.results['avg_up_repeatability_error']
+        template_params['std_dev_lift_repeatability_error'] = self.results['stdev_up_repeatability_error']
+        template_params['verdict_lift'] = 'Pass' if not isnan(self.results['avg_of_max_up_repeatability_error']) and \
+                                                    self.results['avg_of_max_up_repeatability_error'] <= template_params[
+                                                        'max_allowed_error_pen_lift'] else 'Fail'
+
+        template_params['num_missing_total'] = self.results['num_missing_total']
+        template_params['num_points_total'] = self.results['num_points_total']
+
+        template_params['missing_point_percentage'] = self.results['missing_point_percentage']
+        template_params['missing_point_verdict'] = self.results['missing_point_verdict']
+        template_params['maxmissing_in_percentage'] = settings['repeatability_missing_points']
+
+        template_params['test_page'] = 'test_tapping_repeatability.html'
+        template_params['test_script'] = 'test_page_subplots.js'
+        template_params['version'] = Version
+
+        template_params['repeatability_errors_down'] = self.results['repeatability_errors_down']
+
+        subfigures = [None]  # Use one-based indexing
+        for point_errors in self.results['repeatability_errors_down']:
+            subfigures.append(ImageFactory.create_image_name(self.test_id, "repinfo_down", str(point_errors[4])))
+        template_params['pointPlots_down'] = subfigures
+
+        template_params['repeatability_errors_lift'] = self.results['repeatability_errors_up']
+
+        subfigures = [None]  # Use one-based indexing
+        for point_errors in self.results['repeatability_errors_up']:
+            subfigures.append(ImageFactory.create_image_name(self.test_id, "repinfo_lift", str(point_errors[4])))
+        template_params['pointPlots_lift'] = subfigures
+
+        self.disable_upload_button_if_already_uploaded(template_params)
+
+        t.Time("Params")
+
+        template = MarkupTemplate(open("templates/test_configured_body.html"))
+        stream = template.generate(**template_params)
+        t.Time("Markup")
+
+        if template_params['verdict_down'] == 'Fail' or template_params['verdict_lift'] == 'Fail':
+            verdict = "Fail"
+
+        return stream.render('xhtml'), verdict
+
+    # Create images for the report.
+    # If the function returns a value, it is used as the new image name (without image path)
+    def createimage(self, imagepath, image_name, *args, **kwargs):
+        if image_name == 'rept':
+            # Overview image
+            t = Timer(1)
+            results = self.results
+
+            if self.dut_info is None:
+                self.dut_info = plotinfo.TestDUTInfo(testdut_id=self.dut['id'])
+
+            t.Time("DB")
+            title = 'Preview: One Finger Tapping Repeatability ' + self.dut['program']
+            plot_factory.plot_tapping_passfail_labels_on_target(imagepath, results, self.dut_info, *args, title=title,
+                                                                **kwargs)
+            t.Time("Image")
+        elif image_name == 'repinfo':
+            # Individual point image
+            t = Timer(1)
+            point_id = int(args[1])
+            # Check if doing pen down or pen lift-off details
+            down = args[0] == 'down'
+            results = self.read_point_details(point_id, pen_down=down)
+            t.Time("DB")
+            plot_factory.plot_tapping_repeatability_details(imagepath, results, *args, **kwargs)
+            t.Time("Image")
+        else:
+            raise cherrypy.HTTPError(message="No such image in the report")
+
+        return None
+
+    def read_test_results(self, dutinfo=None):
+        dbsession = get_database().session()
+
+        if dutinfo is None:
+            self.dut_info = plotinfo.TestDUTInfo(testdut_id=self.dut['id'])
+        else:
+            self.dut_info = dutinfo
+
+        repeatability_test_points = dbsession.query(db.OneFingerTappingRepeatabilityTest) \
+                         .filter(db.OneFingerTappingRepeatabilityTest.test_id == self.test_id) \
+                         .options(joinedload(db.OneFingerTappingRepeatabilityTest.one_finger_tapping_repeatability_results)) \
+                         .order_by(db.OneFingerTappingRepeatabilityTest.id) \
+                         .all()
+
+        num_test_points = len(list(repeatability_test_points))
+
+        number_of_taps_at_each_location = repeatability_test_points[0].number_of_taps_at_each_location if num_test_points > 0 else 0
+
+        # Some information just needs to be passed through the analyses
+        test_parameters = {'border_width': repeatability_test_points[0].border_width if num_test_points > 0 else 0,
+                           'finger_name': repeatability_test_points[0].finger_name if num_test_points > 0 else "",
+                           'finger_type': repeatability_test_points[0].finger_type if num_test_points > 0 else "",
+                           'finger_size': repeatability_test_points[0].finger_size if num_test_points > 0 else 0,
+                           'display_background': repeatability_test_points[0].display_background if num_test_points > 0 else "",
+                           'number_of_random_locations_center': repeatability_test_points[0].number_of_random_locations_center if num_test_points > 0 else 0,
+                           'number_of_random_locations_edge': repeatability_test_points[0].number_of_random_locations_edge if num_test_points > 0 else 0,
+                           'number_of_random_locations_corner': repeatability_test_points[0].number_of_random_locations_corner if num_test_points > 0 else 0,
+                           'number_of_taps_at_each_location': number_of_taps_at_each_location,
+                           'lift_off_distance': repeatability_test_points[0].lift_off_distance if num_test_points > 0 else 0,
+                           'ground_status': repeatability_test_points[0].ground_status if num_test_points > 0 else "",
+                           'noise_status': repeatability_test_points[0].noise_status if num_test_points > 0 else ""
+                           }
+
+        # Group the results by the point_id for easier handling
+        # At the same time add a running point id as the first member of the array
+        results = {}
+        point_counter = 0
+
+        num_missing_touch_down_total = 0
+        num_missing_touch_up_total = 0
+
+        for point in repeatability_test_points:
+            # Collecting all the data per tap in dictionary (since there are multiple taps per point)
+            point_counter += 1
+            point_number = point.point_number
+            results_per_tap = {}
+
+            # Find touch down or touch up events from recorded event stream.
+            filtered_points = analyzers.filter_points(point.one_finger_tapping_repeatability_results)
+
+            for touch_data in filtered_points:
+                if touch_data.tap_id not in results_per_tap:
+                    results_per_tap[touch_data.tap_id] = [touch_data]
+                else:
+                    results_per_tap[touch_data.tap_id].append(touch_data)
+
+            results[point_number] = {'robot_x': point.robot_x,
+                                     'robot_y': point.robot_y,
+                                     'taps': {}}
+            for tap_id, touch_data in results_per_tap.items():
+                touch_down = None
+                touch_up = None
+
+                # Make sure first touch event is "touch down".
+                if len(touch_data) > 0 and touch_data[0].event == 0:
+                    touch_down = (touch_data[0].panel_x, touch_data[0].panel_y)
+
+                # Make sure last touch event is "touch up".
+                if len(touch_data) > 0 and touch_data[-1].event == 1:
+                    touch_up = (touch_data[-1].panel_x, touch_data[-1].panel_y)
+
+                down_up_per_tap = {'touch_down': touch_down,
+                                   'touch_up': touch_up}
+
+                results[point_number]['taps'][tap_id] = down_up_per_tap
+
+        verdicts_down = [None] * point_counter
+        verdicts_up = [None] * point_counter
+        point_numbers = [None] * point_counter
+        passed_points = []
+        failed_points = []
+        data_for_drawings = {}
+
+        down_accuracy_errors = [0.0] * point_counter
+        up_accuracy_errors = [0.0] * point_counter
+
+        for point_number, data in results.items():
+            x_coordinates_down = []
+            y_coordinates_down = []
+            x_coordinates_up = []
+            y_coordinates_up = []
+            point_id = point_number - 1  # point_number starts from 1
+
+            # Initially set the reference point to be the robot point
+            reference_x_down = data['robot_x']
+            reference_y_down = data['robot_y']
+            reference_x_up = data['robot_x']
+            reference_y_up = data['robot_y']
+
+            data_for_drawings[str(point_number)] = {'reference_point_down': (reference_x_down, reference_y_down),
+                                                    'reference_point_up': (reference_x_up, reference_y_up),
+                                                    'touch_down': [],
+                                                    'touch_up': []}
+
+            # Number of taps reported by device for current location.
+            num_touch_down = 0
+            num_touch_up = 0
+
+            for tap, coords in data['taps'].items():
+                touch_down = coords['touch_down']
+                touch_up = coords['touch_up']
+
+                if touch_down is not None:
+                    point_down = analyzers.panel_to_target((touch_down[0], touch_down[1]), self.dut_info)
+                    x_coordinates_down.append(point_down[0])
+                    y_coordinates_down.append(point_down[1])
+                    data_for_drawings[str(point_number)]['touch_down'].append(point_down)
+                    num_touch_down += 1
+
+                if touch_up is not None:
+                    point_up = analyzers.panel_to_target((touch_up[0], touch_up[1]), self.dut_info)
+                    x_coordinates_up.append(point_up[0])
+                    y_coordinates_up.append(point_up[1])
+                    data_for_drawings[str(point_number)]['touch_up'].append(point_up)
+                    num_touch_up += 1
+
+            number_of_missing_touch_down = number_of_taps_at_each_location - num_touch_down
+            number_of_missing_touch_up = number_of_taps_at_each_location - num_touch_up
+
+            num_missing_touch_down_total += number_of_missing_touch_down
+            num_missing_touch_up_total += number_of_missing_touch_up
+
+            # Overwrite drawing reference point and calculate errors based on the average location of all the points
+            if x_coordinates_down:
+                reference_x_down = np.average(x_coordinates_down)
+            if y_coordinates_down:
+                reference_y_down = np.average(y_coordinates_down)
+            data_for_drawings[str(point_number)]['reference_point_down'] = (reference_x_down, reference_y_down)
+
+            down_accuracy_errors[point_id] = calculate_errors(reference_x_down, reference_y_down,
+                                                              x_coordinates_down,
+                                                              y_coordinates_down)
+
+            self.point_errors_down += down_accuracy_errors[point_id]
+
+            if x_coordinates_up:
+                reference_x_up = np.average(x_coordinates_up)
+            if y_coordinates_up:
+                reference_y_up = np.average(y_coordinates_up)
+            data_for_drawings[str(point_number)]['reference_point_up'] = (reference_x_up, reference_y_up)
+
+            up_accuracy_errors[point_id] = calculate_errors(reference_x_up, reference_y_up,
+                                                            x_coordinates_up,
+                                                            y_coordinates_up)
+
+            self.point_errors_up += up_accuracy_errors[point_id]
+
+            # Calculating the single point values
+            if down_accuracy_errors[point_id]:
+                down_accuracy_errors_array = np.array(down_accuracy_errors[point_id])
+                down_err_avg = np.average(down_accuracy_errors_array)
+                down_err_stdev = sqrt(np.mean(down_accuracy_errors_array ** 2))
+                down_err_max = max(down_accuracy_errors_array)
+            else:
+                down_err_avg = None
+                down_err_stdev = None
+                down_err_max = None
+
+            if up_accuracy_errors[point_id]:
+                up_accuracy_errors_array = np.array(up_accuracy_errors[point_id])
+                up_err_avg = np.average(up_accuracy_errors_array)
+                up_err_stdev = sqrt(np.mean(up_accuracy_errors_array ** 2))
+                up_err_max = max(up_accuracy_errors_array)
+            else:
+                up_err_avg = None
+                up_err_stdev = None
+                up_err_max = None
+
+            # Storing the single point values, typecasting in string just in case
+            self.point_db_data[str(point_number)] = {'touch_down': {'avg': analyzers.float_for_db(down_err_avg),
+                                                                    'stdev': analyzers.float_for_db(down_err_stdev),
+                                                                    'max': analyzers.float_for_db(down_err_max),
+                                                                    'num_missing': number_of_missing_touch_down},
+                                                     'touch_up': {'avg': analyzers.float_for_db(up_err_avg),
+                                                                  'stdev': analyzers.float_for_db(up_err_stdev),
+                                                                  'max': analyzers.float_for_db(up_err_max),
+                                                                  'num_missing': number_of_missing_touch_up}
+                                                     }
+
+            point_numbers[point_id] = point_number
+
+            max_pen_down_error, max_pen_up_error = get_maximum_errors(repeatability_test_points[0].touch_area)
+
+            if down_accuracy_errors[point_id]:
+                # If there are any values in the list, check the maximum against the set limit
+                down_error_exceeds_limit = max(down_accuracy_errors[point_id]) > analyzers.float_for_db(max_pen_down_error)
+            else:
+                # No values, consider it failed
+                down_error_exceeds_limit = True
+
+            # Same handling as above
+            if up_accuracy_errors[point_id]:
+                up_error_exceeds_limit = max(up_accuracy_errors[point_id]) > analyzers.float_for_db(max_pen_up_error)
+            else:
+                up_error_exceeds_limit = True
+
+            if down_error_exceeds_limit or up_error_exceeds_limit:
+                failed_points.append((data['robot_x'], data['robot_y'], point_id + 1))
+            else:
+                passed_points.append((data['robot_x'], data['robot_y'], point_id + 1))
+
+            verdicts_down[point_id] = "Fail" if down_error_exceeds_limit else "Pass"
+            verdicts_up[point_id] = "Fail" if up_error_exceeds_limit else "Pass"
+
+        try:
+            down_max = analyzers.float_for_db(np.max([np.max(errors) for errors in down_accuracy_errors if errors]))
+            down_avg_of_max = analyzers.float_for_db(np.average([np.max(errors) for errors in down_accuracy_errors if errors]))
+            down_avg = analyzers.float_for_db(np.average([np.average(errors) for errors in down_accuracy_errors if errors]))
+        except ValueError:
+            down_max = np.NaN
+            down_avg_of_max = np.NaN
+            down_avg = np.NaN
+
+        down_sd = analyzers.float_for_db(sqrt(np.mean(np.array(self.point_errors_down) ** 2))) if self.point_errors_down else np.NaN
+
+        try:
+            up_max = analyzers.float_for_db(np.max([np.max(errors) for errors in up_accuracy_errors if errors]))
+            up_avg_of_max = analyzers.float_for_db(np.average([np.max(errors) for errors in up_accuracy_errors if errors]))
+            up_avg = analyzers.float_for_db(np.average([np.average(errors) for errors in up_accuracy_errors if errors]))
+        except ValueError:
+            up_max = np.NaN
+            up_avg_of_max = np.NaN
+            up_avg = np.NaN
+
+        up_sd = analyzers.float_for_db(sqrt(np.mean(np.array(self.point_errors_up) ** 2))) if self.point_errors_up else np.NaN
+
+        # Total number of points including both "touch up" and "touch down".
+        num_points_total = len(list(repeatability_test_points)) * number_of_taps_at_each_location * 2
+        num_missing_total = num_missing_touch_down_total + num_missing_touch_up_total
+
+        # Missing points do not affect the total verdict
+        if num_points_total > 0:
+            missing_point_percentage = 100 * num_missing_total / num_points_total
+            if missing_point_percentage <= settings['repeatability_missing_points']:
+                missing_point_verdict = 'Pass'
+            else:
+                missing_point_verdict = 'Fail'
+        else:
+            missing_point_percentage = 100
+            missing_point_verdict = 'Fail'
+
+        results = {'border_width': repeatability_test_points[0].border_width if num_test_points > 0 else 0,
+                   'max_down_repeatability_error': down_max,
+                   'avg_of_max_down_repeatability_error': down_avg_of_max,
+                   'avg_down_repeatability_error': down_avg,
+                   'stdev_down_repeatability_error': down_sd,
+                   'max_up_repeatability_error': up_max,
+                   'avg_of_max_up_repeatability_error': up_avg_of_max,
+                   'avg_up_repeatability_error': up_avg,
+                   'stdev_up_repeatability_error': up_sd,
+                   'repeatability_errors_down': format_error_list(down_accuracy_errors, verdicts_down, point_numbers),
+                   'repeatability_errors_up': format_error_list(up_accuracy_errors, verdicts_up, point_numbers),
+                   'passed_points': passed_points,
+                   'failed_points': failed_points,
+                   'touch_area': repeatability_test_points[0].touch_area if num_test_points > 0 else "",
+                   'test_parameters': test_parameters,
+                   'data_for_drawings': data_for_drawings,
+                   'num_missing_touch_down_total': num_missing_touch_down_total,
+                   'num_missing_touch_up_total': num_missing_touch_up_total,
+                   'num_missing_total': num_missing_total,
+                   'num_points_total': num_points_total,
+                   'missing_point_percentage': missing_point_percentage,
+                   'missing_point_verdict': missing_point_verdict}
+
+        dbsession.close()
+        return results
+
+    def read_point_details(self, point_id, pen_down):
+        """
+        Runs read_test_results and collects data from there in the form that the picture drawing function
+        requires it
+        :param point_id:
+        :param pen_down:
+        :param dutinfo:
+        :return:
+        """
+        all_results = self.results
+        point_results = all_results['data_for_drawings'][str(point_id)]
+
+        error_settings = get_maximum_errors(all_results['touch_area'])
+        max_error = error_settings[0] if pen_down else error_settings[1]
+
+        reference_point = point_results['reference_point_down'] if pen_down else point_results['reference_point_up']
+        points_arr = []
+        results = {}
+
+        if pen_down:
+            for point in point_results['touch_down']:
+                points_arr.append(point)
+        else:  # pen_up
+            for point in point_results['touch_up']:
+                points_arr.append(point)
+
+        failed, failed_count, passed, passed_count = analyze_points(max_error, points_arr, reference_point)
+
+        results['reference_point'] = reference_point
+        results['error_radius'] = max_error
+        results['passed_points'] = passed
+        results['passed_points_count'] = passed_count
+        results['failed_points'] = failed
+        results['failed_points_count'] = failed_count
+
+        return results
+
+    def upload_sql_data(self, session):
+        # Add test summary to database
+        if self.results is not None:
+            test_results = self.results
+        else:
+            self.results = self.read_test_results()
+            test_results = self.results
+
+        test_item = self.get_test_item()
+        test_session = self.get_test_session()
+
+        for touch_dir in ['touch_down', 'touch_up']:
+            summary = TappingRepeatabilitySummarySQL()
+
+            summary.test_id = self.test_id
+
+            test_parameters = test_results['test_parameters']
+
+            summary.time_test_start = timestr_to_datetime(test_item.starttime)
+            summary.time_sequence_start = timestr_to_datetime(test_session.starttime)
+
+            # End time is None if sequence was not completed.
+            if test_session.endtime is not None:
+                summary.time_sequence_end = timestr_to_datetime(test_session.endtime)
+
+            summary.border_width = test_parameters['border_width']
+            summary.finger_name = test_parameters['finger_name']
+            summary.finger_type = test_parameters['finger_type']
+            summary.finger_size = test_parameters['finger_size']
+            summary.display_background = test_parameters['display_background']
+
+            summary.number_of_random_locations_center = test_parameters['number_of_random_locations_center']
+            summary.number_of_random_locations_edge = test_parameters['number_of_random_locations_edge']
+            summary.number_of_random_locations_corner = test_parameters['number_of_random_locations_corner']
+            summary.number_of_taps_at_each_location = test_parameters['number_of_taps_at_each_location']
+
+            summary.lift_off_distance = test_parameters['lift_off_distance']
+            summary.ground_status = test_parameters['ground_status']
+            summary.noise_status = test_parameters['noise_status']
+            summary.touch_area = test_results['touch_area']
+            summary.log = self.test_item['kmsg_log'] # The test_item comes form Testbase
+
+
+            summary.touch_direction = touch_dir
+
+            # Separate results for different touch directions
+            if touch_dir == 'touch_down':
+                summary.tapping_repeatability_avg_of_error_avgs = test_results['avg_down_repeatability_error']
+                summary.tapping_repeatability_total_stdev_error = test_results['stdev_down_repeatability_error']
+                summary.tapping_repeatability_avg_of_max_errors = test_results['avg_of_max_down_repeatability_error']
+                summary.tapping_repeatability_max_of_max_errors = test_results['max_down_repeatability_error']
+                summary.total_number_of_missing_points = test_results['num_missing_touch_down_total']
+            else:  # touch up
+                summary.tapping_repeatability_avg_of_error_avgs = test_results['avg_up_repeatability_error']
+                summary.tapping_repeatability_total_stdev_error = test_results['stdev_up_repeatability_error']
+                summary.tapping_repeatability_avg_of_max_errors = test_results['avg_of_max_up_repeatability_error']
+                summary.tapping_repeatability_max_of_max_errors = test_results['max_up_repeatability_error']
+                summary.total_number_of_missing_points = test_results['num_missing_touch_up_total']
+
+            session.add(summary)
+            session.commit()
+
+            # Add individual points to database (NOTE: test meta_id is only created
+            # when the summary is added to database)
+            test_meta_id = summary.meta_id
+
+            # Write results for individual points
+            if test_results['touch_area'] == 'center_area':
+                num_of_points = test_parameters['number_of_random_locations_center']
+            elif test_results['touch_area'] == 'edge_area':
+                num_of_points = test_parameters['number_of_random_locations_edge'] * 4  # there are 4 edges
+            elif test_results['touch_area'] == 'corner_area':
+                num_of_points = test_parameters['number_of_random_locations_corner'] * 4  # there are 4 corners
+            else:
+                raise Exception('Invalid touch area')
+
+            for point in range(num_of_points):
+                point_id = point + 1
+
+                results = TappingRepeatabilityResultsSQL()
+
+                # Writing touch specific data to the database
+                results.touch_direction = touch_dir
+                results.test_meta_id = test_meta_id
+                results.point_id = point_id
+
+                # NOTE: we might not have results for all the points!
+                try:
+                    touch_data = self.point_db_data[str(point_id)][touch_dir]
+                    results.avg_tapping_repeatability = touch_data['avg']
+                    results.stdev_tapping_repeatability = touch_data['stdev']
+                    results.max_tapping_repeatability = touch_data['max']
+                    results.number_of_missing_points = touch_data['num_missing']
+                except:
+                    results.avg_tapping_repeatability = None
+                    results.stdev_tapping_repeatability = None
+                    results.max_tapping_repeatability = None
+                    pass
+                session.add(results)
+                session.commit()
+
+
+##############################################
+# Auxiliary functions
+##############################################
+
+def analyze_points(max_error, points_arr, reference_point):
+    failed = []
+    failed_count = []
+    passed = []
+    passed_count = []
+
+    if len(points_arr) > 0:
+        for point in points_arr:
+            point_error = sqrt(
+                (reference_point[0] - point[0]) ** 2 + (reference_point[1] - point[1]) ** 2)
+            if point_error > max_error:
+                if point in failed:
+                    failed_count[failed.index(point)] += 1
+                else:
+                    failed.append(point)
+                    failed_count.append(1)
+            else:
+                if point in passed:
+                    passed_count[passed.index(point)] += 1
+                else:
+                    passed.append(point)
+                    passed_count.append(1)
+
+    return failed, failed_count, passed, passed_count
+
+
+def format_error_list(accuracy_errors, verdicts, points):
+    max_errors = []
+    avg_errors = []
+    stdev_errors = []
+    for error_list in accuracy_errors:
+        try:
+            max_errors.append(max(error_list))
+            avg_errors.append(np.average(error_list))
+            stdev_errors.append(np.std(error_list))
+        except ValueError:
+            max_errors.append(np.NaN)
+            avg_errors.append(np.NaN)
+            stdev_errors.append(np.NaN)
+
+    return list(
+        zip(analyzers.float_for_db_array(max_errors),
+            analyzers.float_for_db_array(avg_errors),
+            analyzers.float_for_db_array(stdev_errors),
+            verdicts,
+            points))
+
+
+def calculate_errors(reference_x, reference_y, x_coordinates, y_coordinates):
+    differences = [(x - reference_x, y - reference_y) for (x, y) in zip(x_coordinates, y_coordinates)]
+
+    return [sqrt(x ** 2 + y ** 2) for (x, y) in differences]
+
+
+def get_maximum_errors(touch_area):
+    max_pen_down_error = 0.0
+    max_pen_up_error = 0.0
+
+    if touch_area == 'edge_area':
+        max_pen_down_error = settings['max_error_edge_down']
+        max_pen_up_error = settings['max_error_edge_up']
+    elif touch_area == 'center_area':
+        max_pen_down_error = settings['max_error_center_down']
+        max_pen_up_error = settings['max_error_center_up']
+    elif touch_area == 'corner_area':
+        max_pen_down_error = settings['max_error_corner_down']
+        max_pen_up_error = settings['max_error_corner_up']
+
+    return max_pen_down_error, max_pen_up_error
diff --git a/TPPTAnalysisSW/tmp.py b/TPPTAnalysisSW/tmp.py
new file mode 100644
index 0000000..953b7f8
--- /dev/null
+++ b/TPPTAnalysisSW/tmp.py
@@ -0,0 +1,133 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from .utils import Timer
+
+#import matplotlib.pyplot as plt
+#import plot_factory
+#import transform2d 
+#import math
+#import threading
+
+#import measurementdb
+#import sqlite3
+#import time
+
+def test_line_transformation():
+    #line = [(-1, -1), (1, 2)]
+    line = [(1, 1), (0, 0.9), (-1, 1.1)]
+
+    direction = (line[-1][0] - line[0][0], line[-1][1] - line[0][1])
+    angle = math.atan2(direction[1], direction[0])
+    print "Angle: %.3f*pi" % (angle / math.pi)
+    transform = transform2d.Transform2D.offset(-line[0][0], -line[0][1]) + transform2d.Transform2D.rotate_radians(-angle)
+    line2 = transform.transform(line)
+
+    plt.figure(1)
+    plt.axis('equal')
+    plt.plot([p[0] for p in line], [p[1] for p in line])
+    plt.plot([p[0] for p in line2], [p[1] for p in line2])
+    plt.show()
+
+def run_tap_test():
+    """ Simulate a tap test by creating a test and adding new taps repeatedly """
+
+    testsession_id = 2 # Measurement will be added to this session
+    original_test_id = 15 # Measurements will be copied from this test id
+
+    db = measurementdb.get_database()
+    session = db.session()
+
+    test = {'testsession_id': testsession_id, 
+            'starttime': '2014-01-31 16:27:17', 
+            'endtime' : '2014-01-31 16:28:07', 
+            'sample_id': None, 
+            'slot_id': 1, 
+            'invalid': 0, 
+            'testtype_id': 0}
+    test = measurementdb.TestItem(**test)
+    session.add(test)
+    session.flush()
+    print "New test id: %d" % test.id 
+
+    taps = session.query(measurementdb.OneFingerTapTest).filter(measurementdb.OneFingerTapTest.test_id == original_test_id).\
+                                                         order_by(measurementdb.OneFingerTapTest.id)
+
+    #oft_columns = ['jitter', 'robot_x', 'robot_y', 'robot_z', 'point_number', 'panel_x', 'panel_y', 'sensitivity', 'finger_id', 'delay', 'time']
+    oft_columns = [c.name for c in measurementdb.OneFingerTapTest.__table__.columns]
+    print str(oft_columns)
+    for tap in taps:
+        dbtap = measurementdb.OneFingerTapTest()
+        for column in oft_columns:
+            setattr(dbtap, column, getattr(tap, column))
+        dbtap.test = test
+        session.add(dbtap)
+        session.commit()
+        print "Added tap id %d" % dbtap.id
+        time.sleep(0.5)
+
+def create_image(index):
+    plot_factory.plot_dummy_image('static/img/generated/dummy%d.png' % index, {'points':[(0,index), (1,2*index), (2*index,4)]}, str="Test %d" % index)
+
+def run_synchro_test():
+    import utils
+    utils.Timer.do_timing = True
+    for i in range(1, 10):
+        t = threading.Thread(target=create_image, args=(i,))
+        t.start()
+
+def copy_testsessions(conn_src, conn_dst):
+    c = conn_src.cursor()
+    for row in c.execute("select * from test_sessions order by id"):
+        # Create new test session
+        conn_dst.execute("insert into test_session values(?, ?, ?, ?, ?, ?)", (row['id'], row['operator'], row['starttime'], row['endtime'], row['invalid'], row['notes']))
+        # Create a new DUT
+        conn_dst.execute("insert into test_dut values(?, ?, ?, ?, ?)", (row['id'], row['program'], row['manufacturer'], row['batch'], 'Sample'))
+    # Copy test items
+    for row in c.execute("select * from ddt_test order by id"):
+        conn_dst.execute("insert into test_item values(?, ?, ?, ?, ?, ?, ?, ?, ?)", 
+                         (row['id'], row['testsession_id'], row['testsession_id'], row['starttime'], row['endtime'], 
+                          row['slot_id'], 'OF', row['invalid'], row['testtype_id']))
+
+
+def copy_db(src, dest): 
+    conn_src = sqlite3.connect(src)
+    conn_src.row_factory = sqlite3.Row
+    conn_dst = sqlite3.connect(dest)
+
+    copy_testsessions(conn_src, conn_dst)
+    conn_src.close()
+    conn_dst.commit()
+    conn_dst.close()
+
+import tests.test_multifinger_tap
+from testbase import TestBase
+
+def test_multifinger_tap(test_id):
+    Timer.do_timing = True
+    testclass = TestBase.create(test_id)
+    results = testclass.read_test_results()
+    print str(results)
+
+if __name__ == '__main__':
+    #copy_db(r'c:\Work\database_old.sqlite', r'c:\Work\database.sqlite')
+    test_multifinger_tap('4')
\ No newline at end of file
diff --git a/TPPTAnalysisSW/toolbox/__init__.py b/TPPTAnalysisSW/toolbox/__init__.py
new file mode 100644
index 0000000..2f7aaf6
--- /dev/null
+++ b/TPPTAnalysisSW/toolbox/__init__.py
@@ -0,0 +1,22 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+from . import dut
\ No newline at end of file
diff --git a/TPPTAnalysisSW/toolbox/dut.py b/TPPTAnalysisSW/toolbox/dut.py
new file mode 100644
index 0000000..1b0e3e0
--- /dev/null
+++ b/TPPTAnalysisSW/toolbox/dut.py
@@ -0,0 +1,347 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+import cv2
+import numpy as np
+import logging
+from xml.dom.minidom import parseString as minidom_parseString
+from svgpathtools.svg2paths import polyline2pathd, parse_path, svg2paths
+
+
+log = logging.getLogger(__name__)
+
+
+class SvgRegion:
+    """
+    Use svg vector graphic file to describe DUT shape.
+    - test if points are inside or outside of a test region
+    - test if a shape can be drawn on screen to certain place
+    - etc.
+
+    The svg file should include at least shapes with name
+        'test_region': the area that can be touched with robot finger
+        'analysis_region: the area that should be included in analysis
+        'bounds': the rectangular area containing the screen completely
+    """
+    def __init__(self):
+        self.bounding_box = None
+        self.region = {}
+
+    def load_file(self, filename):
+        """
+        Load a svg file with filename
+        :param filename: filename with path
+        """
+        paths, attributes = svg2paths(filename)
+        self._load_svg(paths, attributes)
+
+    def load_string(self, svg_string):
+        """
+        Load a svg file from string
+        :param svg_string: svg file as string
+        """
+        paths, attributes = self.__svgstring2paths(svg_string)
+        self._load_svg(paths, attributes)
+
+    def _load_svg(self, paths, attributes):
+        """
+        The actual load function
+        Loads the needed regions to member variables
+
+        :param paths: svg paths in svgpathtools internal paths type
+        :param attributes: svg attributes in svgpathtools internal paths type
+        """
+
+        # get REGION, BOUNDS from svg
+        bounding_box = None
+        self.region = {}
+
+        def bounds(path):
+            x0, x1, y0, y1 = path.bbox()
+            return x0, y0, x1, y1
+
+        def join_bounds(b0, b1):
+            xcoords = np.array([b0[0], b0[2], b1[0], b1[2]])
+            ycoords = np.array([b0[1], b0[3], b1[1], b1[3]])
+            x0 = float(np.min(xcoords))
+            x1 = float(np.max(xcoords))
+            y0 = float(np.min(ycoords))
+            y1 = float(np.max(ycoords))
+            return x0, y0, x1, y1
+
+        for p, a in zip(paths, attributes):
+            rid = a.get('id', "")
+
+            self.region[rid] = p
+            if bounding_box is None:
+                bounding_box = bounds(p)
+            else:
+                bounding_box = join_bounds(bounding_box, bounds(p))
+
+        # translate to x/y 0,0 origin
+        for region_id in self.region:
+            self.region[region_id] = self.region[region_id].translated(complex(-bounding_box[0], -bounding_box[1]))
+
+        bounding_box = [0, 0, bounding_box[2] - bounding_box[0], bounding_box[3] - bounding_box[1]]
+        self.bounding_box = bounding_box
+
+    @staticmethod
+    def __svgstring2paths(svg_string,
+                          convert_lines_to_paths=True,
+                          convert_polylines_to_paths=True,
+                          convert_polygons_to_paths=True,
+                          return_svg_attributes=False):
+        """
+        Not in svgpathtools so added here as private function
+
+        Converts an SVG string into a list of Path objects and a list of
+        dictionaries containing their attributes.  This currently supports
+        SVG Path, Line, Polyline, and Polygon elements.
+        This function originally missing from SvgPathTools, added for dut purposes
+        :param svg_string: the location of the svg file
+        :param convert_lines_to_paths: Set to False to disclude SVG-Line objects
+        (converted to Paths)
+        :param convert_polylines_to_paths: Set to False to disclude SVG-Polyline
+        objects (converted to Paths)
+        :param convert_polygons_to_paths: Set to False to disclude SVG-Polygon
+        objects (converted to Paths)
+        :param return_svg_attributes: Set to True and a dictionary of
+        svg-attributes will be extracted and returned
+        :return: list of Path objects, list of path attribute dictionaries, and
+        (optionally) a dictionary of svg-attributes
+
+        """
+        doc = minidom_parseString(svg_string)
+
+        def dom2dict(element):
+            """Converts DOM elements to dictionaries of attributes."""
+            keys = list(element.attributes.keys())
+            values = [val.value for val in list(element.attributes.values())]
+            return dict(list(zip(keys, values)))
+
+        # Use minidom to extract path strings from input SVG
+        paths = [dom2dict(el) for el in doc.getElementsByTagName('path')]
+        d_strings = [el['d'] for el in paths]
+        attribute_dictionary_list = paths
+        # if pathless_svg:
+        #     for el in doc.getElementsByTagName('path'):
+        #         el.parentNode.removeChild(el)
+
+        # Use minidom to extract polyline strings from input SVG, convert to
+        # path strings, add to list
+        if convert_polylines_to_paths:
+            plins = [dom2dict(el) for el in doc.getElementsByTagName('polyline')]
+            d_strings += [polyline2pathd(pl['points']) for pl in plins]
+            attribute_dictionary_list += plins
+
+        # Use minidom to extract polygon strings from input SVG, convert to
+        # path strings, add to list
+        if convert_polygons_to_paths:
+            pgons = [dom2dict(el) for el in doc.getElementsByTagName('polygon')]
+            d_strings += [polyline2pathd(pg['points']) + 'z' for pg in pgons]
+            attribute_dictionary_list += pgons
+
+        if convert_lines_to_paths:
+            lines = [dom2dict(el) for el in doc.getElementsByTagName('line')]
+            d_strings += [('M' + l['x1'] + ' ' + l['y1'] +
+                           'L' + l['x2'] + ' ' + l['y2']) for l in lines]
+            attribute_dictionary_list += lines
+
+        # if pathless_svg:
+        #     with open(pathless_svg, "wb") as f:
+        #         doc.writexml(f)
+
+        if return_svg_attributes:
+            svg_attributes = dom2dict(doc.getElementsByTagName('svg')[0])
+            doc.unlink()
+            path_list = [parse_path(d) for d in d_strings]
+            return path_list, attribute_dictionary_list, svg_attributes
+        else:
+            doc.unlink()
+            path_list = [parse_path(d) for d in d_strings]
+            return path_list, attribute_dictionary_list
+
+    @property
+    def size(self):
+        """
+        dut size as width, height in millimeters
+        uses the 'bounding_box' region
+        :return: width, height
+        """
+        if self.bounding_box is None:
+            return 0, 0
+        return self.bounding_box[2], self.bounding_box[3]
+
+    @staticmethod
+    def region_to_contour(region, numpoints=100):
+        """
+        Create OpenCV-compatible contour
+        Can be used for region comparison functions in OpenCV
+        Can be used to draw the region to bitmap with OpenCV
+
+        :param region: region to convert
+        :param numpoints: number of points in contour
+        :return: the contour, numpy array of numpy.float32 values
+        """
+        contour = []
+        for t in np.linspace(0.0, 1.0, numpoints):
+            pt = region.point(t)
+            pt = pt.real, pt.imag
+            contour.append(pt)
+        contour = np.array(contour)
+        contour = np.round(contour, 4).astype(np.float32) # conversion a must, otherwise unknown funny type
+        return contour
+
+    def region_str_to_contour(self, region_str):
+        """
+        Create OpenCV-compatible contour for specified region
+        :param region_str: region name as string
+        :return: contour
+        """
+        region = self.region[region_str]
+        return self.region_to_contour(region)
+
+    def filter_points(self, points, region, margin):
+        """
+        Filter list of points that fit inside given region with given margin
+        :param points: list of (x, y) points
+        :param region: region to use
+        :param margin: margin to add inside the region
+        :return: list of points inside the given region
+        """
+        contour = self.region_to_contour(region, 2000)
+        results = []
+        for pt in points:
+            if cv2.pointPolygonTest(contour, tuple(pt), True) >= margin:
+                results.append(pt)
+        return results
+
+    def filter_points_contour(self, points, margin, contour):
+        """
+        Filter points based on the given contour. With this one can save
+        the contour elsewhere and then do the filtering faster
+        :param points: list of points[(x1, y1), (x2, y2),...]
+        :param margin: margin to add inside the region
+        :param contour: OpenCV-compatible contour
+        :return: filtered list of points
+        """
+        results = []
+        for pt in points:
+            if cv2.pointPolygonTest(contour, tuple(pt), True) >= margin:
+                results.append(pt)
+        return results
+
+
+    def filter_points_str_region(self, points, region_str, margin):
+        """
+        Filter list of points that fit inside given region with given margin
+        :param points: list of (x, y) points
+        :param region: name of the region to use
+        :param margin: margin to add inside the region
+        :return: list of points inside the given region
+        """
+        region = self.region[region_str]
+        return self.filter_points(points, region, margin)
+
+
+    def filter_line(self, line, contour, margin):
+        """
+        Filter line and give back pieces that are inside the given region with given margin
+        :param line: (start x, start y, end x, end y)
+        :param contour: contour to use as filter (use region_to_contour to use with regions)
+        :param margin: margin to add inside the contour
+        :return: list of lines inside the given contour after cutting with the given contour.
+        """
+
+        # resolution of the filtering, in millimeters
+        # changing this affects accuracy and speed of the operation
+        mm_resolution = 0.001
+
+        p0 = np.array([line[0], line[1]])
+        p1 = np.array([line[2], line[3]])
+        line_len = np.linalg.norm(p1-p0)
+
+        # line unit vector
+        pv = (p1-p0) / line_len
+
+        pos = 0
+        end_pos = line_len
+
+        lp0 = None
+        lp1 = None
+        lines = []
+        while True:
+            # current point on the line
+            pt = p0 + pos * pv
+            distance_to_shape = cv2.pointPolygonTest(contour, tuple(pt), True)
+            if distance_to_shape >= margin:
+                # we are inside the shape by margin
+                if lp0 is None:
+                    lp0 = pt
+                else:
+                    lp1 = pt
+            else:
+                # we are outside of the shape by margin
+                if lp1 is not None:
+                    lines.append((lp0[0], lp0[1], lp1[0], lp1[1]))
+                lp0 = None
+                lp1 = None
+
+            # it is safe to skip at least to next margin of distance (-mm_resolution, which is added anyways)
+            skip = abs(distance_to_shape) - margin - mm_resolution
+            if skip > 0:
+                pos += skip
+
+            # advance on the line
+            pos += mm_resolution
+
+            if pos > end_pos:
+                break
+
+        # just one more line possible
+        if lp1 is not None:
+            lines.append((lp0[0], lp0[1], lp1[0], lp1[1]))
+        return lines
+
+    def filter_lines(self, lines, region, margin):
+        """
+        Filter list of lines so that only pieces inside the given region are left.
+        :param lines: list of lines [(start x, start y, end x, end y)]
+        :param region: region to use for filtering
+        :param margin: margin to add inside the region
+        :return: list of list of lines. Every given line results as list of (zero or more) lines.
+        """
+        contour = self.region_to_contour(region, 2000)
+        results = []
+        for line in lines:
+            results.append(self.filter_line(line, contour, margin))
+        return results
+
+    def filter_lines_str_region(self, lines, region_str, margin):
+        """
+        Filter list of lines so that only pieces inside the given region are left.
+        :param lines: list of lines [(start x, start y, end x, end y)]
+        :param region: name of the region to use for filtering
+        :param margin: margin to add inside the region
+        :return: list of list of lines. Every given line results as list of (zero or more) lines.
+        """
+        region = self.region[region_str]
+        return self.filter_lines(lines, region, margin)
diff --git a/TPPTAnalysisSW/transform2d.py b/TPPTAnalysisSW/transform2d.py
new file mode 100644
index 0000000..06db5f7
--- /dev/null
+++ b/TPPTAnalysisSW/transform2d.py
@@ -0,0 +1,125 @@
+"""
+A class to represent a transformation between two 2-dimensional coordinate
+   systems. Supports transforming points, calculating the transformation from
+   various formats if input information and combining separate transformations.
+
+Recommended usage is to name transformations by their action, e.g.
+   robot_to_panel = Transform2D(...)
+   my_panel_points = robot_to_panel.transform(my_robot_points)
+
+
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import math
+from collections import Iterable
+
+class Transform2D:
+    '''A transformation between two 2D coordinate systems. Can include
+    translation, rotation and scaling.'''
+    def __init__(self, matrix):
+        '''Initialize the transformation from a 2x3 matrix. Argument must be of
+        form [[x1, x2, x3], [y1, y2, y3]].'''
+        assert len(matrix) == 2 and len(matrix[0]) == 3 and len(matrix[1]) == 3
+        self.matrix = matrix
+    
+    @classmethod
+    def identity(cls):
+        '''Identity transform - does nothing'''
+        return cls([[1, 0, 0], [0, 1, 0]])  
+
+    @classmethod
+    def offset(cls, x, y):
+        '''Translation (i.e. simple move) of the coordinate system.'''
+        return cls([[1, 0, x], [0, 1, y]])
+    
+    @classmethod
+    def scale(cls, scale_x, scale_y):
+        '''Scaling of coordinate axes.'''
+        return cls([[scale_x, 0, 0], [0, scale_y, 0]])
+    
+    @classmethod
+    def rotate_radians(cls, angle):
+        '''Rotate the coordinate system. Positive direction is
+        counter-clockwise. Angle is in radians.'''
+        return cls([[math.cos(angle), -math.sin(angle), 0],
+                    [math.sin(angle), math.cos(angle), 0]])
+    
+    @classmethod
+    def rotate_degrees(cls, angle):
+        '''Rotate the coordinate system. Positive direction is
+        counter-clockwise. Angle is in degrees.'''
+        return cls.rotate_radians(math.radians(angle))
+    
+    def transform(self, points):
+        '''Transform a group of points, or a single point. Argument can be list
+        of tuples [(x,y), (x,y), (x,y)] or a single tuple (x,y).'''
+
+        assert isinstance(points, Iterable)
+
+        # Handle empty list
+        if len(points) == 0:
+            return points
+        
+        if isinstance(points[0], Iterable):
+            return [self.transform(p) for p in points]
+        else:
+            x, y = points
+            x2 = self.matrix[0][0] * x + self.matrix[0][1] * y + self.matrix[0][2]
+            y2 = self.matrix[1][0] * x + self.matrix[1][1] * y + self.matrix[1][2]
+            return (x2, y2)
+    
+    def invert(self):
+        '''Returns the inverse of the transform.'''
+        raise Exception("Inversion not implemented (correctly)")
+        # TODO: The following implementation is broken -> it does not handle correctly the
+        # constant part (tx, ty) -> they cannot be directly copied as it is done here   
+        # p2 = R * p + T  <=>   p = Rinv * p2 - Rinv * T
+        a, b, c, d = self.matrix[0][0], self.matrix[0][1], self.matrix[1][0], self.matrix[1][1]
+        determinant = a * d - b * c
+        if determinant == 0:
+            raise Exception("Transform2D is not invertible!")
+        
+        scale = 1.0 / determinant
+        new_rotation = Transform2D([[d * scale, -b * scale, 0], [-c * scale, a * scale, 0]])
+        tx, ty = new_rotation.transform((self.matrix[0][2], self.matrix[1][2]))
+        new_rotation.matrix[0][2] = -tx
+        new_rotation.matrix[1][2] = -ty
+        return new_rotation
+    
+    def __add__(self, other):
+        # p2 = R1 * p + T
+        # p3 = R2 * p2 + T2
+        # => p3 = R2 * R1 * p + R2 * T + T2
+    
+        assert isinstance(other, Transform2D)
+
+        a1, b1, c1, d1 = self.matrix[0][0], self.matrix[0][1], self.matrix[1][0], self.matrix[1][1]
+        a2, b2, c2, d2 = other.matrix[0][0], other.matrix[0][1], other.matrix[1][0], other.matrix[1][1]
+        tx, ty = other.transform((self.matrix[0][2], self.matrix[1][2]))
+        new = Transform2D([[a1 * a2 + b2 * c1, a2 * b1 + b2 * d1, tx], [c2 * a1 + d2 * c1, c2 * b1 + d2 * d1, ty]])
+        return new
+    
+    def __str__(self):
+        return "Transform2D(" + str(self.matrix) + ")"
+
+
+    
\ No newline at end of file
diff --git a/TPPTAnalysisSW/unittests/__init__.py b/TPPTAnalysisSW/unittests/__init__.py
new file mode 100644
index 0000000..7a1c127
--- /dev/null
+++ b/TPPTAnalysisSW/unittests/__init__.py
@@ -0,0 +1,21 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
\ No newline at end of file
diff --git a/TPPTAnalysisSW/unittests/plotters_test.py b/TPPTAnalysisSW/unittests/plotters_test.py
new file mode 100644
index 0000000..b68d169
--- /dev/null
+++ b/TPPTAnalysisSW/unittests/plotters_test.py
@@ -0,0 +1,143 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import unittest
+import TPPTAnalysisSW.plotters as plotters
+import numpy as np
+import random
+import matplotlib.pyplot as plt
+import os
+from TPPTAnalysisSW.measurementdb import *
+
+class TestEvalFunctions(unittest.TestCase):
+	
+	def test_get_color(self):
+		print(plotters.get_color(1000,0,2550))
+		
+	def test_eval_closest_point(self):
+		linebegin = [0,0]
+		lineend = [5,5]
+		point = [2,1]
+		p,d = plotters.eval_closest_point_at_line(linebegin,lineend,point)
+	def test_panel_to_robot(self):
+		x = 48.0
+		y = 80.0
+		topleftpanel = [0.0,0.0]
+		botrightpanel = [480.0,800.0]
+		topleftrobo = [240.0,400.0]
+		botrightrobo = [0.0,0.0]
+		v1 = plotters.eval_panel_to_robot(x,y,topleftpanel,botrightpanel,topleftrobo,botrightrobo)
+		topleftpanel = [0.0,0.0]
+		botrightpanel = [480.0,800.0]
+		topleftrobo = [250.0,410.0]
+		botrightrobo = [10.0,10.0]
+		v2 = plotters.eval_panel_to_robot(x,y,topleftpanel,botrightpanel,topleftrobo,botrightrobo)
+		v2 = [v2[0]-10.0,v2[1]-10.0]
+		self.assertEqual(v1,v2)
+class TestPlotters(unittest.TestCase):
+
+	def set_up(self):
+		plt.clf()
+	def save(self,file,fig):
+		savepath = os.getcwd()+"/"+file
+		print(savepath)
+		fig.savefig(savepath)
+	def test_plot_offset_line(self):
+		fig = plt.figure()
+		plt.axis('equal')
+		linebegin = [0,0]
+		lineend = [100,100]
+		mpoints = np.arange(0,100,5)
+		mpoints = map(lambda x: [x+(random.random()*5-2.5),x+(random.random()*5-2.5)+5],mpoints)
+		fig = plotters.plot_offset_line(fig,mpoints)
+		
+		plt.axis('equal')
+		linebegin = [0,50]
+		lineend = [100,100]
+		mpoints = np.arange(0,100,5)
+		mpoints = map(lambda x: [x+(random.random()*5-2.5),x+(random.random()*5-2.5)+5],mpoints)
+		fig = plotters.plot_offset_line(fig,mpoints)
+		self.save("test_plot_offset_line.png",fig)
+	def test_single_point_diff(self):
+		fig = plt.figure()
+		plt.axis('equal')
+		linebegin = [0,0]
+		lineend = [5,5]
+		points =[[2,1]]
+		fig = plotters.plot_measurement_line(fig,points,linebegin,lineend)
+		self.save("test_single_point_diff.png",fig)
+	def test_plot_line_diff(self):
+		fig = plt.figure()
+		plt.axis('equal')
+		linebegin = [0,0]
+		lineend = [100,100]
+		mpoints = np.arange(0,100,2)
+		mpoints = map(lambda x: [x+(random.random()*5-2.5),x+(random.random()*5-2.5)],mpoints)
+		fig = plotters.plot_measurement_line(fig,mpoints,linebegin,lineend)
+		self.save("test_plot_line_diff.png",fig)
+	def test_plot_dx_dy_chart(self):
+		fig = plt.figure()
+		plt.axis('equal')
+		plt.grid(True)
+		a= 40
+		b = 20
+		xt,yt = plotters.eval_ellipse_points(np.arange(0,2*np.pi,0.1),a,b,np.pi/3,20,20)
+		measurements = []
+		for i in range(0,len(xt)):
+			measurements.append([xt[i]+(random.random()*5-2.5+0.5),yt[i]+(random.random()*5-2.5+0.5)])
+		delays = [random.random()*20 for i in measurements]
+		plotters.plot_dx_dy_chart(fig,measurements,delays,xt,yt,2.0,params={'errmin' : 0,'errmax' : 20})
+		self.save("test_plot_dx_dy_chart.png",fig)
+	def test_plot_ellipse(self):
+		fig = plt.figure()
+		plt.axis('equal')
+		tarr = np.arange(0,2*np.pi,0.1)
+		a= 40
+		b = 20
+		xt,yt = plotters.eval_ellipse_points(np.arange(0,2*np.pi,0.1),a,b,np.pi/3,20,20)
+		measurements = []
+		for i in range(0,len(xt)):
+			measurements.append([xt[i]+(random.random()*5-2.5),yt[i]+(random.random()*5-2.5)])
+		#print measurements
+		plotters.plot_ellipse_diff(fig,measurements,a,b,np.pi/3,20,20)
+		self.save("test_plot_ellipse.png",fig)
+	def test_plot_jitter(self):
+		mpoints = np.arange(0,100,0.5)
+		mpoints = map(lambda x: [x,x+(random.random()*20.0-10.0)],mpoints)
+		fig = plt.figure()
+		distances,jits,m = plotters.eval_jitter(mpoints,1.0)
+		fig = plotters.plot_jitter_per_distance(fig,distances,jits)
+		self.save("test_plot_jitter_bars.png",fig)
+		fig = plt.figure()
+		fig = plotters.plot_offset_line(fig,mpoints)
+		self.save("test_plot_jitter_line.png",fig)
+	def test_plot_p2p_measurements(self):
+		xlen = 400
+		ylen = 400
+		mpoints = [[random.random()*xlen,random.random()*ylen] for i in range(0,400)]
+		rpoints = [[i[0]+5,i[1]+5]for i in mpoints]
+		delays = [random.random()*20 for i in mpoints]
+		fig = plt.figure()
+		fig = plotters.plot_p2p_measurements(fig,mpoints,rpoints,delays)
+		self.save("test_plot_p2p_measurements.png",fig)
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
diff --git a/TPPTAnalysisSW/unittests/tests_test.py b/TPPTAnalysisSW/unittests/tests_test.py
new file mode 100644
index 0000000..e187b3d
--- /dev/null
+++ b/TPPTAnalysisSW/unittests/tests_test.py
@@ -0,0 +1,79 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+# Test class for testing test generation (phew...)
+
+import unittest
+import time
+import re
+
+# Report generation time threshold for acceptance
+_report_time_threshold = 1.0
+
+def setUpModule():
+    import start_webserver
+
+class ReportTest(unittest.TestCase):
+    
+    # addTestId - runTest pattern enables us to read test id's from database
+    # and run each test id as a separate test
+    @staticmethod
+    def addTestId(test_id):
+        def subtest(self):
+            self.runTest(test_id)
+        
+        test_method = "test_testid_%s" % test_id
+        setattr(ReportTest, test_method, subtest)
+        return test_method
+
+    def runTest(self, test_id):
+        import start_webserver
+        #print "Test id %s" % test_id
+        start = time.clock()
+        html = start_webserver.root.tests.GET(test_id)
+        end = time.clock()
+        self.assertLessEqual(end-start, _report_time_threshold, "The execution of report took too long: %.1f seconds" % (end-start))
+
+        if ReportTest.check_images:
+            images = re.findall('/img/.*?\.png', html)
+            for image in images:
+                # Strip /img/ from the start
+                name = image[5:]
+                #print "Test id %s - image %s" % (test_id, name)
+                start_webserver.root.img.GET(name)
+
+def suite(check_images=False):
+    import measurementdb
+    dbsession = measurementdb.get_database().session()
+    test_ids = dbsession.query(measurementdb.TestItem).order_by(measurementdb.TestItem.id).\
+                                                       values(measurementdb.TestItem.id)
+
+    ReportTest.check_images = check_images
+
+    tests = []
+    for test_id in test_ids:
+        tests.append(ReportTest.addTestId(str(test_id[0])))
+
+    suite = unittest.TestSuite()
+    for test in tests:
+        suite.addTest(ReportTest(test))
+    return suite
diff --git a/TPPTAnalysisSW/unittests/verdicts_test.py b/TPPTAnalysisSW/unittests/verdicts_test.py
new file mode 100644
index 0000000..9a0fb2e
--- /dev/null
+++ b/TPPTAnalysisSW/unittests/verdicts_test.py
@@ -0,0 +1,72 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+# Test class for testing test generation (phew...)
+
+import unittest
+import testbase
+import time
+
+# Result generation time threshold for acceptance
+# Analysis should run in 500 ms
+_report_time_threshold = 0.5
+
+def setUpModule():
+    import start_webserver
+
+class VerdictTest(unittest.TestCase):
+    
+    # addTestId - runTest pattern enables us to read test id's from database
+    # and run each test id as a separate test
+    @staticmethod
+    def addTestId(test_id):
+        def subtest(self):
+            self.runTest(test_id)
+        
+        test_method = "test_testid_%s" % test_id
+        setattr(VerdictTest, test_method, subtest)
+        return test_method
+
+    def runTest(self, test_id):
+        import testbase
+        testclass = testbase.TestBase.create(test_id)
+        self.assertIsNotNone(testclass, "None testclass for test id %s" % str(test_id))
+        start = time.clock()
+        verdict = testclass.runanalysis()       
+        end = time.clock()
+        self.assertIn(verdict, ["Pass", "Fail", "N/A"], "Invalid response for test id %s: %s" % (test_id, verdict))
+        self.assertLessEqual(end-start, _report_time_threshold, "The execution of verdict took too long: %.1f seconds" % (end-start))
+
+def suite():
+    import measurementdb
+    dbsession = measurementdb.get_database().session()
+    test_ids = dbsession.query(measurementdb.TestItem).order_by(measurementdb.TestItem.id).\
+                                                       values(measurementdb.TestItem.id)
+
+    tests = []
+    for test_id in test_ids:
+        tests.append(VerdictTest.addTestId(str(test_id[0])))
+
+    suite = unittest.TestSuite()
+    for test in tests:
+        suite.addTest(VerdictTest(test))
+    return suite
diff --git a/TPPTAnalysisSW/unittests_run.py b/TPPTAnalysisSW/unittests_run.py
new file mode 100644
index 0000000..7fd0a12
--- /dev/null
+++ b/TPPTAnalysisSW/unittests_run.py
@@ -0,0 +1,32 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+import unittest
+import TPPTAnalysisSW.unittests as unittests
+
+if __name__ == '__main__':
+    print "Running analysis verdicts test"
+    tests = unittests.verdicts_test.suite()
+    unittest.TextTestRunner().run(tests)
+    print "Running test report generation test"
+    tests = unittests.tests_test.suite(check_images=True)
+    unittest.TextTestRunner().run(tests)
diff --git a/TPPTAnalysisSW/utils.py b/TPPTAnalysisSW/utils.py
new file mode 100644
index 0000000..56103f9
--- /dev/null
+++ b/TPPTAnalysisSW/utils.py
@@ -0,0 +1,46 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from datetime import datetime
+
+import TPPTAnalysisSW.settings as settings
+
+
+class Timer(object):
+    """ Timer object that can be used for performance timing """
+
+    do_timing = False
+
+    def __init__(self, level=1, *args, **kwargs):
+        """ Initialize timer and start timing. """
+        result = super(Timer, self).__init__(*args, **kwargs)
+        if self.do_timing:
+            self.start = datetime.now()
+            self.level = level
+        return result
+
+    def Time(self, string):
+        """ Print out string and elapsed time """
+        if self.do_timing:
+            print(">>>" + str(self.level) + " " + str(string) + " " + str(datetime.now() - self.start))
+
+
diff --git a/dbconfig.yaml b/dbconfig.yaml
new file mode 100644
index 0000000..a2cb3db
--- /dev/null
+++ b/dbconfig.yaml
@@ -0,0 +1,8 @@
+database_enabled: True
+# database_enabled: False
+database_engine: mysql+pymysql
+host_name: 35.226.32.149
+port: 3306
+user_name: test
+password: test
+database: test
\ No newline at end of file
diff --git a/dry_run_doc.md b/dry_run_doc.md
new file mode 100644
index 0000000..0ad8075
--- /dev/null
+++ b/dry_run_doc.md
@@ -0,0 +1,58 @@
+# TPPT dry run
+
+## General
+
+This is documentation for running TPPT Analysis in dry run environment which basically just means running the software in source code form in Python interpreter.
+
+## Setup
+
+The dry run environment is delivered in source form and is hence not directly executable. Python needs to be installed on the system and the system needs to have internet access to access the general pypi server.
+
+### Windows
+
+Install Python 3.5.1 32-bit. Other versions might also work but have not been tested.
+
+To set things up, open console (cmd.exe) in TPPT Analysis root directory. Then type
+
+    py -3.5-32 -m venv venv
+
+This will create a Python virtual environment in local directory `venv`.
+
+Then type following
+
+    venv\Scripts\Activate.bat
+    python -m pip install --upgrade pip
+    pip install -r requirements.txt
+
+Now the virtual environment is setup for running TPPT Analysis.
+
+### Linux
+
+Install Python 3.6.8. This seems to be installed by default in Ubuntu 18.04 LTS. Install `venv` and `pip`:
+
+sudo apt install python3-venv
+sudo apt install python3-pip
+
+To set things up, open terminal in TPPT Analysis root directory. Then type
+
+    python3 -m venv venv
+
+This will create a Python virtual environment in local directory `venv`.
+
+Then type following
+
+    source venv/bin/activate
+    python -m pip install --upgrade pip
+    pip install -r requirements.txt
+
+Now the virtual environment is setup for running TPPT Analysis.
+
+## running TPPT Analysis
+
+Open terminal in TPPT Analysis root directory and activate the Python virtual environment. Then execute commmand
+
+    python main.py --database=/home/foo/tppt/database.sqlite --config=/home/foo/tppt/config.json
+
+Change the command line parameters to point to the correct TPPT script directory.
+
+TPPT Analysis software is used in dry run environment the same as in real TnT environment.
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..61367b7
--- /dev/null
+++ b/main.py
@@ -0,0 +1,55 @@
+"""
+Copyright (c) 2019, OptoFidelity OY
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the OptoFidelity OY.
+    4. Neither the name of the OptoFidelity OY nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+import TPPTAnalysisSW.start_webserver as start_webserver
+import argparse
+from inspect import getsourcefile
+from os import chdir
+from os.path import realpath, join, dirname
+import TPPTAnalysisSW.sqluploader as sqluploader
+
+# Change current working directory to ./TPPTAnalysisSW to allow launching from main.py without changing all the
+# relative paths currently in the codebase
+basedir = dirname(realpath(getsourcefile(lambda: 0)))
+chdir(join(basedir, "TPPTAnalysisSW"))
+
+
+if __name__ == '__main__':
+    print('Starting TPPT Analysis...')
+    # Address must be localhost not e.g. '127.0.0.1'.
+    address = 'localhost'
+    port = 8081
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--check', action='store_true', default=False, help='Startup check for CI usage')
+    parser.add_argument('--database', type=str, default='C:/OptoFidelity/TPPT/database.sqlite',
+                        help='Path to used database file')
+    parser.add_argument('--config', type=str, default='C:/OptoFidelity/TPPT/config.json',
+                        help='Path to used configuration file')
+    parser.add_argument('--dbconfig', type=str, default='C:/OptoFidelity/TPPT Analysis/dbconfig.yaml',
+                        help='Path to database configuration file')
+    args = parser.parse_args()
+
+    if not args.check:
+        # Comment this out to disable the possibility to upload results to SQL database.
+        sqluploader.initialize(args.dbconfig)
+
+        start_webserver.start(address, port)
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..ca6caca
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,17 @@
+# Running setup.py and creation of installer
+PyInstaller==3.2.1
+wheel==0.29.0
+
+# Testing
+pytest==3.1.1
+
+genshi==0.7.2
+sqlalchemy==1.3.3
+pymysql==0.9.3
+numpy==1.15.4
+matplotlib==2.2.3
+cherrypy==18.1.1
+ruamel.yaml==0.15.18
+svgpathtools==1.3.3
+opencv-python==3.4.3.18
+tornado==6.0.3
\ No newline at end of file
